什么是柯里化?
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换
成接受一个单一参数(最初函数的第一个参数)的函数,
并且返回接受余下的参数且返回结果的新函数的技术。
函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。
function curry(fn, args) {
var length = fn.length;
var args = args || [];
return function(){
newArgs = args.concat(Array.prototype.slice.call(arguments));
if (newArgs.length < length) {
return curry.call(this,fn,newArgs);
}else{
return fn.apply(this,newArgs);
}
}
}
function multiFn(a, b, c) {
return a * b * c;
}
var multi = curry(multiFn);
console.log(multi(2)(3)(4)); //24
console.log(multi(2,3,4)); //24
console.log(multi(2)(3,4)); //24
console.log(multi(2,3)(4)); //24
细节解释:
1.fn.length =》
每个函数都有一个 length属性 (函数名.length), 表示期望接收的函数的个数(而不是实际接收的参数个数)
(它与arguments不同。 arguments.length 是表示函数实际接收的参数个数。)
arguments也是每个函数都有的一个属性。
参考链接:https://www.cnblogs.com/dubaokun/p/3603833.html
2.Array.prototype.slice.call(arguments) =》
其实本质就是arguments这个对象使用了数组的slice这个方法,得到了参数构成的数组(也可以用apply)。
参考链接:https://www.cnblogs.com/papi/p/9234964.html
3.args.concat =》
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
4.if (newArgs.length < length) =》
结合上下文,意思是如果得到的参数,少于该函数本身期待的参数
5.return curry.call(this,fn,newArgs); =》
这行代码意思是,curry方法再执行一次,传入参数fn,newArgs,并且把curry方法的this改变为
return function(){xxx}
参考链接:https://uule.iteye.com/blog/1158829
6.return fn.apply(this,newArgs);
apply方法,类似call方法,接受的是参数数组
结合上下文,如果得到的参数,等于或多于该函数本身期待的参数,执行传入的方法