我理解人们对闭包的一个问题是它返回给定变量的最新值,除非你这样做:
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = (function (x) {
return function () {
return x;
}
})(i);
}
return a;
}
}
我需要解释的那里有一点太多了。
答案 0 :(得分:1)
在JavaScript中,变量的范围始终是function
(或全局对象)。所以,如果你做了类似
for (var i = 0; i < 3; i++) {
a[i] = function (x) {
return i;
};
}
只涉及一个i
。 for
循环结束后,i
的值为2
,无论调用哪个a[i]
函数。
要解决这个问题,我们需要建立一个新的范围。通常这是通过调用如下的匿名函数来完成的:
a[i] = (function (x) { // (1)
return function () { // (2)
return x;
};
})(i);
现在迭代时间的i
被映射到每次迭代的全新x
,而函数(1)确保它被“捕获”直到a[i]
(2)被执行。