1

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

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

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

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

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

我只得到“1”两次。

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

4

2 回答 2

4

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

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

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

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

演示:小提琴

于 2013-06-29T02:38:36.553 回答
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);
}
于 2013-06-29T02:53:03.473 回答