Heim  >  Artikel  >  Web-Frontend  >  So vermeiden Sie JS-Speicherlecks in Versionen vor IE9

So vermeiden Sie JS-Speicherlecks in Versionen vor IE9

php中世界最好的语言
php中世界最好的语言Original
2018-05-15 10:25:421174Durchsuche

Dieses Mal werde ich Ihnen zeigen, wie Sie Speicherlecks von JS in Versionen vor IE9 vermeiden können und welche Vorsichtsmaßnahmen es gibt, um Speicherlecks von JS in Versionen vor IE9 zu vermeiden. Das Folgende ist ein praktischer Fall: Werfen wir einen Blick darauf.

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 insbesondere ein HTML-Element im Gültigkeitsbereich des Abschlusses gespeichert ist, bedeutet dies, 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-Programm des elem-Elements dient, und dieser Abschluss erstellt einen Zirkelverweis. Da die anonyme Funktion eine Referenz auf das aktive Objekt von „assignHandler()“ speichert, ist es unmö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.

Der obige Code kann mit einer leichten Modifikation gelöst werden:

function assignHandler() {
  var elem = document.getElementById('elem_id');
  var elem_id = elem.id;
  elem.onclick = function(evt) {
    alert(elem_id);
  };
  elem = null;
}

Eliminiert durch Speichern einer Kopie von elem.id in einer Variablen und Verweisen auf die Variable in den Abschlusszirkelreferenzen. 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. Dadurch wird der Verweis auf das DOM-Objekt entfernt, die Anzahl der Verweise wird sanft reduziert und die normale Wiederverwendung des von ihm belegten Speichers sichergestellt Ich glaube, Sie haben den Fall in diesem Artikel gelesen. Nachdem Sie die Methode gemeistert haben, lesen Sie bitte andere verwandte Artikel auf der chinesischen PHP-Website, um weitere spannende Inhalte zu erhalten!

Empfohlene Lektüre:

Detaillierte Erläuterung der Schritte zur Implementierung von dynamischem und statischem Paging in Laui


vue+jquery+ lodash top schwebt beim Gleiten Detaillierte Erläuterung der Implementierung fester Funktionen

Das obige ist der detaillierte Inhalt vonSo vermeiden Sie JS-Speicherlecks in Versionen vor IE9. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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