【问题标题】:How does "makeAddFunction" in Eloquent JS work?Eloquent JS 中的“makeAddFunction”是如何工作的?
【发布时间】:2013-11-05 18:43:53
【问题描述】:

我正在尝试通过阅读Eloquent Javacript 来学习 Javascript。我在chapter dealing with functions 上,我一直在试图弄清楚下面的代码是如何工作的。我看不到 add 函数是如何被调用的。我看到他们调用 addTwo 和 addFive 但这些名称与 add 不同。此代码运行的结果是 9。有人可以向我解释一下吗?

 function makeAddFunction(amount) {

     function add(number) {

         return number + amount;
     }

     return add;
 }

 var addTwo = makeAddFunction(2);

 var addFive = makeAddFunction(5);

 show(addTwo(1) + addFive(1));

【问题讨论】:

标签: javascript


【解决方案1】:

makeAddFunction 中,创建了一个名为add 的函数。返回此函数。

makeAddFunction 使用 2 个不同的参数调用两次,并存储在两个变量中,addTwoaddFive

调用addTwo()addFive()是调用add()创建的函数,“数量”分别为2和5。

addTwo(1) + addFive(1) == (1 + 2) + (1 + 5) == 9

有时这些类型的“闭包”被称为建造者或工厂。 makeAddFunction 根据您传递给makeAddFunction 的参数“构建”add 的特殊版本。

addTwo 函数如下所示:

function addTwo(number) {
    return number + 2;
}

【讨论】:

  • “间接”可能是糟糕的词选择。
  • 这并没有解释代码是如何工作的。它只是将代码翻译成英文。
  • 一般解释代码涉及到以合乎逻辑的方式将其翻译成英文...
  • 我可以看到它们是如何到达数字 9 的,但我仍然不明白 addTwo 和 addFive 如何将值 1 传递给 add 函数。我什至不确定我的解释是否正确,以便您理解我不理解的内容。
  • 例如:当他们说 var addTwo = makeAddFunction(2);我可以看到值 2 被设置为参数“amount”,因为他们用正确的名称调用函数,即 makeAddFunction。我不明白如何将值 1 设置为 show(addTwo(1) + addFive(1)); 中的参数“数字”。因为这个函数叫add,所以不叫addTwo或者addFive?
【解决方案2】:

makeAddFunction 创建一个闭包,将 amount 设置为您传入的任何数字,并返回一个函数,该函数将该数量添加到您传递给新函数的任何数字上并返回。

【讨论】:

    【解决方案3】:

    我最好的建议是你尝试学习一些关于 Javascript 闭包的知识。真的。我可能不是您正在寻找的答案,但如果您想了解那里发生的事情,这是您能做的最好的事情。

    为自己准备一本任何好的 javascript 书籍。让我推荐 Douglas Crockford 的“Javascript - The Good Parts”。

    对于我们中的一些人来说,Javascript 闭包并不是我们摸不着头脑的东西。我希望这对你来说更容易。

    不管怎样,makeAddFunction是一个函数创建者。它会创建与您传递给makeAddFunction 的参数相关联的新函数。因此,addTwo 变量接收并存储一个新函数,您可以稍后通过在其上附加括号来调用该函数,即addTwo()

    你传递给addTwo的参数,即1在调用addTwo(1)时被传递给add函数,因为addTwo只不过是一个add函数,其中amount var有2 的固定值。

    【讨论】:

      【解决方案4】:

      var addTwo = makeAddFunction(2);

      当您最初调用makeAddFunction(2) 时,amount 变量在其函数范围内,add 可以看到它。 addTwo 现在设置为 add 函数,makeAddFunction(2) 返回。

      addTwo(1)

      记住addTwo 现在设置为makeAddFunction(2) 返回的值,即函数add,并且amountmakeAddFunction(2) 的范围内设置为2。 add 只返回它的参数 (1),加上 makeAddFunction(2) 范围内的 amount (2)。

      addFive(5) 也是如此。

      Javascript Ninja 或 The Good Parts 是详细解释闭包的好读物。我强烈建议拿起那些。

      【讨论】:

        【解决方案5】:

        按照右侧的 SO 链接/相关问题。无论如何..

        这是文章的解释,尽管有很多绒毛。无论如何,这里有一个“带注释”的版本:

        .. 函数 [do] 不仅仅是打包 [一些要运行的代码],还打包了一个环境。 [..] 在另一个函数内部定义的函数保留在 [内部函数] 被定义时存在于 [外部函数] 中的 [对词法变量(如“数量”)] 的访问。

        因此,上例中的 [inner] add 函数是在调用 makeAddFunction 时创建的,它捕获了一个环境 [包括外部函数的“amount”变量]。它将这个环境连同 [要运行的代码] 打包成一个值 [(说函数只是对象的一种奇特方式)],然后从外部函数返回。

        当这个返回的函数([已分配给]addTwoaddFive)被调用时,[被调用的函数可以访问]捕获的环境([和仍然包含值的“数量”变量最初传递给makeAddFunction])。然后将这两个值([当前由]“数量”和“数字”命名)相加,并返回结果。

        我没有找到“值”的原始用法,并且已经很好地编辑了这些部分 - 在 JavaScript 中,变量(不是)绑定在闭包中.

        【讨论】:

          【解决方案6】:

          Javascript 非常依赖高阶函数。函数可以返回,分配给变量,并作为值传递。这在很多情况下都派上用场,尤其是在处理事件编程时(JS 的直接血统来自其在浏览器中最多产的实现。)

          http://en.wikipedia.org/wiki/Higher-order_function

          你看到的是一个创建函数的函数。它可以被认为是具有一个预设参数的函数的“工厂”。

          【讨论】:

          • 函数不返回闭包。它创造了它。 (而且我不是反对者)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-13
          • 2011-12-19
          • 1970-01-01
          • 2015-02-15
          • 1970-01-01
          相关资源
          最近更新 更多