setTimeout在“for循环”中无法正常工作

时间:2013-06-29 02:33:04

标签: javascript loops for-loop iteration settimeout

当然,代码只会执行您的操作。

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

var a = {
    0: "Hi",
    1: "Bye"
}

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

而不是安慰“0”然后“1”

我只是两次获得“1”。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

演示:Fiddle

答案 1 :(得分:1)

你也可以这样做

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);
}