【问题标题】:Is there a difference between jQuery recursive function calls and Javascript's setInterval?jQuery 递归函数调用和 Javascript 的 setInterval 有区别吗?
【发布时间】:2012-07-27 22:12:41
【问题描述】:

我正在制作一些波浪图像以缓慢反复地上下移动,以赋予它更生动的感觉,我发现了 Javascript 的 setInterval()。这非常适合每 5.3 秒(以略有不同的速度)上下动画我的不同波浪图像。

self.setInterval("waves()",5300);

function waves() {  
$('.waves1').animate({
    bottom: '-5px'
}, 2000);
$('.waves1').animate({
    bottom: '7px'
}, 3000);

$('.waves2').animate({
    bottom: '-5px'
}, 2200);
$('.waves2').animate({
    bottom: '7px'
}, 2800);

$('.waves3').animate({
    bottom: '-5px'
}, 1800);
$('.waves3').animate({
    bottom: '7px'
}, 3200);
}

在实现这个之后,我还发现你可以使用一个递归的 jQuery 函数来保持动画的继续。例如:

function animateWaves() {
   $('.waves1').animate({ top: '+=15' },
                        { duration: 2000, easing: "linear" })
               .animate({ top: '-=15' },
                        { duration: 3000, easing: "linear",
                          complete: animateWaves });
}

$(function() {
    animateWaves();
});

其中一个(递归或 setInterval)相对于另一个有什么优势?

【问题讨论】:

    标签: javascript jquery recursion jquery-animate setinterval


    【解决方案1】:

    这不是真正的递归。它是函数内部的自引用,但它只是 引用,而不是函数调用。函数调用由框架稍后在动画完成时进行。

    递归涉及活动函数调用的“堆栈”,一个在另一个之上。 (在相互交织的相互递归函数的情况下,可能存在干预活动函数。)这里不是这种情况。在根据传递给 .animate() 调用的引用进行调用时,对“animateWaves”的外部调用将已完成。

    请注意,jQuery 动画机制在其底层还使用了浏览器的计时器机制。如果你仍然在使用这个库,你最好让它为你处理重复。

    【讨论】:

    • 不,它不是在调用自己。它将对自身的引用传递给 jQuery,并要求 jQuery 稍后调用它。
    • 哦,我猜我不够明确 - 我会说第二种方式更好,因为您可以确定动画将在当时完成再次调用该函数。
    • 那是因为 setInterval 根本没有回调函数 - 如果动画有延迟,它仍然会在 5.3 秒后重新启动,对吧?
    • 是的,完全正确 - 当您设置自己的单独计时器来“拦截”动画结束时,可能会有点太早或太晚。
    猜你喜欢
    • 2014-06-04
    • 2019-04-03
    • 2016-03-26
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多