setTimeout未按预期工作

setTimeout not working as expected

本文关键字:工作 setTimeout      更新时间:2023-09-26

我正在用Javascript编写for循环。想要的目标是打印出0、1、2,中间间隔3秒。

for (var i=0; i<3; i++) {
    console.log(i);
}

这会按预期打印所有内容,不会停顿。但是当我添加setTimeout:时

for (var i=0; i<3; i++) {
    setTimeout(function() {console.log{i},3000*i}
}

结果是,它以3秒的间隙打印出333。暂停有效,但看起来它在打印正确的数字之前就完成了循环。

在运行setTimeout调用之前,循环已经完成,这是完全正确的。由于所有超时函数都引用i,所以它们都将打印出3。解决此问题的方法是在闭包中捕获i

for (var i = 0; i < 3; i++) {
  (function(index) {
    setTimeout(function() {
      console.log(index);
    }, 3000 * index);
  })(i); // Instantly call the function and pass the value of i
}