这是一段代码:
// -------- Sample 1 ---------------
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
// --------- Sample 2 --------------
var fun = [];
for(var i = 0;i < 3; i++) {
fun[i] = function() {
console.log('values is '+ i);
}
}
for(var i = 0; i < 3; i++) {
fun[i]();
}
&#13;
除变量名外,两个示例代码都相同。但它提供了不同的输出。上面代码的输出是:
My value: 3
My value: 3
My value: 3
values is 0
values is 1
values is 2
任何人都可以弄清楚为什么会发生这种情况吗? DEMO
答案 0 :(得分:2)
var
被提升,所以对于翻译来说,第一部分i
实际上看起来更像是这样:
var funcs = [];
var i;
for (i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
// At this point, the for loop has finished; `i` has the value of 3 now:
for (var j = 0; j < 3; j++) {
// Each function retrieves the value of i and displays it
// and since `i` is 3, each function displays 3:
funcs[j]();
}
在你的第二个样本中(由于i
被声明了两次,这有点无效),i
被重新分配给值0,1和2 ,同时循环显示{ {1}}。