1. Was ist ein Verschluss und die in den Verschluss beteiligte Bereichskette wird hier nicht diskutiert.
2. Mechanismus für JavaScript -Müllsammlung
JavaScript muss kein manuell freies Speicher haben, sondern ein automatischer Müllsammlungsmechanismus. Wenn ein Objekt nutzlos ist, wird die Variable aus dem Speicher freigegeben, wenn sich keine Variable im Programm auf das Objekt bezieht.
Die Codekopie lautet wie folgt:
var s = [1, 2,3];
var s = null;
// Auf diese Weise wird das ursprüngliche Array [1, 2, 3] veröffentlicht.
3.. Zitat recyceln
Drei Objekte a, b, c
Aàbàc: Ein bestimmtes Attribut von A bezieht sich auf B, und C wird auch durch Bs Attribut verwiesen. Wenn A gelöscht wird, werden auch B und C freigelassen.
Aàbàcàb: Hier wird ein bestimmtes Attribut von C hinzugefügt, um sich auf das B -Objekt zu beziehen. Wenn dies A löschen soll, wird B und C nicht freigesetzt, da zwischen B und C eine kreisförmige Referenz erzeugt wird
Die Codekopie lautet wie folgt:
var a = {};
A.Pro = {a: 100};
A.Pro.Pro = {b: 100};
a = null;
// In diesem Fall werden {A: 100} und {B: 100} gleichzeitig veröffentlicht.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var zwei = obj.pro.pro;
obj = null;
// In diesem Fall wird {B: 200} nicht veröffentlicht, während {A: 100} veröffentlicht wird.
4. Recyceln Sie Referenzen und Schließungen
Die Codekopie lautet wie folgt:
Funktion ober () {
var obj = {};
Funktion inner () {
// Das OBJ -Objekt wird hier verwiesen
}
obj.inner = inner;
}
Dies ist eine Art und versteckte kreisförmige Referenz. Wenn das Außenbereich einmal aufgerufen wird, werden zwei Objekte OBJ und Innere darin erstellt. Objs inneres Eigentum bezieht sich auf innere; Ähnlich innerlich bezieht sich auch OBJ, da sich OBJ noch in der geschlossenen Umgebung von Innerfun befindet. Um genau zu sein, ist dies auf die einzigartige "Scope -Kette" von JavaScript zurückzuführen.
Daher sind Verschlüsse sehr leicht zu kreisförmigen Referenzen zu erstellen, und zum Glück kann JavaScript solche kreisförmigen Referenzen sehr gut bewältigen.
5. Speicherleck in IE
Es gibt mehrere Speicherlecks im IE, und hier gibt es eine detaillierte Erklärung (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Nur eines davon wird hier diskutiert, nämlich Speicherlecks, die durch kreisförmige Referenzen verursacht werden, da dies die häufigste Situation ist.
Wenn es eine Schleifenreferenz zwischen einem DOM -Element oder einem ActiveX -Objekt und einem normalen JavaScript -Objekt gibt, hat der IE besondere Schwierigkeiten bei der Freigabe solcher Variablen. Es ist am besten, die Loop -Referenz manuell zu schneiden. Dieser Fehler wurde in IE 7 behoben (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
"IE 6 litt unter Speicherlecks, als eine kreisförmige Referenz zwischen mehreren Objekten, zu denen mindestens ein Dom -Knoten, erstellt wurde. Dieses Problem wurde in IE 7 gelöst."
Wenn OBJ im obigen Beispiel (Punkt 4) nicht auf ein JavaScript -Funktionsobjekt (innerlich), sondern ein ActiveX -Objekt oder ein DOM -Element verweist, kann die in IE gebildete kreisförmige Referenz nicht freigegeben werden.
Die Codekopie lautet wie folgt:
Funktion init () {
var elem = document.getElementById ('id');
elem.onclick = function () {
Alarm ('Rain-Man');
// Das Elem -Element wird hier verwiesen
};
}
Elem bezieht sich auf die Hörfunktion des Klickereignisses, und die Funktion verweist auch das Elem -Element über seine Bereichskette. Auf diese Weise werden diese kreisförmigen Referenzen, selbst wenn Sie die aktuelle Seite in IE verlassen, nicht veröffentlicht.
6. Lösung
Die grundlegende Methode besteht darin, diese kreisförmige Referenz manuell zu löschen. Das Folgende ist ein sehr einfaches Beispiel. Wenn Sie es verwenden, können Sie selbst eine AddEvent () -Funktion erstellen und alle Ereignisbindungen auf dem Entladenereignis des Fensters löschen.
Die Codekopie lautet wie folgt:
Funktion ober () {
var One = document.getElementById ('One');
One.onclick = function () {};
}
window.onunload = function () {
var One = document.getElementById ('One');
einclick = null;
};
Andere Methoden (von: Douglas Crockford)
Die Codekopie lautet wie folgt:
/**
* Durch einen bestimmten Elementknoten und alle Nachkommenselemente durchführen
*
* @param Elem -Knoten Der zu löschende Elementknoten
* @Param Function Func -Funktion zur Verarbeitung
*
*/
Funktion WalkThedom (Knoten, func) {
Func (Knoten);
node = node.Firstchild;
while (knoten) {
WalkThedom (Knoten, Func);
node = node.nextsibling;
}
}
/**
* Löschen Sie alle Referenzen aus dem DOM -Knoten, um Speicherleckage zu verhindern
*
* @param Elem -Knoten Der zu löschende Elementknoten
*
*/
Funktion purgeEventHandlers (Knoten) {
WalkThedom (Knoten, Funktion (e) {
für (var n in e) {
if (typeof e [n] ===
'Funktion') {
e [n] = null;
}
}
});
Das obige sind die relevanten Inhalte und Lösungen für JavaScript -Speicherlecks. Freunde, die es brauchen, können sich darauf beziehen.