2017-10-14 60 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