繁体   English   中英

分配给新变量时,计数器值在循环内更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM