2011-02-02 8 views
11

E 'OK per fare questo ?:`new` senza` delete` sulla stessa variabile in Javascript

function mygetTime() 
{ 
    var d = new Date(); 
    return(d.getTime()); 
} 

function wasteSomeMemory() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = mygetTime(); 
    } 
} 

Sarà chiamando wasteSomeMemory() causa una perdita di memoria?

Che dire di questo:

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
    } 
} 

Sarà chiamando wasteSomeMemory2() causa una perdita di memoria? Dovrei usare delete temp; alla fine del ciclo?

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
     delete temp; 
    } 
} 

risposta

29

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)

4

La risposta breve è no.

La lunga risposta è che speriamo di trovare il garbage collector di raccolte.

Problemi correlati