Если jQuery вызовы функции сам в его обратном вызове завершения, который является рекурсивной опасностью для стека?

Я пишу немного компонента jQuery, который анимирует в ответ на нажатия кнопки и также должен пойти автоматически также. Я просто задавался вопросом, не могу ли эта рекурсивная функция или нет, я вполне разработать его.

function animate_next_internal() {

  $('#sc_thumbnails').animate(
    { top: '-=106' }, 
    500, 
    function() {
      animate_next_internal();
    }
  ); 
}  

Моя фактическая функция более сложна для обеспечения остановок и запускается, это - просто упрощенный пример.

РЕДАКТИРОВАНИЕ Это могло или переполнить стека или не, в зависимости от того, как события обрабатываются внутренне. Возможности:

  1. анимационный () directy называет сделанный обратный вызов, в этом случае переполнение неизбежно.

  2. анимационный () планирует обратный вызов для вызова некоторым внешним механизмом диспетчеризации и затем завершается, в этом случае он никогда не будет переполняться.

6
задан NXT 25 April 2010 в 00:07
поделиться

2 ответа

Изначально я подозревал, что это приведет к переполнению памяти, но я написал небольшой тест, чтобы подтвердить

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 () планирует обратный вызов для вызова некоторым внешним механизмом диспетчеризации, а затем завершается, и в этом случае он никогда не переполнится». - правильный ответ

9
ответ дан 10 December 2019 в 02:44
поделиться

Я ожидал, что такая реализация приведет к переполнению стека вызовов. Если вы не упростили его, у вас должно быть какое-то конечное условие, которое заставляет функцию выходить из рекурсии.Вероятно, вам понадобится что-то вроде этого:

function animate_next_internal() {

  if ( some_condition ) return;

  $('#sc_thumbnails').animate(
    { top: '-=106' }, 
    500, 
    function() {
      animate_next_internal();
    }
  ); 
}  

Где some_condition - это что-то, связанное с рекурсией - возможно, когда # sc_thumbnails фактический верх достигает некоторого предела, например 0 на странице или в ее родительском элементе .

0
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: