0

function change ()
{
    for( var i=0 ; i<5 ; i++) ;
    {     
        alert(5) ;
    }
}

警报 5.单击确定后,等待 5s,再次警报 5,等待 5.并执行此操作 5 次。但它不能与 setTimeout 函数一起正常工作

更新:这是我真正想做的:

var groopBox = $("#"+value.value+" .group") ;
for ( var i=0 ; i<groopBox.length ; i++ ) {
     groopBox.eq(i).slideToggle(1000)
}

这行得通,但是当我把这个代码块放进去时setTimeout它不起作用:

var groopBox = $("#"+value.value+" .group") ;
for ( var i=0 ; i<groopBox.length ; i++ ) {
     setTimeout(function(){ groopBox.eq(i).slideToggle(1000) }, i*2000)
}
4

4 回答 4

0

setTimeout就是这样。有关工作示例,请参见http://jsfiddle.net/scythah/aA6nV/1/ 。

(function () {
    var i = 0;
    change();

    function change() {
        if (i < 5) {
            i++;
            alert(5);
            setTimeout(change, 5000);
        }
    }
})()
于 2013-07-03T06:33:24.763 回答
0

现在更新 OP 提供了“真实”代码:

把这个问题:

groopBox.eq(i).slideToggle(1000)

在一个循环中的调用中setTimeout(),当所有超时运行时,for循环已经完成并且i将等于5,并且因为没有任何带有索引5的元素.eq(5)发生。你可以通过引入一个额外的“包装器”函数来解决这个问题,以便所需的索引最终在一个闭包中结束:

var groopBox = $("#"+value.value+" .group");
for ( var i=0 ; i<groopBox.length ; i++ ) {
   (function(j) {
      setTimeout(function() { groopBox.eq(j).slideToggle(1000) }, i * 2000);
   })(i);
}

演示:http: //jsfiddle.net/BCgkC/

循环i传递给匿名函数 asj然后超时j的代码使用.

.delay()或者你可以通过使用 jQuery 的方法更简单地做到这一点,注意这不是.delay()通用的替代品,它仅用于延迟元素的 jQuery 动画队列中的东西:setTimeout()

var groopBox = $("#"+value.value+" .group");
for ( var i=0 ; i<groopBox.length ; i++ ) {
   groopBox.eq(i).delay(i * 2000).slideToggle(1000);
}

演示:http: //jsfiddle.net/BCgkC/1/

我原来的答案:

请注意,您的代码在此行末尾有一个不正确的分号:

for( var i=0 ; i<5 ; i++) ;

...这意味着包含在其中的块{}不是for循环的一部分。

setTimeout()是用于将 JavaScript 代码的执行延迟指定时间间隔的函数:

function change () {
    for( var i=1 ; i<=5 ; i++)
    {     
        setTimeout(function() { alert(5) }, i * 5000);
    }
}

演示:http: //jsfiddle.net/kNvXh/

JavaScript 没有阻止下一行代码运行的“阻塞”暂停或睡眠功能,直到暂停之后。该setTimeout()函数安排一个函数在指定的毫秒数后运行,但随后立即继续执行语句 after setTimeout()。所以我上面显示的函数运行整个循环,每隔五秒排队五个超时 - 注意指定的延迟如何乘以循环计数器,然后结束 - 在每次延迟后调用排队的函数。

这种“阻塞”功能的缺乏意味着您不能让任何称为change()等待所有警报的代码在继续之前等待所有警报。如果你需要等待,你需要重构你的代码(也许使用回调函数)以允许 JS 超时的非阻塞性质。

于 2013-07-03T06:33:31.390 回答
0

这是你想要做的吗?

function myAlert(callback){
  return function(){
    alert(5);
    if(callback){
      setTimeout(callback, 5000);
    }
  }
}

var i = 5, exec;
while(i--)
  exec = myAlert(exec);

exec();

如果您尝试这样做:

var i = 5;
while(i--){
  setTimeout(function(){
    alert(5);
  }, 1000);
}

然后浏览器同时运行所有的 setTimeouts,所以 5 秒后,它们都执行了。

于 2013-07-03T06:33:41.880 回答
0

这里的问题是,当setTimeoutfor 循环运行时,它会完成,所以它i等于它拥有的最后一个值。您可以使用以下任何一种方式来捕获/保存i每个回调的值。

您可以使用这样的闭包

  for ( var i=0 ; i<groopBox.length ; i++ ) {
    (function(box){
       setTimeout(function(){ 
          groopBox.eq(box).slideToggle(1000) 
       }, box*2000)
    })(i);

  }

或者你可以使用这样的功能

  for ( var i=0 ; i<groopBox.length ; i++ ) {
    slideBox(i);
  }

  var slideBox = function ( box ) {
     setTimeout(function(){ 
        groopBox.eq(box).slideToggle(1000) 
     }, box*2000)
  };
于 2013-07-03T07:20:52.257 回答