我正在尝试为我正在创建的网站实施简单的新闻自动收录器。 作为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();
});
我的问题是:上述代码不应该以完全相同的方式工作吗?位置变化时会发生什么变化?
答案 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();
});