Javascript setTimeout不递归调用匿名函数
我被要求做一个小的div循环,一个淡入淡出的效果。有几种方法可以做到这一点,但我想知道为什么下面只运行一次效果Javascript setTimeout不递归调用匿名函数,javascript,jquery,Javascript,Jquery,我被要求做一个小的div循环,一个淡入淡出的效果。有几种方法可以做到这一点,但我想知道为什么下面只运行一次效果 $(document).ready(function() { (function(){ setTimeout(function(){$("#foo").fadeOut().delay(800).fadeIn(800);},0) })(); }); 据我所知,函数应该递归运行,但它不是 我使用了setInterval(function(){$(“#foo
$(document).ready(function() {
(function(){
setTimeout(function(){$("#foo").fadeOut().delay(800).fadeIn(800);},0)
})();
});
据我所知,函数应该递归运行,但它不是
我使用了setInterval(function(){$(“#foo”).fadeOut().delay(800).fadeIn(800);},0)代码>因为它完成了任务,但我仍然想知道为什么setTimeout没有像我预期的那样工作。setTimeout(fx,delay)
将在延迟结束时调用一次。在这种情况下,以0的延迟调用它与在没有超时的情况下调用代码一次相同
setInterval
在每次间隔结束时都被调用,在您的情况下,因为间隔为0。我想你想要的东西更像:
setInterval(function(){
$('#foo').toggleFade(800);
}, 800);
设置超时(fx,delay)
将在延迟结束时调用一次。在这种情况下,以0的延迟调用它与在没有超时的情况下调用代码一次相同
setInterval
在每次间隔结束时都被调用,在您的情况下,因为间隔为0。我想你想要的东西更像:
setInterval(function(){
$('#foo').toggleFade(800);
}, 800);
这是对这两个概念的定义
setTimeout-setTimeout函数延迟指定的时间段,然后
触发指定函数的执行。一旦触发该功能,设置超时
已经完成了。当然,您可以在setTimeout执行之前终止它的执行
使用clearTimeout函数触发该函数
setInterval-setInterval函数也会延迟一段指定的时间,直到
触发特定功能的执行。不同之处在于
触发该功能命令未完成。相反,它会等待
再次指定时间,然后再次触发该函数并继续重复
在指定的时间间隔触发功能的过程,直到
卸载网页或调用clearInterval函数。以下是这两个函数的定义
setTimeout-setTimeout函数延迟指定的时间段,然后
触发指定函数的执行。一旦触发该功能,设置超时
已经完成了。当然,您可以在setTimeout执行之前终止它的执行
使用clearTimeout函数触发该函数
setInterval-setInterval函数也会延迟一段指定的时间,直到
触发特定功能的执行。不同之处在于
触发该功能命令未完成。相反,它会等待
再次指定时间,然后再次触发该函数并继续重复
在指定的时间间隔触发功能的过程,直到
卸载网页或调用clearInterval函数。setTimeout方法将在一段时间后执行某些操作,而setInterval方法将在X秒数(取决于时间间隔)后迭代执行某些操作
因此,要让setTimeout以迭代方式执行某些操作,需要将setTimeout包装在一个循环(或类似循环)中
但是,根据您所追求的,setInterval方法是两种方法中较好的一种
退房:
及
setTimeout方法将在一段时间后执行某些操作,而setInterval方法将在X秒数(取决于时间间隔)后迭代执行某些操作
因此,要让setTimeout以迭代方式执行某些操作,需要将setTimeout包装在一个循环(或类似循环)中
但是,根据您所追求的,setInterval方法是两种方法中较好的一种
退房:
及
setTimeout(func,millis)表示“在millis过去之后,我将调用func”。你的职责是
function(){
$("#foo").fadeOut().delay(800).fadeIn(800);
}
因此,在零毫秒之后,您的函数将被调用。但函数中没有任何内容告诉它再次调用setTimeout
类似这样的方法会奏效:
function my_func() {
// do something
setTimeout(my_func, 1000);
}
my_func();
setTimeout(func,millis)表示“在millis过去之后,我将调用func”。你的职责是
function(){
$("#foo").fadeOut().delay(800).fadeIn(800);
}
因此,在零毫秒之后,您的函数将被调用。但函数中没有任何内容告诉它再次调用setTimeout
类似这样的方法会奏效:
function my_func() {
// do something
setTimeout(my_func, 1000);
}
my_func();
请不要为此使用setInterval
您正在调用setInterval
,延迟为0。这意味着它将继续执行-比动画完成的速度更快。这将不断地向jQuery的内部队列添加动画效果,随着时间的推移构建内存使用
您可以将延迟时间增加到至少等于动画长度的值,但这是不可靠的。计时器(和动画)可以被其他代码延迟,应该避免这种硬编码
相反,采取这种方法:
function fadeInOut() {
$("#foo").fadeOut().delay(800).fadeIn(800, fadeInOut);
}
fadeInOut();
这里,您将把fadeInOut
函数作为回调传递,jQuery完成fadeIn
动画时会自动调用该回调。这保证了在上一个周期完成之前,新的动画周期不会开始。请不要为此使用setInterval
您正在调用setInterval
,延迟为0。这意味着它将继续执行-比动画完成的速度更快。这将不断地向jQuery的内部队列添加动画效果,随着时间的推移构建内存使用
您可以将延迟时间增加到至少等于动画长度的值,但这是不可靠的。计时器(和动画)可以被其他代码延迟,应该避免这种硬编码
相反,采取这种方法:
function fadeInOut() {
$("#foo").fadeOut().delay(800).fadeIn(800, fadeInOut);
}
fadeInOut();
在这里,您正在通过淡入淡出