Da quanto ho capito, gestione della memoria in JavaScript viene realizzata mediante conteggio riferimento - mentre un riferimento a un oggetto esiste ancora, non sarà deallocato. Ciò significa che la creazione di una perdita di memoria in un'applicazione a singola pagina è banale e può far scattare quelli di utilizzo provenienti da uno sfondo java. Questo non è specifico per JQuery. Prendi ad esempio il seguente codice:
function MyObject = function(){
var _this = this;
this.count = 0;
this.getAndIncrement = function(){
_this.count++;
return _this.count;
}
}
for(var i = 0; i < 10000; i++){
var obj = new MyObject();
obj.getAndIncrement();
}
Sembrerà normale fino a quando non guardi l'utilizzo della memoria. Le istanze di MyObject non vengono mai deallocate mentre la pagina è attiva, a causa del puntatore "_questo" (aumentare il valore massimo di i per vederlo in modo più drammatico). (Nelle versioni precedenti di IE non erano mai stati rilasciati fino alla chiusura del programma.) Dal momento che gli oggetti javascript possono essere condivisi tra i frame (non è consigliabile provarli poiché è estremamente problematico.), Ci sono casi in cui anche in un browser moderno javascript gli oggetti possono durare molto più a lungo di quanto dovrebbero.
Nel contesto di jQuery, i riferimenti sono spesso conservati per salvare l'overhead di ricerca dom - per esempio:
function run(){
var domObjects = $(".myClass");
domObjects.click(function(){
domObjects.addClass(".myOtherClass");
});
}
Questo codice mantenere il domObject (e tutto il suo contenuto) per sempre, a causa della riferimento ad esso nella funzione di callback.
Se gli scrittori di jquery hanno saltato istanze come questa internamente, allora la libreria stessa perde, ma più spesso è il codice client.
Il secondo esempio può essere corretto pulendo esplicitamente il puntatore quando non è richiesto:
function run(){
var domObjects = $(".myClass");
domObjects.click(function(){
if(domObjects){
domObjects.addClass(".myOtherClass");
domObjects = null;
}
});
}
o rifare la ricerca:
function run(){
$(".myClass").click(function(){
$(".myClass").addClass(".myOtherClass");
});
}
Una buona regola è di essere attento dove si definiscono le funzioni di callback ed evitare troppi nidi ove possibile.
Edit: Come è stato sottolineato nei commenti di Erik, si potrebbe anche usare il puntatore this per evitare il unnescessary dom ricerca:
function run(){
$(".myClass").click(function(){
$(this).addClass(".myOtherClass");
});
}
Ecco un esempio: http://jsfiddle.net/qTu6y/8/ Puoi utilizzare Chrome "Take a heapshot" nel profiler per vedere che ogni esecuzione di quel blocco di codice consuma circa 20 MB di RAM. (Durante il test ho colpito lo "Script usato troppo errore RAM su chrome") – Raynos
+1 per "quelli di noi provenienti da uno sfondo Java" ... e per la spiegazione lucida. – Thimmayya
$ (this) .addClass sarebbe meglio per le prestazioni nell'ultimo caso poiché 'this' rappresenta una raccolta di elementi JS DOM core (che è ciò che gli oggetti JQuery tipicamente stanno eseguendo wrapping usando un modello stile adattatore) e JQ non dovrà accedi nuovamente al DOM o analizza ogni singolo elemento DOM sulla pagina nel caso di