1

我正在尝试通过阅读Eloquent Javacript来学习 Javascript 。我在处理函数的章节中,我一直试图弄清楚下面的代码是如何工作的。我看不到 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));
4

6 回答 6

1

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

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

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

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

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

addTwo函数如下所示:

function addTwo(number) {
    return number + 2;
}
于 2013-11-05T18:47:09.100 回答
0

按照右侧的 SO链接/相关问题进行操作。反正 ..

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

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

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

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

我没有找到“值”的原始用法,并且对这些部分进行了很好的编辑——在 JavaScript 中,变量(不是)绑定在闭包中。

于 2013-11-05T18:54:59.213 回答
0

My best advice is you try to learn a bit about Javascript closures. Really. I might not be the answer you are looking for, but it is the best you can do if you want to understand what's happening there.

Get yourself a copy of any good javascript book. Let me suggest 'Javascript - The Good Parts' by Douglas Crockford.

For some of us, Javascript closures were not something we grokked. I hope it's easier for you.

Anyway, makeAddFunctionis a function creator. It creates new functions which are tied to the parameter you passed to makeAddFunction. Therefore, the addTwo variable receives and stores a new function, which you can invoke later by appending parentheses to it, i.e. addTwo().

The parameter you pass to addTwo, i.e. 1on invokation addTwo(1) is passed to the add function, because addTwo is nothing more than an add function where the amount var has a fix value of 2.

于 2013-11-05T19:01:36.507 回答
0

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

于 2013-11-05T18:46:20.990 回答
0

var addTwo = makeAddFunction(2);

当您makeAddFunction(2)最初调用时,amountvar 在其函数范围内add可以看到它。addTwonow 设置为返回的add函数makeAddFunction(2)

addTwo(1)

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

也是如此addFive(5)

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

于 2013-11-05T19:07:39.810 回答
-1

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

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

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

于 2013-11-05T18:49:56.270 回答