使用windows.setTimeout时丢失参数

时间:2013-02-11 12:00:01

标签: javascript parameters reference parameter-passing settimeout

我想用JavaScript显示正在进行的数字。

为此,我开发了以下示例:

for(var i=0; i<100; i++) {
  window.setTimeout(function() {
    alert(i);
  },1000*i);
}

不幸的是,每次都会显示数字100。我认为这是因为i是一个参考?

如何在参数传递中更改?

1 个答案:

答案 0 :(得分:1)

问题是JS不会等待并在超时到期之前完成循环。到那时,i已经是100。

要解决此问题,您的超时应具有i的本地引用。这样,它就不会引用当时已经为100的i,而是在循环的那个时间引用i

for(var i=0; i<100; i++) {
  (function(i){
    //shadowing the loop-i with the function-i
    window.setTimeout(function() {
      //thus, this callback is referencing the i from the function
      //and not the loop's i
      alert(i);
    },1000*i);
  }(i));
}