Heim > Artikel > Web-Frontend > Problem mit JavaScript-Speicherlecks in Versionen vor IE9 (detaillierte Zusammenfassung)
Dieser Artikel fasst das Speicherverlustproblem von JavaScript in Versionen vor IE9 zusammen. Freunde, die sich dafür interessieren, können mehr darüber erfahren.
Versionen vor IE9 verwenden unterschiedliche Garbage-Collection-Routinen für JScript-Objekte und COM-Objekte (COM-Objekte verwenden eine „Referenzzählung“-Sammelstrategie), sodass Schließungen in diesen IE-Versionen einige besondere Probleme verursachen. Wenn ein HTML-Element im Bereich des Abschlusses gespeichert wird, bedeutet dies insbesondere, dass das Element nicht zerstört werden kann.
Sehen Sie sich das folgende Beispiel an:
function assignHandler() { var elem = document.getElementById('elem_id'); elem.onclick = function(evt) { alert(elem.id); }; }
Der obige Code erstellt einen Abschluss, der als Ereignishandler für das Element elem fungiert, das wiederum erstellt erstellt ein Zirkelverweis. Da die anonyme Funktion eine Referenz auf das aktive Objekt von „assignHandler()“ speichert, ist es nicht möglich, die Anzahl der Elem-Referenzen zu reduzieren. Solange die anonyme Funktion vorhanden ist, beträgt die Referenznummer von elem mindestens 1, sodass der von ihr belegte Speicher niemals recycelt wird.
Sie können das Problem lösen, indem Sie den obigen Code leicht ändern:
function assignHandler() { var elem = document.getElementById('elem_id'); var elem_id = elem.id; elem.onclick = function(evt) { alert(elem_id); }; elem = null; }
Indem Sie eine Kopie von elem.id in einem speichern Variable, und der Verweis auf diese Variable im Abschluss eliminiert den Zirkelverweis. Aber allein durch diesen Schritt kann das Speicherverlustproblem immer noch nicht gelöst werden.
"Der Abschluss bezieht sich auf das gesamte aktive Objekt, das die Funktion enthält, die elem enthält. Auch wenn der Abschluss nicht direkt auf elem verweist, wird dennoch eine Referenz im aktiven Objekt gespeichert, das die Funktion enthält. Daher gilt: Es ist notwendig, elem auf null zu setzen. Auf diese Weise können Sie das DOM-Objekt dereferenzieren, seine Anzahl an Referenzen erfolgreich reduzieren und die normale Wiederverwendung des von ihm belegten Speichers sicherstellen , und ich hoffe, dass es Ihnen in Zukunft hilfreich sein wird.
Verwandte Artikel:
JavaScript hasOwnProperty()-Funktion (Bild- und Text-Tutorial, mit Codebeispielen) Javascript The for in loop und hasOwnProperty werden zusammen verwendet Der Unterschied zwischen JavaScript isPrototypeOf und hasOwnProperty (praktisch)
Das obige ist der detaillierte Inhalt vonProblem mit JavaScript-Speicherlecks in Versionen vor IE9 (detaillierte Zusammenfassung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!