2010-04-24 3 views
5

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

function animate_next_internal() { 

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

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

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

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

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

ответ

8

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

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

+1

+1 Так как ваша настройка вызывает функцию обратного вызова, это не то же самое, что вызвать функцию внутри себя. это не настоящая рекурсия. – Samuel

+1

Привет, спасибо, что нашли время попробовать это. Я думаю, ты прибил его. – NXT

+1

Вы, безусловно, правы, что это работает, и ваш тест, чтобы доказать, что все в порядке. Если вы также хотите знать, _why_ это работает, вам нужно будет понять концепцию ** Queues **, реализованную в jQuery с помощью методов ['.queue()') (http://api.jquery.com/queue /) и ['.dequeue()'] (http://api.jquery.com/dequeue/). Все это объясняется очень хорошо и с примерами в [этом ответе] (http://stackoverflow.com/a/3314877/1062304) на другой вопрос. – bfncs

0

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

function animate_next_internal() { 

    if (some_condition) return; 

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

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

+0

Благодарим вас за ответ, но вы не прочитали сообщение - я опубликовал упрощенный код для ясности. – NXT

 Смежные вопросы

  • Нет связанных вопросов^_^