setTimeout is not working correctly inside "for loop&qu

setTimeout is not working correctly inside "for loop"

本文关键字:quot loop qu for inside is not working correctly setTimeout      更新时间:2023-09-26

当然,代码只做你让它做的事情。

但我很困惑为什么在下面的代码中:

var a = {
    0: "Hi",
    1: "Bye"
}
for (var b in a) {
    setTimeout(function () {
        console.log(b);
    }, 1000);
}

不是合并"0"然后合并"1"

我只得到两次"1"。

我不知道为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。

这是因为您对闭包的使用是错误的。

在这种情况下,您在setTimeout回调中使用闭包变量b,但在执行回调之前不会查找变量b的值,此时的值更新为对象中的最后一个值。

这种情况下的解决方案之一是创建一个局部闭包,如下所示

for (var b in a) {
    (function(c){
        setTimeout(function () {
            console.log(c);
        }, 1000);
    })(b)
}

演示:Fiddle

也可以这样做

for (var b in a) {
    setTimeout(console.log.bind(console, b), 1000);
}

或者像这个

for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }.bind(null, b), 1000);
}

甚至像这个

// compatibility varies
for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }, 1000, b);
}