Слишком много ошибок рекурсии в 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.