new
e delete
hanno nulla a che fare con l'altro in JavaScript (nonostante la loro somiglianza confusione costrutti completamente diverse in altre lingue). Non preoccuparti di creare oggetti (new
) senza pulirli esplicitamente, questo è il lavoro del garbage collector.
new
è per la creazione di oggetti tramite le funzioni di costruzione. delete
, d'altra parte, serve per rimuovere le proprietà dagli oggetti. Non ha a disposizione niente da da rimuovere un oggetto dalla memoria, se non come un effetto collaterale (ad esempio, se l'unico riferimento in sospeso a quell'oggetto proveniva dalla proprietà che hai rimosso).
Esempio di corretto utilizzo delle delete
:
var obj = {};
obj.foo = "bar"; // Now `obj` has a property called `foo`
delete obj.foo; // Now it doesn't
La vostra funzione getmyTime
è perfettamente bene. L'oggetto Date
diventerà idoneo per essere ritirato immediatamente dopo il ritorno di funzione (se è è recuperato è completamente giù all'implementazione). Non causa una perdita di memoria, tranne che per un'implementazione di bug.
tuo wasteSomeMemory2
simile non causa una perdita di memoria, e in effetti si può non chiamata delete temp;
— è possibile eliminare solo le proprietà, non Vars.
Ci sono momenti in cui bisogna aiutare il garbage collector fuori, ma quelli di solito non lo fanno (nella mia esperienza) hanno a che fare con le proprietà degli oggetti e quindi non comportano delete
. Si verificano davvero solo quando si creano istanze di funzioni (che è abbastanza frequente, se si impostano gestori di eventi o funzioni timer, ecc.). Per esempio, si consideri:
function foo() {
var listOfThings = /* ...get a list of things... */;
// ...do something with `listOfThings`...
setInterval(function() {
// ...do something that *doesn't* need `listOfThings`...
}, 1000);
}
Perché la vostra funzione anonima avete assegnato ad un timer tramite setInterval
sopravviverà la chiamata di funzione, mantiene un riferimento vivo a tutto ciò che era in-scope durante quella chiamata di funzione (sia che si tratti lo usa o no). Questo mantiene l'elenco delle cose che listOfThings
indica nella memoria. Se la funzione timer non ha bisogno di quella lista, è una preoccupazione. È possibile rilasciare la lista che listOfThings
punta a se si sa che la funzione non ne ha bisogno, assegnando undefined
o null
o qualsiasi altra cosa per listOfThings
quando hai finito con esso:
function foo() {
var listOfThings = /* ...get a list of things... */;
// ...do something with `listOfThings`...
listOfThings = undefined; // Done with it <== The new bit
setInterval(function() {
// ...do something that *doesn't* need `listOfThings`...
}, 1000);
}
Lo stesso vale per funzioni del gestore di eventi, ecc.Ogni volta che crei una funzione, "si chiude" (mantiene un riferimento in tempo reale) qualsiasi cosa nel campo di applicazione in cui è stata definita. Quindi, se non hai bisogno di queste cose, puoi assicurarti che non vengano conservate in memoria cancellando i riferimenti ad esse. (Altro: Closures are not complicated)