Я пишу немного компонента jQuery, который анимирует в ответ на нажатия кнопки и также должен пойти автоматически также. Я просто задавался вопросом, не могу ли эта рекурсивная функция или нет, я вполне разработать его.
function animate_next_internal() {
$('#sc_thumbnails').animate(
{ top: '-=106' },
500,
function() {
animate_next_internal();
}
);
}
Моя фактическая функция более сложна для обеспечения остановок и запускается, это - просто упрощенный пример.
РЕДАКТИРОВАНИЕ Это могло или переполнить стека или не, в зависимости от того, как события обрабатываются внутренне. Возможности:
анимационный () directy называет сделанный обратный вызов, в этом случае переполнение неизбежно.
анимационный () планирует обратный вызов для вызова некоторым внешним механизмом диспетчеризации и затем завершается, в этом случае он никогда не будет переполняться.
Изначально я подозревал, что это приведет к переполнению памяти, но я написал небольшой тест, чтобы подтвердить
function test(){
$(".logo img").css("position", "absolute");
$(".logo img").css("top", "100px");
$(".logo img").animate({top:0}, 500, function(){
test();
console.log("exits here");
});
}
test();
и, что удивительно, я увидел
exits here
exits here
exits here
exits here
exits here
...
в своих журналах. Похоже, «animate () планирует обратный вызов для вызова некоторым внешним механизмом диспетчеризации, а затем завершается, и в этом случае он никогда не переполнится». - правильный ответ
Я ожидал, что такая реализация приведет к переполнению стека вызовов. Если вы не упростили его, у вас должно быть какое-то конечное условие, которое заставляет функцию выходить из рекурсии.Вероятно, вам понадобится что-то вроде этого:
function animate_next_internal() {
if ( some_condition ) return;
$('#sc_thumbnails').animate(
{ top: '-=106' },
500,
function() {
animate_next_internal();
}
);
}
Где some_condition - это что-то, связанное с рекурсией - возможно, когда # sc_thumbnails фактический верх достигает некоторого предела, например 0 на странице или в ее родительском элементе .