柯里化函数通常由以下步骤动态创建:调用另一个函数并为它传入要柯里化的函数和必要参数。下面是创建柯里化函数的通用方式:

function curry(fn){
    var args=Array.prototype.slice.call(arguments,1);
    return function(){
        var innerArgs=Array.prototype.slice.call(arguments);
        var finalArgs=args.concat(innerArgs);
        return fn.apply(null,finalArgs);
    }
}
curry()函数的主要工作就是将被返回函数的参数进行排序。curry()的第一个参数是要进行柯里化的函数,其他参数是要传入的值。为了获取第一个参数之后的所有参数,在arguments对象上调用了slice()方法,并传入参数1表示被返回的数组第一个元素应该是第二个参数。然后args数组包含了来自外部函数的参数。在内部函数中,创建了innerArgs数组用来存放所有传入的参数。有了存放来自外部函数和内部函数的参数数组后,就可以使用concat()方法将它们组合为finalArgs,然后使用apply()将结果传递给该函数。注意这个函数并没有考虑到执行环境,所以调用apply()时第一个参数是null。curry()函数可以按以下方式应用:
function add(num1,num2){
    return num1+num2;
}
var curriedAdd=curry(add,5);
alert(curriedAdd(3));//result is 8
在这个例子中,创建了第一个参数绑定为5的柯里化版本,当调用curriedAdd()并传入3时,3会成为Add()的第二个参数,同时第一个参数依然是5,最后结果便是8.你也可以像下面例子这样给出所有的函数参数:
function add(num1,num2){
    return num1+num2;
}
var curriedAdd=curry(add,5,12);
alert(curriedAdd());//result is 17
在这里,柯里化的add()函数两个参数都提供了,所以以后就无需再传递它们了。
函数柯里化还常常作为函数绑定的一部分包含在其中,构造出更为复杂的bind()函数。例如:
function bind(fn,context){
    var args=Array.prototype.slice.call(arguments,2);
    return function(){
        var innerArgs=Array.prototype.slice.call(arguments);
        var finalArgs=args.concat(innerArgs);
        return fn.apply(context,finalArgs);
    }
}
对curry()函数的主要更改在于传入的参数个数,以及它如何影响代码的结果。curry()仅仅接受一个要包裹的函数作为参数,而bind()同时接受函数和一个object对象,这表示给被绑定的函数的参数是从第三个开始而不是第二个,这就要更改slice()的第一处调用。另一处更改是在倒数第3行将object对象传给apply()。当使用bind()时,它会返回绑定到给定环境的函数,并且可能它其中某些函数参数已经被设好。当你想除了event对象再额外给事件处理程序传递参数时,这非常有用,例如:
var handler={
    message:"Event handled",
    handleClick:function(name,event){
        alert(this.message+":"+name+":"+event.type);
    }
}
var btn=document.getElementById("my-btn");
EventUtil.addHandler(btn,"click",bind(handler.handleClick,handler,"my-btn"));
在这个更新过的例子中,handler.handleClick()方法接受了两个参数;要处理的元素名字和evnet对象。作为第三个参数传递给bind()函数的名字,又被传递给了handler.handleClick(),而handler handle Click()也会同时接收到event对象。
JS中的柯里化函数和绑定函数提供了强大的动态函数创建功能。使用bind()还是curry()要根据是否需要object对象响应来决定。它们都能用于创建复杂的算法和功能,当然两者都不应滥用,因为每个函数都会带来额外的开销。