Heim > Web-Frontend > js-Tutorial > Problem mit JavaScript-Speicherlecks in Versionen vor IE9 (detaillierte Zusammenfassung)

Problem mit JavaScript-Speicherlecks in Versionen vor IE9 (detaillierte Zusammenfassung)

亚连
Freigeben: 2018-05-21 15:15:18
Original
1558 Leute haben es durchsucht

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);
  };
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage