2010-04-22 22 views
8

Qual è la durata di una variabile in JavaScript, dichiarata con "var". Sono sicuro, non è sicuramente secondo le aspettative.Durata delle variabili JavaScript

<script> 
function(){ 
    var a; 
    var fun=function(){ 
    // a is accessed and modified 
    } 
}(); 


</script> 

Ecco come e quando fa spazzatura JavaScript raccoglie la variabile a? Poiché a è una parte della chiusura della funzione interna, idealmente non dovrebbe mai raccogliere i dati inutili, poiché la funzione interna fun può essere passata come riferimento a un contesto esterno. Quindi fun dovrebbe essere ancora in grado di accedere a a dal contesto esterno.

Se la mia comprensione è corretta, come avviene la raccolta di dati inutili allora, e come garantisce di avere abbastanza spazio di memoria, dal momento che mantenere tutte le variabili in memoria fino a quando l'esecuzione del programma potrebbe non essere sostenibile?

+0

Questa è una bella domanda tra. Sottolinea che la chiusura stessa non è l'unica cosa che viene tenuta in memoria fino a quando la chiusura non viene eseguita in GC. Lo è anche l'intera catena di visibilità della funzione. Sembra che ci sia qualche controversia, ma qualche pensiero aggiuntivo sembrerebbe indicare che ogni dichiarazione di funzione in JavaScript è una chiusura, relativa all'ambito globale. Tuttavia c'è un'eccezione [vedi questa risposta] (http://stackoverflow.com/a/30252865/511795) – Shanimal

risposta

4

La specifica ECMAScript non specifica il modo in cui il garbage collector dovrebbe funzionare, ma dice solo che se un identificatore è raggiungibile (tramite un puntatore diretto o una chiusura), non dovrebbe essere GCed.

Verificare l'articolo this relativo alla risoluzione dell'identificatore, alle chiusure, al concatenamento di ambito e alla garbage collection in ECMAScript.

Speranza che aiuta

1

'a' non sarà garbage collection finché ci sono i riferimenti esterni per 'divertimento'. Il browser assicura che abbia abbastanza memoria chiedendo più memoria dal sistema operativo.

+0

"Il browser assicura che abbia abbastanza memoria chiedendo più memoria dal sistema operativo." - lol ... abbastanza giusto :-) – osa

Problemi correlati