下面的柯里化函数不太理解,为什么可以实现fn(1, 2, 3, 4) => fn(1)(2)(3)(4)()这样类似的柯里化转化?可以详细解释一下吗?// 柯里化 wrappervar currying = function(fn){ var args = []; return function(){ if(!!arguments.length) { [].push.apply(args, arguments); return arguments.callee; } else { return fn.apply(this, args); } }}// 累加var sum = (function(num){ var ret = 0; return function(){ for(var i = 0, len = arguments.length; i < len; i++) { ret += arguments[i]; } return ret; }})(); var newSum = currying(sum);newSum(1)(2)(3)(4)() // 10、// 查询数组中是否存在某个值var find = function(arr, el){ return arr.indexOf(el) !== -1;}var newFind = currying(find)(arr);newFind(1);newFind(2);
1 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
使用了闭包的特性,args用于保存每次调用是传入的参数, arguments.callee就是currying
每次传入参数时保存在args数组里面,并返回一个函数(就是函数自己currying),因此才可以继续调用;当没有参数传入时,则执行fn
// 柯里化 wrapper
var currying = function(fn){
var args = [];
return function(){
if(!!arguments.length) {
// 将传入的参数push进args变量
[].push.apply(args, arguments);
// 传入一个参数时,返回一个函数
return arguments.callee;
} else {
// 没有传入参数时执行fn
return fn.apply(this, args);
}
}
}
添加回答
举报
0/150
提交
取消
