js currying函数示例

时间:2017-10-14 13:39:00

标签: javascript currying

如何理解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);

1 个答案:

答案 0 :(得分:1)

currying函数,并获取一个函数作为参数,并返回一个新函数,在调用时:

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

因此,如果我们查看此调用例如:newSum(1)(2)(3)(4)() - 有5个函数调用:

  • 使用newSum致电1。通过积累1获得咖喱功能。
  • 使用2调用curried函数 - 使用1和2累加相同的函数,依此类推3和4。
  • 不带参数调用curried函数 - 将所有累积的参数(1,2,3,4)应用于原始sum函数 - 并获取正确的值,10。

关于[].push.apply(args, arguments);fn.apply(this, args);applyFunction.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