(questo è abbastanza off-the-bracciale.)
uso di memoria è in effetti un problema è necessario essere interessati con l'attuale lo stato dell'arte del browser, sebbene a meno che non stiamo parlando di un bel po 'di codice, non so che la dimensione del codice sia il problema (di solito è la dimensione DOM e i gestori di eventi rimanenti).
È possibile utilizzare un modello per i moduli caricabili che renderebbe molto più facile scaricarli in massa, o almeno, per consentire al browser di conoscerlo, possibile scaricarli da.
consideri:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function MyModule() {
function foo() {
bar();
}
function bar() {
}
}
return MyModule;
})();
Che definisce una chiusura che contiene le funzioni foo
e bar
, che possono chiamare reciprocamente in modo normale. Si noti che il codice al di fuori delle funzioni viene eseguito immediatamente.
A patto che non si rinviino riferimenti a ciò che è contenuto nella chiusura a qualcosa al di fuori di esso, quindi window.MyModule sarà l'unico riferimento a tale chiusura e al relativo contesto di esecuzione. Per scaricarlo:
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
che racconta l'ambiente JavaScript non si sta usando più che la proprietà, e fa tutto ciò che fa riferimento a disposizione per la raccolta dei rifiuti. Quando e se tale raccolta avviene è ovviamente dipendente dall'implementazione.
Si noti che sarà importante se si agganciano i gestori di eventi all'interno del modulo per sganciarli prima dello scaricamento. Si potrebbe fare che restituendo un riferimento a una funzione distruttore al posto della chiusura principale:
window.MyModule = (function() {
alert('This happens the moment the module is loaded.');
function foo() {
bar();
}
function bar() {
}
function destructor() {
// Unhook event handlers here
}
return destructor;
})();
Sganciamento è quindi:
if (window.MyModule) {
try {
window.MyModule();
}
catch (e) {
}
try {
delete window.MyModule;
}
catch (e) {
// Work around IE bug that doesn't allow `delete` on `window` properties
window.MyModule = undefined;
}
}
Perché non eliminare MYAPP o MYAPP = non definito? – Dykam
Non solo la variabile stessa, ma anche tutte le chiusure che potrebbero essere create sono le funzioni all'interno. – txwikinger
@txwinker: Sì, credo di averlo sentito implicito. Affinché funzioni, non devono esserci riferimenti né a MYAPP né a qualcosa al suo interno. E ci sono alcuni dettagli pignoli quando si tratta di perdere memoria, e IE. @Dykam: Nessuna ragione per non andare indefinito, ma ho evitato di cancellare, dato che non ho molta esperienza con esso, e un "1" non dovrebbe mettere a dura prova la memoria su ciò che l'OP potrebbe fare. – Svend