Jquery太多的递归错误

时间:2010-06-15 09:29:11

标签: jquery recursion colors jquery-animate

我希望有人可以帮助我。

我有这段代码:

<script>
$(document).ready(function() {
 spectrum();
 function spectrum(){
    $('#bottom-menu ul li.colored a').animate( { color: '#E7294F' }, 16000);
    spectrum2();
 }
 function spectrum2(){
    $('#bottom-menu ul li.colored a').animate( { color: '#3D423C' }, 16000);
    spectrum();
 }
});
</script>

它正在工作,但当我看到萤火虫时,它说有一个太多的递归错误。

我希望有人可以告诉我原因。

谢谢!

3 个答案:

答案 0 :(得分:4)

问题是你的脚本永远不会停止执行。

当页面加载时,您告诉它运行函数spectrum()。它运行此函数,然后被告知运行它所执行的函数spectrum2()。当它完成spectrum2()时,你告诉它再次运行spectrum(),当它完成时它必须再次运行spectrum2() ..看到模式?你的糟糕脚本永远不会一遍又一遍地执行这两个功能!

调用自身的函数(或两个反复调用的函数)的过程称为recursion,但通常递归最终会以某种方式终止。你永远不会终止,所以FireBug说“等一下,这个剧本永远不会结束,我最好抛出一个错误!”

这可能不是你想要实现的,修复很可能很简单。如果您可以尝试解释您想要实现的目标,也许我们可以帮您编写正确的代码?

答案 1 :(得分:0)

你有一个明确无休止的递归。 specturm()调用spectrum2(),后者又调用spectrum();你没有终止条件。您需要添加一个条件来终止该递归。也许你想要实现以下目标。如果您告诉我们您要实现的目标,那么您将获得解决方案。

<script>
$(document).ready(function() {
 spectrum();

 function spectrum(toEnd){
    $('#bottom-menu ul li.colored a').animate( { color: '#E7294F' }, 16000, function(){
     if(!toEnd)
        spectrum2(true);
     });
 }
 function spectrum2(toEnd){
    $('#bottom-menu ul li.colored a').animate( { color: '#3D423C' }, 16000, function(){

     if(!toEnd)
        spectrum(true);
    });
 }
});
</script>

答案 2 :(得分:-1)

使用setTimeout从堆栈中删除调用函数:

function spectrum(){
    $('#bottom-menu ul li.colored a').animate( { color: '#E7294F' }, 16000);
    setTimeout(function() {spectrum2();},100);
 }
这样,频谱有机会在你启动频谱2时完成。与spectrum2一样。