2017-10-14 52 views
0

如何理解currying的功能?js currying功能示例

newSumnewFind如何工作?

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

你在哪里得到这个代码?你究竟有什么不明白/需要澄清? (在https://stackoverflow.com/q/46742196/6567275后) – Thomas

+0

'[] .push.apply(args,arguments);'基本上'为(var i = 0; i Thomas

回答

1

currying功能,并得到一个函数作为参数,并返回一个新的函数,调用时:

  • 如果提供参数,它们堆积在args数组
  • 如果未提供参数,则会使用所有累加的参数调用原始函数。

所以,如果我们看一下这个调用,例如:newSum(1)(2)(3)(4)() - 有5个的函数调用:

  • 调用newSum1。获得1的累积咖喱功能。
  • 使用2调用curried函数 - 获取与1和2相同的函数累积,依此类推3和4.
  • 不带参数调用curried函数 - 应用所有累加的参数(1,2,3, 4)到原始sum功能 - 和获得正确的值,10

关于和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