2013-03-07 4 views
5

Mi chiedo se un blocco/funzione javascript sia sempre disponibile una volta caricato. Perché ho provato qualcosa e ora sono un po 'confuso. Ho definito un blocco di script in un div. Il blocco di script ha una funzione di gestione degli eventi per un elemento per ricaricare il div con ajax. La chiamata ajax restituisce l'html normale del div e lo sostituisce con quello corrente. Ma significa sostituire lo script che rende anche l'esecuzione. Ho pensato che la sceneggiatura sarebbe stata tagliata fuori dall'esecuzione dopo la dichiarazione sostitutiva. Ma non è stato così. Le righe di codice dopo l'istruzione sostitutiva sono state eseguite Così come funzionano queste cose. Come descrivi il tempo di vita di un blocco di script?Come conoscere la durata di un blocco di script o codice javascript?

risposta

8

Quando viene valutato il codice contenuto in un elemento script, il risultato di tale valutazione del codice diventa parte dell'ambiente di runtime della pagina. La rimozione dell'elemento script non rimuove le strutture risultanti (funzioni, ecc.) Dall'ambiente.

Quindi se lo script definisce le funzioni, o associa i gestori di eventi agli elementi o crea nuove proprietà su oggetti esistenti (incluso l'oggetto globale), tali funzioni, gestori e proprietà rimangono in memoria anche se lo script che li ha definiti è rimosso dal DOM (soggetto alla solita garbage collection di JavaScript, ad esempio, gli oggetti non referenziati da nessuna parte sono idonei per GC, ma l'elemento script non ha alcuna rilevanza su quello). L'elemento script è semplicemente un meccanismo per il trasferimento del codice al browser.

+0

Grazie per la risposta. Ho ancora una quastion. Dopo aver ricaricato div è stato caricato esattamente lo stesso blocco di script con le stesse identiche funzioni. Quindi sono stati pubblicizzati o sostituiti o ignorati? –

+1

@HalilIbrahim: il codice viene eseguito nuovamente. Se hai funzioni dichiarate nell'ambito globale, quelle già presenti vengono sostituite con nuove. Se si hanno dichiarate variabili globali * senza * inizializzatori (quindi, solo 'var foo;' not 'var foo = 42;'), poiché la variabile è già dichiarata, la seconda dichiarazione viene ignorata. Se si hanno inizializzatori o assegnamenti (quindi, 'var foo = 42;' o solo 'foo = 42;'), questi vengono eseguiti di nuovo e quindi 'foo' è impostato (indietro) a' 42'. Ecc. Tutti gli effetti dell'esecuzione del codice avvengono in un secondo (terzo, quarto) tempo. –

+0

@Crowder: Grazie per la risposta. –

Problemi correlati