Javascript setTimeout不递归调用匿名函数

Javascript setTimeout不递归调用匿名函数,javascript,jquery,Javascript,Jquery,我被要求做一个小的div循环,一个淡入淡出的效果。有几种方法可以做到这一点,但我想知道为什么下面只运行一次效果 $(document).ready(function() { (function(){ setTimeout(function(){$("#foo").fadeOut().delay(800).fadeIn(800);},0) })(); }); 据我所知,函数应该递归运行,但它不是 我使用了setInterval(function(){$(“#foo

我被要求做一个小的div循环,一个淡入淡出的效果。有几种方法可以做到这一点,但我想知道为什么下面只运行一次效果

 $(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();
在这里,您正在通过
淡入淡出