Eloquent JS中的“makeAddFunction”如何工作?

时间:2013-11-05 18:43:53

标签: javascript

我正在尝试通过阅读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));

6 个答案:

答案 0 :(得分:1)

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

使用2个不同的参数调用

makeAddFunction两次,并将其存储在两个变量addTwoaddFive中。

致电addTwo()addFive()正在调用由add()创建的功能,并使用"金额"分别为2和5。

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

有时这些类型的'关闭'被称为建筑商或工厂。 makeAddFunction'构建'基于您传递给add的参数的makeAddFunction的特殊版本。

addTwo函数看起来像:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

这篇文章对此进行了解释,尽管有很多毛病。无论如何,这里有一点点绒毛切割是一个“注释”版本:

  

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

     

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

     

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

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

答案 3 :(得分:0)

我最好的建议是你尝试学习一下Javascript闭包。真。我可能不是你想要的答案,但如果你想了解那里发生的事情,这是你能做的最好的事情。

获取任何好的javascript书的副本。让我建议Douglas Crockford撰写的“Javascript - The Good Parts”。

对于我们中的一些人来说,Javascript关闭不是我们理解的东西。我希望你更容易。

无论如何,makeAddFunction是一个功能创建者。它创建了与传递给makeAddFunction的参数相关联的新函数。因此,addTwo变量接收并存储一个新函数,稍后您可以通过附加括号来调用它,即addTwo()

您传递给addTwo的参数,即调用1上的addTwo(1)传递给add函数,因为addTwo只不过是add {1}} amount var的修正值为2的函数。

答案 4 :(得分:0)

var addTwo = makeAddFunction(2);

最初调用makeAddFunction(2)时,amount var在其add可以看到的函数范围内。 addTwo现已设置为add返回的makeAddFunction(2)函数。

addTwo(1)

请记住,addTwo现已设置为makeAddFunction(2)返回的内容,即add函数,amountmakeAddFunction(2)范围内设置为2 。 add只返回其参数(1),以及amount范围内的makeAddFunction(2)(2)。

addFive(5)也是如此。

Javascript Ninja或Good Parts是很好的读取,可以详细解释闭包。我强烈建议你接受这些。

答案 5 :(得分:-1)

Javascript在很大程度上依赖于高阶函数。函数可以返回,分配给变量,并作为值传递。这在很多情况下都很方便,特别是在处理事件编程时(JS从浏览器中最多产的实现直接传承。)

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

您所看到的是一个创建功能的功能。对于具有一个预设参数的函数,它可以被视为“工厂”。