无法理解setTimeout()函数中的输出?

问题描述 投票:0回答:1
for (let i = 1; i < 5; i++) {
  console.log(i);
  setTimeout(
    function() {
      console.log(i);
    }, 2000);
}

以上代码的输出是:

 1
 2
 3
 4
 5
 5
 5
 5

,此代码的预期输出为1 2 3 4 1 2 3 4。延迟2秒后将显示第二个1 2 3 4,但是您可以看到输出为5 5 5 5。有人可以帮助我理解这一点。

javascript asynchronous settimeout
1个回答
0
投票

问题是i是在闭包中捕获的,因此,在您的函数启动时,它们都引用了i,而当前的值为5

for (var i = 1; i < 5; i++){
  console.log(i);
  setTimeout(function(){
    console.log(i);
  },2000);
}

如果可以使用let,则可以通过块作用域轻松解决此问题:

let

否则,如果您被限制使用for (var i = 1; i < 5; i++){ console.log(i); let num = i; setTimeout(function(){ console.log(num); },2000); },则可以通过创建一个接受该数字作为参数的工厂函数来解决此问题:

var
© www.soinside.com 2019 - 2024. All rights reserved.