function change ()
{
for( var i=0 ; i<5 ; i++) ;
{
alert(5) ;
}
}
警报5.单击“确定”后,等待5秒,再次发出警报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)
}
答案 0 :(得分:0)
setTimeout
就是这样。有关工作示例,请参阅http://jsfiddle.net/scythah/aA6nV/1/。
(function () {
var i = 0;
change();
function change() {
if (i < 5) {
i++;
alert(5);
setTimeout(change, 5000);
}
}
})()
答案 1 :(得分:0)
现在更新已提供“真实”代码:
放这个问题:
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);
}
循环的i
作为j
传递到匿名函数,然后里面的超时使用j
。
或者你可以通过使用jQuery的.delay()
method更简单地做到这一点,注意.delay()
不是setTimeout()
的一般替代品,它仅用于用于延迟元素的jQuery动画队列中的东西:
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);
}
}
JavaScript没有“阻塞”暂停或休眠功能,阻止下一行代码在暂停后运行。 setTimeout()
function计划在指定的毫秒数后运行的函数,但随后在setTimeout()
之后立即继续执行。所以我上面显示的函数运行整个循环,相隔五秒钟排队五次 - 注意指定的延迟如何乘以循环计数器,然后结束 - 在每次延迟后调用排队的函数。
缺少“阻塞”功能意味着您无法在继续之前使用任何名为change()
的代码等待所有警报。如果你需要等待,你需要重构你的代码(可能有回调函数),以允许JS超时的非阻塞性。
答案 2 :(得分: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秒后,它们全部执行。
答案 3 :(得分:0)
这里的问题是,当setTimeout
运行时,for循环将完成,以便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)
};