如何理解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);
发布于 2017-10-14 22:48:12
currying函数,获取一个函数作为参数,并返回一个新函数,当调用该函数时:
args数组中所以,如果我们看一下这个调用的例子:newSum(1)(2)(3)(4)() -有5次函数调用:
1调用newSum。获取带有1的curried函数accumulated.sum函数-并获得正确的值,10.关于[].push.apply(args, arguments);和fn.apply(this, args);:apply是Function.prototype上的一个方法,它基本上允许你调用一个函数,提供一个上下文对象和一个参数数组。因此,[].push.apply(...)基本上是将一个数组连接到另一个数组的技巧,在我们的例子中,将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
https://stackoverflow.com/questions/46745206
复制相似问题