首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >js currying函数示例

js currying函数示例
EN

Stack Overflow用户
提问于 2017-10-14 21:39:00
回答 1查看 206关注 0票数 0

如何理解currying函数?

newSumnewFind是如何工作的?

代码语言:javascript
复制
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);

EN

回答 1

Stack Overflow用户

发布于 2017-10-14 22:48:12

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

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

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

  • 使用1调用newSum。获取带有1的curried函数accumulated.
  • Calling带有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(...)基本上是将一个数组连接到另一个数组的技巧,在我们的例子中,将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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46745206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档