我正在尝试通过阅读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));
答案 0 :(得分:1)
在makeAddFunction
中,创建了一个名为add
的函数。返回此功能。
makeAddFunction
两次,并将其存储在两个变量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;
}
答案 1 :(得分:0)
makeAddFunction
创建一个闭包,将amount
设置为传入的数字并返回一个函数,该函数将该数量添加到传递给新函数的任何数字并返回它。
答案 2 :(得分:0)
按照右侧的SO 链接/相关问题进行操作。无论如何..
这篇文章对此进行了解释,尽管有很多毛病。无论如何,这里有一点点绒毛切割是一个“注释”版本:
..函数[do]不仅打包[运行一些代码],还包括一个环境。 [..]在另一个函数中定义的函数保留了[定义[内部函数]时[外部函数]中存在的词汇变量(如“数量”)]的访问权。
因此,上面示例中的[inner]
add
函数(在调用makeAddFunction时创建)捕获环境[包括外部函数的“amount”变量]。它将这个环境与[运行代码]一起打包成一个值[(这是一种说明函数只是对象的奇特方式)],然后从外部函数返回。当调用此返回函数([已分配给]
addTwo
和addFive
)时,[被调用函数可以访问]捕获的环境([和“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
函数,amount
在makeAddFunction(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
您所看到的是一个创建功能的功能。对于具有一个预设参数的函数,它可以被视为“工厂”。