function curry(fn) {
var args = [],
n = fn.length,
g = 10;
return function core(g) {
var arg = [].slice.call(arguments);
args = args.concat(arg);
n -= arg.length;
return n === 0 ? fn.apply(null, args) : core;
}
}
var add4 = curry(function (a, b, c, d) {
return a + b + c + d;
});
console.log(add4(1, 2)(2)(3));
比如执行add4(1,2),到var arg = [].slice.call(arguments);
这时arguments=[1,2]
,core函数里也传了g
,为什么g
不在arguments
里呢?
刚开始我还以为这个回调函数里的arguments
装的是add4(1,2)
而不是[1,2]...
执行
add4(1,2)
的时候,core 中的g = 1
,这里的 g 就是 add4 中传入的第一个参数 1,如果你想要等于 10 的那个 g,应该删掉这个参数 g,否则在因为已经找到变量为 g 的参数,就不会在去作用域链上去找 g 也就是等于 10 的那个 g 了.