Является ли программирование в стиле продолжения склонным к переполнению стека - PullRequest
9 голосов
/ 18 февраля 2011

В ответ на этот вопрос об эффектах jQuery я подумал об использовании аргумента callback для .fadeIn( 500, my_function ).

Хотя в принципе это жизнеспособная идея, я понятия не имею (и ни одна из них не имеет документации jQuery :(), если обратный вызов разрешен для повторения:

function keep_animating(){
   $("#id").fadeIn(500).fadeOut(500, keep_animating );
}

Ответы [ 3 ]

3 голосов
/ 18 февраля 2011

Вы можете добавить точку останова отладчика и проверить, увеличивается размер стека или нет. :)

Однако, поскольку анимации / выцветания используют setTimeout / setInterval, я очень предполагаю, что глубина вызова не увеличивается, то есть не подвержена переполнению стека.

1 голос
/ 21 февраля 2011

Я нашел время, чтобы спросить ' людей, которые знают ' ... Нет переполнения стека, поскольку нет явной рекурсии: методы fadeIn, fadeOut ...все просто создают запись в очереди эффектов.Это означает, что функция keep_animating не выполняется в том же контексте.

Предоставлено Дейв Метвин :

То, что вы описываете как "рекурсия"«На самом деле это не рекурсия.Визуальные эффекты jQuery запускаются по таймеру setTimeout, поэтому функция обратного вызова запускается не сразу, как в рекурсии.Вместо этого обратный вызов выполняется после завершения анимации в несколько «шагов», каждый из которых запускается с помощью setTimeout.

0 голосов
/ 18 февраля 2011

Ваше решение будет повторяться и, в конечном итоге, уничтожит стек - но у вас будет достаточно времени - в зависимости от браузера - пока оно не сработает Для быстрой демонстрации это хорошо, но для готового кода вы захотите использовать нерекурсивный подход, такой как:

function pulse(){
   $("#id").fadeIn(500).fadeOut(500);
}
setInterval(pulse, 1000);

Есть много способов избавиться от этого, но вы должны получить его там.

...