JavaScript setTimeout无法正常工作

时间:2019-12-18 12:16:48

标签: javascript closures

我有一个代码示例

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

这是在控制台上打印3次“ 3”。但是,我希望它在不使用let的情况下打印“ 0,1,2”

到目前为止,我已经尝试了以下方法-

 var funcs = [];
        function createfunc(i) {
        return function() {
            console.log("i ", i)
        }
        }
        for(var i = 0; i < 3; i++) {

        setTimeout(() => {
           funcs[i] = createfunc(i) // statement 1
        }, 1000)
        }
        for (var j = 0; j < 3; j++) {
           funcs[j]();

        }

如果我按原样使用语句1而不将其放入setTimeout函数中,则此方法工作正常。但是,如果我使用setTimeout函数,它将引发错误。有人可以让我知道如何使用setTimeout函数在控制台上打印0、1、2吗?

1 个答案:

答案 0 :(得分:2)

由于closure会发生这种情况,无论如何您都可以使用下面的代码,然后您将获得想要的正确结果。

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