新闻自动收报机:递归错误

时间:2014-05-19 16:33:41

标签: javascript jquery recursion settimeout

我正在尝试为我正在创建的网站实施简单的新闻自动收录器。 作为JS和JQuery的新手,我从网站上获取了代码。代码工作得很好,但是当我移动函数调用时会发生太多的递归(firefox)错误。 原始功能:

$(document).ready(function(){
var tick=function()
{
    window.setTimeout(function()
    {
        $('#ticker li:first').animate({marginTop:"-30px"},700,function()
        {
            $(this).detach().appendTo('#ticker').removeAttr('style');
        });
        tick();//Old position for function call- works fine
    },4000);
};
tick();
});

上面的代码有效,但是当我将递归调用转移到setTimeout函数外部时,会出现递归错误。略有改动的代码:

$(document).ready(function(){
var tick=function()
{
    window.setTimeout(function()
    {
        $('#ticker li:first').animate({marginTop:"-30px"},700,function()
        {
            $(this).detach().appendTo('#ticker').removeAttr('style');
        });

    },4000);
         tick();//New position for function call-leads to unresponsive page
};
tick();
});

我的问题是:上述代码不应该以完全相同的方式工作吗?位置变化时会发生什么变化?

3 个答案:

答案 0 :(得分:0)

the setTimeout function的目的是设置另一个在指定时间后运行的函数。但是,超时运行时不会阻止其他代码执行 - setTimeout函数只有设置超时,它立即执行而不是等待传递给它的函数实际运行。如果tick()函数调用中的setTimeout调用超时为4000毫秒,则会产生每四秒重新运行tick()的效果。但是,一旦您将其移到setTimeout电话之外,它会在您第一次呼叫时立即无限地重新播放。

答案 1 :(得分:0)

在第一种情况下,tick()在计时器停止之前不会调用自身,因为对自身的调用位于setTimeout()函数内。在第二种情况下,tick()立即调用自身,两者之间没有超时。这将无限次地调用自己,如果浏览器没有给你递归错误并允许它继续,它最终会锁定或崩溃浏览器。

为了表明这一点,第二种情况可以简化为:

var tick=function(){
    tick();
};
tick();

答案 2 :(得分:0)

您只是移动tick()内的setTimeout。这是你的新代码。如果您不这样做,将立即调用tick()

$(document).ready(function(){
var tick=function()
{
    window.setTimeout(function()
    {
        $('#ticker li:first').animate({marginTop:"-30px"},700,function()
        {
            $(this).detach().appendTo('#ticker').removeAttr('style');
        });
        tick();//New position for function call-leads to unresponsive page
    },4000);

};
tick();
});