[英]Counter value changes within loop when assigned to a new variable
我正在学习JS。 为什么记录funcs2[1]();
log 4和funcs[1]();
日志5?
请注意,这不是该问题的重复项。 我知道funcs[1]();
记录5
(而不是1),因为调用的函数绑定到i
的当前值,该值在循环终止时为5。
但这不是我的问题。 我想知道为什么funcs2[1]();
记录4而不是5。
var funcs = [];
for (var i = 0; i < 5; i++) {
funcs.push(function () {
return i;
});
}
console.log(funcs[1]());
5
var funcs2 = [];
for (var i = 0; i < 5; i++) {
var x = i;
funcs2.push(function () {
return x;
});
}
console.log(funcs2[1]());
4
因为当i增加到5时,它不会进入循环,所以最终x是4。
这是一个著名的JS闭包问题,内部函数仅将父上下文的变量对象保留在其内部[[scope]]
属性中,而不保留变量。 因此,完成循环后,父对象的可变对象中的i
等于5,而x等于4。
由于javascript中没有块作用域,因此在两个循环完成执行后,在两种情况下变量i
的值均为5
。
但是,在第二种情况下, x
的值为4
因为这是最后的迭代索引,并且i++
在x = i
赋值之后发生。
抱歉,我对原始帖子的修改被拒绝。 为了对此进行进一步的讨论,我对另一种情况作了另一个回答:
var funcs3 = [];
function foo() {
for (var k = 0; k < 5; k++) { // k is in foo's scope
funcs3.push(function () {
return k;
});
}
}
foo(); // k can't be accessed after from here
console.log(funcs3[1]()); // 5, k is still in closure
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.