tld*_*ldr 1 javascript closures
就在我以为我理解封闭的时候......
以下代码段:
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]());
Run Code Online (Sandbox Code Playgroud)
打印出3,3,3.我不明白为什么.我正在将'i'的值复制到局部变量x,所以应该有三个x:x0 = 0,x1 = 1.X2 = 2.他们如何阅读i的最终价值?
你的问题是由每个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;
}
}
Run Code Online (Sandbox Code Playgroud)