为什么计数正确递增

Why is count correctly incremented

本文关键字:为什么      更新时间:2023-09-26

考虑这个简单的例子:

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 );
}

变量ifor循环递增,并在任何超时处理程序运行之前以值4结束。另一方面,变量count仅在超时处理程序递增。当第一个超时处理程序触发时,count仍将0

正如我之前的小伙子们所说,这是因为循环在激活超时之前完成。

解决此问题的一种方法是将超时放在不同的函数中,并从循环中将i传递给它。这可确保每次迭代都为函数传递正确的i

这也是为什么count设置为期望值的原因;它位于循环的范围之外。

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