这是How do JavaScript closures work?。第一个答案对我来说没有任何意义,我无法评论它。这非常令人沮丧
function foo(x) {
var tmp = 3;
return function(y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar is now a reference to the closure returned by foo
bar(10);
这是什么意思? y
变量来自哪里?
答案 0 :(得分:4)
变量的来源:
function foo(x) { // x introduced
var tmp = 3; // tmp introduced
return function (y) { // y introduced
// Can access all variables in scope, as introduced above.
// However, ONLY x and tmp are closed-over as y is just a parameter
// to the inner function.
alert(x + y + (++tmp));
}
}
var bar = foo(2); // 2 is value for x
bar(10); // 10 is value for y
现在,看得更深一点:
foo(2)
返回 new 函数对象(内部函数),它绑定到两个变量(x当前值为2,tmp当前值为3)
然后bar(10)
运行传递10的函数对象(然后是y的值)。
重复调用bar(10)
将导致不同的值,因为在函数调用期间重新绑定变量tmp
(++tmp
)。< / p>
答案 1 :(得分:3)
您需要区分变量(包含信息的内存的名称)和参数(要传递给函数的变量的占位符)。
(实际上它在函数原型中称为形式参数,在函数体中使用时称为实际参数。)
因此y
不是现有变量,而是传递变量(或值)的占位符。
然后,您需要了解var func = function(){}
将func
转换为对匿名函数(没有名称的函数)的引用。
一个简化的例子是:
var func = function (y) {
alert(y);
}
func("hello");
你可以从那里开始工作。其他一切都是以嵌套的方式应用的原理。
答案 2 :(得分:0)
foo
正在返回一个函数,它接受一个名为y
的参数。
因此,当你调用foo时,你会得到一个函数,你可以随时使用参数执行该函数,该函数变为y
的值。
请注意,返回的函数是匿名的,但是当foo
返回它时,您可以有效地将函数绑定到变量。在这里,正在调用foo
,并且返回值被分配给bar
。
现在,你可能会问“好吧,如果函数返回有参数y
,我调用bar(10)
,现在y
被赋予值10
,但是现在是什么x
?
好吧,x
已经有了一个值,它在第一次调用foo
时得到了。这是一个“工作流程”表示。
foo
的函数,它接受一个参数x
。它返回一个匿名函数,它接受一个名为y
的参数。foo
,其值x
等于2,并且它的返回值绑定到bar
。 bar
现在是对匿名函数的引用,其中x的所有值都等于调用x
foo
的值,即2。当使用bar
调用绑定到bar(10)
的匿名函数时,参数y
的值为10
。 bar
执行以下
警告(2 + 10 +(+ tmp));
所以你现在可能会问,“那是什么?”好吧,如果你按照上面的说法,这应该是合理的直接推断。当从foo
返回匿名函数时,任何本地变量的引用都绑定到值foo
有一个