Heim  >  Artikel  >  Web-Frontend  >  Umgang mit JS-Speicherlecks in Versionen vor IE9

Umgang mit JS-Speicherlecks in Versionen vor IE9

php中世界最好的语言
php中世界最好的语言Original
2018-06-01 17:24:511259Durchsuche

Dieses Mal zeige ich Ihnen, wie Sie mit Speicherlecks in JS-Versionen vor IE9 umgehen. Was sind die Vorsichtsmaßnahmen für den Umgang mit Speicherlecks in JS in Versionen vor IE9? . 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 einen Verweis 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 wiederverwendet 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 im Abschluss. Zirkelverweise. 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:

So verwenden Sie vue.extend, um die Popup-Komponente für die Alarmmodalbox zu implementieren


Wie um die Vue-Popup-Fenster-Nachrichtenkomponente zu verwenden

Das obige ist der detaillierte Inhalt vonUmgang mit 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