-1

我想在 JavaScript 中使用递归来产生无限循环。事实上,我希望给图像一个来来去去的效果,没完没了。

让我们先看一些代码:

function lightening(){
    $('#pic_holder').fadeOut(250).fadeIn(250);
    setTimeout('lightening', 250);
}

这个函数,正如它所写的,应该

  • 应用fadeOut(250)fadeIn(250)效果;
  • 使用该setTimeout函数,该函数必须递归调用该lightening函数,此后重新应用 [ fadeOut-fadeIn 效果setTimeout ] 代码块。

你会同意,这应该无限期地进行,但事实并非如此。

这是完整的测试代码,带有 HTML,如您所见,它只应用了一次 fadeOut-fadeIn 效果。

我究竟做错了什么 ?

4

4 回答 4

7

真正应该做的是:

function lightening(){
  $('#pic_holder').fadeOut(250).fadeIn(250, lightening);
}

这将使下一个循环在淡入完成时开始。将您自己的超时与 jQuery 动画调用隐含的超时混合起来很棘手,而且通常是不必要的。在您的情况下,您将在前一个周期的中途开始一个新周期,这实际上要到 250 毫秒后才会生效。

于 2013-07-16T15:06:06.350 回答
6

第一个参数setTimeout可以是:

  • 要调用的函数;或者
  • 要执行的 JavaScript 字符串

你的函数没有被调用,因为你只是在一个字符串中有它的名字。删除单引号。

function lightening(){
    $('#pic_holder').fadeOut(250).fadeIn(250);
    setTimeout(lightening, 250);
}

有关正确用法,请参阅 Mozilla 文档

于 2013-07-16T15:04:35.027 回答
3

不要使用 2 个相互竞争的计时器,它们要么有间歇性错误,要么必须过于慷慨,而是使用回调:

function lightening(){
    $('#pic_holder').fadeOut(250).fadeIn(250, lightening);
}
于 2013-07-16T15:07:05.500 回答
1

删除报价。

setTimeout(lightening, 250);
于 2013-07-16T15:05:06.563 回答