用setTimeout理解Javascript循环

时间:2015-09-02 10:25:32

标签: javascript settimeout

为什么此函数返回垃圾值后跟5 5s

for (var j = 0; j < 5; j++) {
    setTimeout(function () {
        console.log(j);
    }, 1000);
}

2 个答案:

答案 0 :(得分:0)

观察到的行为符合要求。您可以将代码更新为以下

for(var j=0;j<5;j++){
  (function(index){
    setTimeout(function(){console.log(index);},1000);
  })(j);
}

以上绘制了预期/正确的值,即0,1,2,3,4

根据问题,所有超时函数都共享一个公共变量j,因此,当第一次记录完成时,直到那时j已经更新为5.

因此,您需要确保每个超时功能都有私有副本。因此,为了获得预期/正确的值,您需要使用闭包。

答案 1 :(得分:0)

返回的值从setTimeout()返回。它不是垃圾值,它是超时的id。

  

timeoutID是超时的数字ID,稍后可以使用window.clearTimeout()。

清除超时时使用与timeout关联的此ID。

var timeoutID = setTimeout(function() {
    console.log('hello');
}, 1000);

clearTimeout(timeoutID);

您的代码中的另一个问题是它始终在控制台中打印5。因为,执行setTimeout回调的时间,循环已经执行,j的值为5

要解决这个问题,请在循环中使用 closure

&#13;
&#13;
for (var j = 0; j < 5; j++) {
  (function(j) {
    setTimeout(function() {
      document.write(j + '<br />');
    }, 1000);
  }(j));
}
&#13;
&#13;
&#13;