为什么计数正确递增

时间:2015-01-06 16:56:41

标签: javascript

考虑这个简单的例子:

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同样不适用?

&#13;
&#13;
var count = 0;
for (var i = 0; i < 4; i++ ) {
  setTimeout(function() {
    console.log(i, count++);
  }, i * 2000 );
}
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:10)

变量ifor循环递增,并在任何超时处理程序运行之前以值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);
};