2012-03-16 24 views
7

sto ottenendo questo errore con JSLint: Solo gli oggetti devono essere cancellatiSolo gli oggetti devono essere cancellati

Perché non è vero come questo? La variabile che sto tentando di eliminare è molto grande, quindi speravo di ottenere un salto sulla garbage collection. Non è ok?

+3

Non è possibile eliminare le variabili, solo le proprietà dell'oggetto. Quindi anche se 'var a = 5; cancella a; 'non lancia un errore (in realtà lo fa in * strict mode *), non fa nulla neanche (' delete a; 'restituirà' false'). Quindi: è un codice valido, ma non fa quello che vuoi, quindi è solo confuso. –

+0

@FelixKling No, non è questo il fatto. In realtà è possibile eliminare le variabili eliminando l'operatore. È possibile scrivere ed eseguire un codice di prova. 'var a = 11; avviso (cancella a); alert (typeof a); ' avviserà true e" undefined ". – cuixiping

+3

@cuixiping Felix Kling ha ragione. Non è possibile eliminare variabili (locali) usando 'delete'. Le variabili globali sono diverse perché in realtà sono proprietà associate all'oggetto 'window'. – NullUserException

risposta

11

delete si intende eliminare proprietà su un oggetto, non variabili regolari (proprietà su un oggetto Variable).

Invece, è possibile impostare tutti i riferimenti al valore come null. Il GC di JavaScript lo pulirà quando lo riterrà necessario.

2

se si vuole solo sbarazzarsi di avvertimento JSLint, si può provare questo:

var myHugeVariable = ...; 

// do stuff with huge variable 

delete window.myHugeVariable; 

questo dovrebbe funzionare dal momento che tutte le variabili globali sono in realtà proprietà dell'oggetto globale.

+0

E riguardo le variabili locali? ;) –

+0

@FelixKling buona domanda. Sono sicuro al 70% che tutte le variabili dichiarate ovunque debbano essere proprietà di qualche oggetto, è solo questione di capire quale oggetto esse esistano. – jbabey

+0

@jbabey Le variabili normali sono proprietà di un oggetto VariableObject di un contesto di esecuzione, che non dispone di un'interfaccia pubblica nell'API JavaScript. Per quanto riguarda la mia memoria delle specifiche, almeno: P – alex

1

Normalmente, non è necessario rilasciare variabili. Il motore javascript esegue automaticamente queste cose.

Oppure, è possibile lasciare la variabile uguale a non definita, in modo da poter passare il controllo jslint.

var a=11; 
a = undefined; 

Non consigliato.

Problemi correlati