函数柯里化与函数绑定密切相关,它用于创建已经设置好了一个或多个参数的函数。
基本方法和函数绑定一样:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。
function add(num1, num2){
return num1 + num2;
}
function curriedAdd(num2){
return add(5, num2);
}
alert(add(2, 3)); // 5
alert(curriedAdd(3)); // 8
尽管curriedAdd()并非柯里化函数,但它很好地展示了其概念。
柯里化函数通常由以下步骤动态创建:调用另一个函数并为它传入要柯里化的函数和必要参数。
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);
};
}
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curr(add, 5);
alert(curriedAdd(3)); // 8
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curry(add, 5, 12);
alert(curriedAdd()); // 17
curry()函数的主要工作就是将返回函数的参数进行排序。
curry()的第一个参数是要进行柯里化的函数,其他参数是要传入的值
函数柯里化还常常作为函数绑定的一部分包含在其中,构造出更为复杂的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);
};
}