Heim >Web-Frontend >js-Tutorial >Eine ausführliche Diskussion über JavaScript-Speicherlecks_Javascript-Fähigkeiten

Eine ausführliche Diskussion über JavaScript-Speicherlecks_Javascript-Fähigkeiten

WBOY
WBOYOriginal
2016-05-16 16:31:281115Durchsuche

1. Was ein Abschluss ist und welche Umfangskette an dem Abschluss beteiligt ist, wird hier nicht besprochen.

2. JavaScript-Garbage-Collection-Mechanismus

JavaScript muss den Speicher nicht manuell freigeben, sondern verwendet einen automatischen Garbage-Collection-Mechanismus (Garbage Collection). Wenn ein Objekt nutzlos ist, das heißt, wenn keine Variable im Programm auf das Objekt verweist, wird die Variable aus dem Speicher freigegeben.

Code kopieren Der Code lautet wie folgt:

var s = [1, 2,3];
var s = null;
//Auf diese Weise wird das ursprüngliche Array [1,2,3] freigegeben.

3. Zirkelverweis

Drei Objekte A, B, C

AàBàC: Ein bestimmtes Attribut von A verweist auf B, und C wird auch durch ein Attribut von B referenziert. Wenn A gelöscht wird, werden auch B und C freigegeben.

AàBàCàB: Hier wird ein bestimmtes Attribut von C hinzugefügt, um auf das B-Objekt zu verweisen. Wenn dies A löschen soll, werden B und C nicht freigegeben, da ein Zirkelverweis zwischen B und C erzeugt wird.

Code kopieren Der Code lautet wie folgt:

var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//In diesem Fall werden auch {a:100} und {b:100} gleichzeitig freigegeben.
                                                                  var obj = {};
Obj.pro = { a : 100 };
Obj.pro.pro = { b : 200 };
var two = obj.pro.pro;
Obj = null;
//In diesem Fall wird {b:200} nicht freigegeben, aber {a:100} wird freigegeben.

4. Zirkelverweise und Abschlüsse

Code kopieren Der Code lautet wie folgt:
Funktion äußere(){
var obj = {};
Funktion inner(){
//Das obj-Objekt wird hier referenziert
}
         obj.inner = inner;
}

Dies ist ein äußerst versteckter Zirkelverweis. Wenn „outer“ einmal aufgerufen wird, werden darin zwei Objekte erstellt, „obj“ und „inner“. Um genau zu sein, das liegt an der einzigartigen „Bereichskette“ von JavaScript.

Daher ist es für Abschlüsse sehr einfach, Zirkelverweise zu erstellen. Glücklicherweise kann JavaScript solche Zirkelverweise sehr gut verarbeiten.

5. Speicherverlust im IE

Es gibt verschiedene Arten von Speicherlecks im IE, ausführliche Erklärungen finden Sie hier (

http://msdn.microsoft.com/en-us/library/bb250448.aspx).

Hier wird nur einer davon besprochen, nämlich der durch Zirkelverweise verursachte Speicherverlust, da dies die häufigste Situation ist.

Wenn es einen Zirkelverweis zwischen einem DOM-Element oder einem ActiveX-Objekt und einem normalen JavaScript-Objekt gibt, hat der IE besondere Schwierigkeiten, solche Variablen freizugeben. Dieser Fehler wurde im IE behoben 7 (

http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).

„IE 6 litt unter Speicherlecks, als ein Zirkelverweis zwischen mehreren Objekten, darunter mindestens einem DOM-Knoten, erstellt wurde. Dieses Problem wurde in IE 7 gelöst.“

Wenn sich obj im obigen Beispiel (Punkt 4) nicht auf ein JavaScript-Funktionsobjekt (inner), sondern auf ein ActiveX-Objekt oder Dom-Element bezieht, kann der im IE gebildete Zirkelverweis nicht freigegeben werden.

Code kopieren Der Code lautet wie folgt:

Funktion init(){
        var elem = document.getElementByid( 'id' );
          elem.onclick = function(){
alarm('rain-man');
//Das Elem-Element
wird hier referenziert         };
}

Elem bezieht sich auf seine Click-Event-Listening-Funktion, die über ihre Scope-Kette auch auf das Elem-Element verweist. Auf diese Weise werden diese Zirkelverweise auch dann nicht freigegeben, wenn Sie die aktuelle Seite im IE verlassen.

6. Lösung

Die grundlegende Methode besteht darin, diesen Zirkelverweis manuell zu löschen. In einer tatsächlichen Anwendung können Sie selbst eine addEvent()-Funktion erstellen und alle Ereignisbindungen für das Entladeereignis des Fensters löschen.

Code kopieren Der Code lautet wie folgt:

Funktion äußere(){
         var one = document.getElementById( 'one' );
         one.onclick = function(){};
}
​ window.onunload = function(){
         var one = document.getElementById( 'one' );
         one.onclick = null;
};

Andere Methoden (von: Douglas Crockford)

Code kopieren Der Code lautet wie folgt:

/**
* Durchlaufen Sie einen Elementknoten und alle seine untergeordneten Elemente
*
* @param Elem node Der zu löschende Elementknoten
* @param function func Die Funktion zur Verarbeitung von
*
​*/
Funktion walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (Knoten) {
         walkTheDOM(node, func);
Node = node.nextSibling; }
}
/**
* Löschen Sie alle Verweise auf Dom-Knoten, um Speicherlecks zu verhindern
*
* @param Elem node Der zu löschende Elementknoten
*
​*/
Funktion purgeEventHandlers(node) {
walkTheDOM(node, function (e) {
for (var n in e) {                                   If (typeof e[n] ===
                      'Funktion') {
                 e[n] = null;
            }
}
});


Das Obige ist der relevante Inhalt und die Lösungen für JavaScript-Speicherlecks. Freunde in Not können darauf verweisen
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn