我无法绕过这个问题(假设我错过了直接调用匿名函数或通过变量调用它的区别。
为什么在下面的示例中0设置变量'total'?
var adder = function (total) {
// the following function is returned
// and assigned to adder
var inner_function = function (summand) {
total += summand;
alert(total);
}
return inner_function;
}(0);
adder(2); // returns 2
adder(3); // returns 5
但是之后我这样称呼这个匿名函数不是吗?
var adder = function (total) {
// the following function is returned
// and assigned to adder
var inner_function = function (summand) {
total += summand;
alert(total);
}
return inner_function;
}
adder(0);
adder(2); // -> 2
adder(3); // -> 5
答案 0 :(得分:2)
你有两个功能。
在第一个示例中,您将外部匿名函数的返回值(即内部匿名函数)分配给adder
。
在第二个示例中,您将外部匿名函数指定给adder
。
由于adder
的值在每种情况下都是不同的函数,因此会得到不同的结果。
答案 1 :(得分:1)
在你的第一段代码中,当你用'(0)'关闭函数体时,你正在调用函数。这被称为自我调用功能。因此,在两个代码示例中,您实际上都在调用函数三次。
function(){}()
:这也是函数声明和自我调用。
function (){}
:这只是一个函数声明。
答案 2 :(得分:1)
第一个示例显示了使用立即调用的函数表达式来创建捕获传递的0的闭包。请注意,您实际上返回内部函数,然后调用它而不是原始函数。
在第二个示例中,您还创建了一个闭包并返回内部函数,但它没有被赋值给任何东西,因此后续调用以外部函数为目标并创建更多闭包。
试试这个:
adder = adder(0)
在这里,您可以使用内部函数覆盖原始函数
答案 3 :(得分:1)
在第一个示例中,您将添加匿名函数的结果,即内部函数+范围(其中total = 0)。
那是因为你在最后用(0)调用匿名函数。
你需要看到功能块,就像它是一个命名函数,所以它将是:
var adder = myfun(0);
var myfun = function(total){...}
Before statement is exacly the same as:
var adder = function(total){...}(0);
这就是你在做什么。
答案 4 :(得分:1)
这非常简单:在示例中为adder
分配两个不同的内容。
在您的第一个示例中,您自行调用匿名function (total) {...}
,因此您将其返回值分配给adder
,即inner_function
。
在第二个示例中,您只需将匿名函数指定给adder
,并且永远不会询问其返回值,因此您不会将inner_function
分配到任何位置,因此无法使用它。