首页 > 解决方案 > JavaScript setTimeout 未按预期工作

问题描述

我有一个代码示例

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

这是将“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 打印到控制台吗?

标签: javascriptclosures

解决方案


它是由于关闭而发生的,无论如何您都可以使用以下代码,然后您将获得所需的正确结果。

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

推荐阅读