如何理解currying
功能?
newSum
和newFind
如何运作?
var currying = function(fn) {
var args = [];
return function() {
if (!!arguments.length) {
[].push.apply(args, arguments); // What's the meaning of this writing?
return arguments.callee;
} else {
return fn.apply(this, args);
}
}
}
// accumulation currying
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
// element find currying
var find = function(arr, el){
return arr.indexOf(el) !== -1;
}
var newFind = currying(find)([1,2,3]);
newFind(1);
newFind(2);
答案 0 :(得分:1)
currying
函数,并获取一个函数作为参数,并返回一个新函数,在调用时:
args
数组因此,如果我们查看此调用例如:newSum(1)(2)(3)(4)()
- 有5个函数调用:
newSum
致电1
。通过积累1获得咖喱功能。sum
函数 - 并获取正确的值,10。关于[].push.apply(args, arguments);
和fn.apply(this, args);
:apply
是Function.prototype
上的一种方法,它基本上允许您调用函数,提供上下文对象和参数数组。所以基本上[].push.apply(...)
是一个将数组连接到另一个数组的技巧,在我们的例子中,concat arguments
(这是调用时提供给函数的参数列表)到args
(累积参数列表)。 fn.apply(this, args);
只是用所有累积的参数调用原始函数。您可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
顺便说一下,newFind(1);
和newFind(2);
都会返回一个函数,只有在调用时才会查找元素的索引,这意味着newFind(1)() === true