就在我认为我理解封闭的时候......
以下代码段:
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = function () {
var x = i;
return x;
}
}
return a;
}
var a = f();
console.log(a[0]());
console.log(a[1]());
console.log(a[2]());
打印出3,3,3。我不明白为什么。我正在将'i'的值复制到局部变量x,所以应该有三个x:x0 = 0,x1 = 1。 X2 = 2。他们如何阅读i的最终价值?
答案 0 :(得分:5)
你的问题是由每个a[i]
实际上是一个闭包引起的。它们共享相同的i
,在调用每个a[i]
时进行评估,而不是在循环执行时进行评估。您需要使用单独的上下文创建每个闭包。例如:
function f() {
var a = [];
var i;
for (i = 0; i < 3; i++) {
a[i] = makeClosure(i);
}
return a;
}
function makeClosure(i) {
return function () {
var x = i;
return x;
}
}
答案 1 :(得分:4)
即使i
循环中for
的值发生变化,它仍然是同一个i
变量。您需要在该范围内隐藏i
并按值有效地传递它:
for (var i = 0; i < 3; i++) {
(function(x) {
a[x] = function() {
return x;
}
})(i);
}