我试图长时间理解此代码,我知道递归函数,但与该代码混淆,请在后面解释一下理论
var currying = function(fn) {
var args = [];
return function() {
if (!!arguments.length){
[].push.apply(args, arguments);
return arguments.callee;
} else {
// what is 'this' in apply method
return fn.apply(this, args);
}
}
}
// currying var or args
// please explain the code below
var find = function(arr, el){
return arr.indexOf(el) !== -1;
}
var newFind = currying(find)([1,2,3]);
console.log( newFind(1)());
console.log( newFind(2)());
最佳答案
为了便于解释,让我们转换代码的最后一部分:
// newFind = currying(find)([1,2,3]);
// console.log(newFind(1)());
// above is the same with below
console.log( currying(find)([1,2,3])(1)());
currying
具有函数find
,因此fn
中的currying
是find
。当它返回一个函数时,可以按代码
currying(find)([1,2,3])
所示调用它让我们看看这部分,
currying(find)([1,2,3])
。它执行
currying
的返回方法。它可以访问关键字arguments
的参数,该关键字是代码上[1,2,3]
的数组。参数是数组,这意味着它具有长度值。然后将参数推入
args
数组并返回其被调用者,这意味着currying
的内部方法。当它再次返回方法时,可以用
(1)
的下一个参数currying(find)([1,2,3])(1)()
再次调用它。同样,它使用参数:
currying
执行1
的内部方法。然后它不是数组,因此它调用fn.apply(this, args)
。在这种情况下,代码中的
this
关键字没有任何意义。您可以将this
替换为null
,也可以使用fn(...args)
。该代码用于将参数数组转换为每个参数。例如[[1,2,3], 1]
转换为[1,2,3], 1
然后,最后它使用参数
find
,[1,2,3]
执行1
函数。您应该记住所有这些都是来自currying
的返回方法,因此,您必须将其作为函数调用。在末尾附加()
以执行该功能。