当然,现在代码只做你让它做的事情。
但我很困惑为什么在下面的代码中:
var a = {
0: "Hi",
1: "Bye"
}
for (var b in a) {
setTimeout(function () {
console.log(b);
}, 1000);
}
而不是安慰“0”,然后是“1”
我只得到“1”两次。
我不确定为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。
当然,现在代码只做你让它做的事情。
但我很困惑为什么在下面的代码中:
var a = {
0: "Hi",
1: "Bye"
}
for (var b in a) {
setTimeout(function () {
console.log(b);
}, 1000);
}
而不是安慰“0”,然后是“1”
我只得到“1”两次。
我不确定为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。
这是因为您对闭包的使用是错误的。
b
在这种情况下,您在回调中使用闭包变量setTimeout
,但在b
执行回调之前不会查找变量的值,然后更新到对象中的最后一个值。
在这种情况下,解决方案之一是创建一个本地闭包,如下所示
for (var b in a) {
(function(c){
setTimeout(function () {
console.log(c);
}, 1000);
})(b)
}
演示:小提琴
你也可以这样做
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);
}