Javascript setTimeout内部工作不正常;for loop";
当然,代码只做你让它做的事情 但我不明白为什么在下面的代码中:Javascript setTimeout内部工作不正常;for loop";,javascript,loops,for-loop,iteration,settimeout,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” 我不知道为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。这是因为您对闭包的使用是错误的 在这种情
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)
}
演示:这是因为您对闭包的使用是错误的 在这种情况下,您正在
setTimeout
回调中使用闭包变量b
,但是变量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);
}
甚至像这样
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);
}
你也可以这样做
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);
}
甚至像这样
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);
}
更像是
setTimeout(console.log.bind(console,b)
@Musa,console.log.bind(null,b)
也适用于这种情况。console.log
不需要自己的上下文来工作。所以你不会得到非法调用
?@Musa,嗯,在node-0.10.12
中它可以使用null
,但在浏览器中它看起来需要控制台
。感谢你捕捉到了这种不同之处。我只做节点工作,所以我需要从未注意到:)更像是setTimeout(console.log.bind(console,b)
@Musa,console.log.bind(null,b)
也适用于这种情况。console.log
不需要自己的上下文来工作。所以你不会得到非法调用
?@Musa,嗯,在node-0.10.12
中它可以使用null
,但在浏览器中它看起来需要控制台
。感谢你捕捉到了这种不同之处。我只做节点工作,所以我需要从未注意到:)