Слишком много ошибок рекурсии в Jquery

Я надеюсь, что кто-то может мне помочь.

У меня есть этот код:

<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>

это работает, но когда я смотрю на firebug, он говорит, что есть ошибка Too Much Recursion.

Я надеюсь, что кто-то может сказать мне, почему.

Спасибо!

3 ответа

Проблема в том, что ваш скрипт никогда не останавливается.

Когда страница загружается, вы говорите ей, чтобы запустить функцию spectrum(), Он запускает эту функцию и затем получает указание запустить функцию spectrum2(), который это делает. Когда это заканчивается spectrum2()Скажи это бежать spectrum() снова, и когда это будет сделано, он должен бежать spectrum2() еще раз.. увидеть шаблон? Ваш плохой сценарий застрял, выполняя эти две функции снова и снова, навсегда!

Процесс вызова функции (или двух функций, вызывающих друг друга неоднократно) называется рекурсией, но обычно рекурсия в конечном итоге завершается каким-либо образом. Ваш никогда не завершается, поэтому FireBug говорит: "Подождите, этот сценарий никогда не закончится, я бы лучше выдал ошибку!"

Это, вероятно, не то, что вы пытаетесь достичь, и исправить это, скорее всего, просто. Если бы вы могли попытаться объяснить, чего вы пытаетесь достичь, может, мы поможем вам написать правильный код?

У вас есть четкая бесконечная рекурсия. 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>

Используйте setTimeout для удаления вызывающих функций из стека:

function spectrum(){
    $('#bottom-menu ul li.colored a').animate( { color: '#E7294F' }, 16000);
    setTimeout(function() {spectrum2();},100);
 }

таким образом, у спектра есть шанс закончить, пока вы запускаете спектр2. Сделайте то же самое со spectrum2.

Другие вопросы по тегам