《JavaScript高级程序设计》第22章关于函数柯里化的理解
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=curry(add,5);
alert(curriedAdd(3))//8
var curriedAdd2=curry(add,5,12);
alert(curreidAdd2());//17
首先理解第一句:
var args=Array.prototype.slice.call(arguments,1);
Array对象是用于构造数组的全局对象,slice 方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组。你只需将该方法绑定到这个对象上。 一个函数中的 arguments 就是一个类数组对象的例子。除了用 Array.prototype.slice.call(arguments),也可以简单的使用 [].slice.call(arguments) 来代替。
所以这句话的意思就是把传入curry的参数从第二个开始复制到变量args里,例如curry(add,5,12),这时args里面就保存[5,12],去掉了add函数这个参数。
var innerArgs=Array.prototype.slice.call(arguments);
这句话的意思和上一句差不多,只是此时调用slice,不传入任何参数,所以默认传入第一个参数为0,若
var curriedAdd=curry(add,5);因此变量innerArgs中保存的是curriedAdd(3)传入的参数[3]
var finalArgs=args.concat(innerArgs);
return fn.apply(null,finalArgs);
finnalArgs等于args和innerArgs拼接后的值,而后的apply方法中第一个参数为null,代表fn作用域指向window(在nodejs环境中指向global).