【问题标题】:Can someone explain x and y in this "function factory"? [duplicate]有人可以在这个“功能工厂”中解释 x 和 y 吗? [复制]
【发布时间】:2018-02-07 02:19:30
【问题描述】:

来自this documentation 闭包:

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2));  // 7
console.log(add10(2)); // 12

我不明白makeAdder(5) 中的参数是如何作为x 接收的,但在add5(2) 中是y

我希望它两次都说y is undefined。谁能解释一下它是如何工作的?

【问题讨论】:

  • 我刚刚意识到它可以被称为 makeAdder(5)(2) 这现在是有道理的,但我会留下这个问题,以防有人可以为未来的用户解释它。
  • 这也称为柯里化。可以在这里找到完全相同的代码:stackoverflow.com/questions/36314/what-is-currying
  • 这是另一个重复的问题...
  • @Endless 然后用指向另一个问题的链接标记它?
  • 这不可能是重复的问题。即使我发现了这一点,也只会让我更加困惑。它更复杂,并且引用了这里甚至没有提到的第三方库和范例(箭头函数)。

标签: javascript functional-programming currying


【解决方案1】:

当您调用makeAdder() 时,它会返回一个函数(不是一个值)。因此,要使用它,您将拥有类似

makeAdder(4)(5)

这会将 4 添加到 5 并返回 9。同样,makeAdder() 这里返回另一个函数,这就是为什么我在它之后调用一个参数 ((5))。

如果您想进一步阅读,这是 JavaScript 中的一个概念,称为柯里化。这是一种函数式编程技术。

【讨论】:

  • 每个人对事物的理解都不一样,但这是我理解的唯一解释。谢谢!
  • 很高兴听到这个消息。非常感谢。
【解决方案2】:

当调用add5 = makeAdder(5); 时,基本上发生的事情是:

add5 = function(y){
    return 5 + y;
}

此时add5(y)会给你y + 5

正如您从评论中注意到的那样,您可以使用makeAdder(x)(y),这基本上做同样的事情,归结为:

(function(y){return x + y})(y);

【讨论】:

    【解决方案3】:

    makeAdder 接受一个参数x返回一个函数,该函数可以看到x(谷歌:“closure”),也接受它自己的参数y。 p>

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2019-10-24
      • 1970-01-01
      • 2014-05-30
      • 2011-02-01
      相关资源
      最近更新 更多