2010-04-24 12 views
5

Sto scrivendo un piccolo componente jQuery che si anima in risposta alle pressioni dei pulsanti e dovrebbe anche andare automaticamente. Mi stavo chiedendo se questa funzione sia ricorsiva o meno, non riesco a capirlo.Se una funzione jQuery si chiama nella sua chiamata di completamento, è un pericolo ricorsivo allo stack?

function animate_next_internal() { 

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

La mia funzione reale è più complicato da consentire per gli arresti e ripartenze, questo è solo un esempio semplificato.

EDIT Potrebbe sovraccaricare lo stack o meno, a seconda di come gli eventi vengono gestiti internamente. Possibilità:

  1. animate() directy chiama la richiamata fatto, nel qual caso un overflow è inevitabile.

  2. animate() pianifica la callback per chiamata da qualche meccanismo invio esterno e quindi termina, nel qual caso sarà mai troppopieno.

risposta

8

inizialmente ho il sospetto che sarebbe traboccare il ricordo, ma ho scritto un breve test per confermare

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(); 

e sorprendentemente, ho visto

exits here 
exits here 
exits here 
exits here 
exits here 
... 

nei miei ceppi. Sembra che "animate() pianifichi la richiamata per la chiamata da parte di un meccanismo di dispatching esterno e quindi termini, nel qual caso non perderà mai". è la risposta giusta

+1

+1 Poiché l'impostazione di una funzione di callback non equivale a chiamare la funzione al suo interno. questa non è vera ricorsione. – Samuel

+1

Ciao, grazie per aver trovato il tempo per provarlo. Penso che tu abbia centrato il punto. – NXT

+1

Hai certamente ragione che funziona e il tuo test per dimostrare che va bene. Se vuoi anche sapere _why_ questo funziona, devi capire il concetto di ** Code **, implementato in jQuery con i metodi ['.queue()'] (http://api.jquery.com/queue /) e ['.dequeue()'] (http://api.jquery.com/dequeue/). Tutto questo è spiegato molto bene e con esempi in [questa risposta] (http://stackoverflow.com/a/3314877/1062304) a un'altra domanda. – bfncs

0

Mi aspetto che tale implementazione possa sovraccaricare lo stack di chiamate. A meno che non lo si sia semplificato, si dovrebbe avere una sorta di condizione terminale che causa il ritorno della funzione fuori dalla ricorsione. Probabilmente avete bisogno di qualcosa di simile:

function animate_next_internal() { 

    if (some_condition) return; 

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

Dove some_condition è qualcosa legato alla ricorsione - forse quando # sc_thumbnails effettivo superiore raggiunge un certo limite, come 0 sulla pagina o all'interno del suo genitore.

+0

Grazie per la vostra risposta ma non avete letto il post - ho pubblicato il codice semplificato per chiarezza. – NXT

Problemi correlati