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

这会在 2 秒后一次打印 0 1 2 3 4 5。为什么会这样?以及在 2 秒后打印每个数字的解决方案是什么。

4

6 回答 6

1

您的超时需要间隔,我总是使用不同的 var 来保存每个超时,这样我就可以清除特定的超时

现场演示

var tIds=[];
for(var i=0;i<5;i++) {
 (function(z){
    tIds[i]=setTimeout(function(){window.console&&console.log(z);},2000*i); //fire 2000,4000,6000
  })(i);
 }

另请阅读文档以了解为什么 2000+i 似乎不起作用

于 2013-07-02T05:55:38.577 回答
1

尝试使用此代码。

    //Referring your code for better understanding..
    for(i=0;i<5;i++) {
     (function(z){
      setTimeout(function(){console.log(z);},2000*z);})(i);
     }
于 2013-07-02T05:57:06.703 回答
1

setTimeout 不会在2 秒内阻止代码的执行。事实上setTimeout立即返回,循环继续。因此,您的所有 5 个异步调用在超时后几乎同时触发。

为了接近你想要的,我想要这个类似递归的版本

功能打印(一){
    如果 (i >= 5) 返回;

    控制台.log(i);
    设置超时(函数(){
        打印(我+1);
    }, 2000);
}

打印(0);
于 2013-07-02T06:06:57.153 回答
1

您正在触发该函数的 5 个异步、几乎同时的调用。

于 2013-07-02T05:59:14.510 回答
0

setTimeout(fn,delay)fn延迟delay毫秒后运行给定函数。所以你可以简单地乘以i2000 并使用:

for(;i<5;i++)  {
   setTimeout(function(){console.log(z);},2000*i);
}

如果要报告或i使用in ,fn则应创建一个函数,该函数返回一个用于 in 的函数setTimeout,使用闭包来报告或使用i。下面i使用变量 括起来x,由立即调用的匿名函数使用,创建f函数 Object 以供后续使用setTimeout

for(var i=0;i<5;i++)
 {
   var f = function(x){
       return function(){console.log(z+'#'+x);}
   }(i);
   setTimeout(f,2000*i);
 }

jsFiddle

于 2013-07-02T06:10:32.647 回答
0

您可以尝试使用 diff 方法setInterval

var timer = setInterval(function(){printThing();},2000);

var i = 0;    
function printThing(){
  if(i<=5){
    window.console && console.log(i);
    ++i;
  }
  else{
    clearInterval(timer)
  }
}//end function

这是一个例子http://jsfiddle.net/W9vS4/2/

于 2013-07-02T05:59:45.117 回答