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.
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.
Daher ist es für Abschlüsse sehr einfach, Zirkelverweise zu erstellen. Glücklicherweise kann JavaScript solche Zirkelverweise sehr gut verarbeiten.
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.
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.
Andere Methoden (von: Douglas Crockford)