考虑这个简单的例子:
var count = 0;
for (var i = 0; i < 4; i++ ) {
setTimeout(function() {
console.log(i, count++);
}, i * 200);
}
输出以下
4 0
4 1
4 2
4 3
我猜想i
总是解析为4,因为setTimeout回调会关闭变量I,但我无法弄清楚为什么count
同样不适用?
var count = 0;
for (var i = 0; i < 4; i++ ) {
setTimeout(function() {
console.log(i, count++);
}, i * 2000 );
}
&#13;
答案 0 :(得分:10)
变量i
由for
循环递增,并在任何超时处理程序运行之前以值4
结束。另一方面,变量count
仅在内部超时处理程序中递增。当第一个超时处理程序触发时,count
仍为0
。
答案 1 :(得分:2)
正如我之前的小伙子所说的那样,因为循环在超时被激活之前完成。
解决此问题的一种方法是将超时置于不同的函数中,并从循环内将i
传递给它。这确保了对于每次迭代,函数都会传递正确的i
这也是count
设置为期望值的原因;它位于循环范围之外。
for (var i = 0; i < 4; i++) {
doSomething(i);
};
function doSomething(i) {
setTimeout(function() {
console.log(i);
}, i * 2000);
};