Если функция jQuery вызывает себя в обратном вызове завершения, это рекурсивная опасность для стека? - PullRequest
6 голосов
/ 24 апреля 2010

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

function animate_next_internal() {

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

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

EDIT Может переполнять стек или нет, в зависимости от того, как события обрабатываются внутренне. Возможности:

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

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

Ответы [ 2 ]

9 голосов
/ 25 апреля 2010

Сначала я подозревал, что память переполнится, но я написал короткий тест для подтверждения

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

0 голосов
/ 25 апреля 2010

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

function animate_next_internal() {

  if ( some_condition ) return;

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

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

...