I motori moderni non avrebbero mantenuto le variabili inutilizzate nell'ambito esterno.
Pertanto, non importa se si imposta data = null
prima di restituire la funzione interna, poiché la funzione interna non dipende da ("close over") data
.
Se la funzione interna fatto dipendono data
--perhaps lo ritorna in risposta - quindi impostando data = null
è certamente non ciò che si vuole, perché poi, beh, sarebbe nullo invece di avere il suo valore originale !
Assumendo che la funzione interna non dipendere data
, allora sì, purché inner
si punta (previste) qualcosa, allora il valore di data
dovrà essere mantenuta intorno. Ma è quello che stai dicendo che vuoi! Come puoi avere qualcosa a disposizione senza che sia disponibile?
Ricordare che a un certo punto la variabile che contiene il valore di ritorno di f()
non sarà più disponibile. A questo punto, almeno fino al momento in cui viene chiamato di nuovo f()
, il valore data
verrà raccolto automaticamente.
La regola generale è che non è necessario preoccuparsi della memoria e perdite con JavaScript. Questo è il punto centrale di GC. Il garbage collector fa un ottimo lavoro nell'individuare ciò che è necessario e ciò che non è necessario, e mantenere il primo e l'immondizia nel raccogliere quest'ultimo.
Si può prendere in considerazione il seguente esempio:
function foo() {
var x = 1;
return function() { debugger; return 1; };
}
function bar() {
var x = 1;
return function() { debugger; return x; };
}
foo()();
bar()();
ed esaminare la sua esecuzione in Chrome DevTools finestra variabile. Quando il debugger si arresta nella funzione interna di foo
, notare che x
non è presente come variabile locale o come chiusura. Per tutti gli scopi pratici, non esiste.
Quando il debugger si arresta nella funzione interna di bar
, vediamo la variabile x
, perché doveva essere conservata in modo da essere accessibile per poter essere restituita.
Ciò vale oggi? O questo articolo è obsoleto?
No, non lo è, e sì, lo è. L'articolo ha quattro anni, che è una vita nel mondo del web. Non ho modo di sapere se jQuery è ancora soggetto a perdite, ma sarei sorpreso se lo fosse, e se è così, c'è un modo abbastanza semplice per evitarli - non usare jQuery. Le fughe che l'autore dell'articolo menziona relative ai loop DOM e ai gestori di eventi non sono presenti nei browser moderni, con cui intendo IE10 (più probabile IE9) e sopra. Ti suggerirei di trovare un riferimento più aggiornato se vuoi veramente capire le perdite di memoria. In realtà, ti suggerirei principalmente di smettere di preoccuparti delle perdite di memoria. Si verificano solo in situazioni molto specializzate. È difficile trovare molto sull'argomento sul web in questi giorni per quella precisa ragione. Ecco un articolo che ho trovato: http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html.
Grazie a torazaburo. Ciò che mi preoccupa è che l'ultimo frammento nell'articolo che hai fornito sul bug di Meteor effettivamente perde memoria in V8. – Jonathan
"In realtà, ti suggerisco di smettere principalmente di preoccuparti delle perdite di memoria, si verificano solo in situazioni molto specializzate". Sono fortemente in disaccordo con questa affermazione. Almeno i DOM distaccati sono un evento frequente nelle SPA e ogni sviluppatore deve saperlo. –