Maison  >  Article  >  interface Web  >  Résumer le problème de fuite de mémoire de JavaScript dans les versions antérieures à IE9

Résumer le problème de fuite de mémoire de JavaScript dans les versions antérieures à IE9

青灯夜游
青灯夜游avant
2018-10-09 14:38:171987parcourir

Cet article résume le problème de fuite de mémoire de JavaScript dans les versions antérieures à IE9. Les amis intéressés peuvent en prendre connaissance.

Les versions antérieures à IE9 utilisent différentes routines de garbage collection pour les objets JScript et les objets COM (les objets COM utilisent une stratégie de collecte de « comptage de références »), donc les fermetures provoqueront des problèmes particuliers dans ces versions d'IE. Plus précisément, si un élément HTML est stocké dans la portée de la fermeture, cela signifie que l'élément ne peut pas être détruit.
Regardez l'exemple suivant :

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

Le code ci-dessus crée une fermeture qui agit comme un gestionnaire d'événements pour l'élément elem, et cette fermeture crée une référence circulaire. Puisque la fonction anonyme enregistre une référence à l'objet actif de assignHandler(), il sera impossible de réduire le nombre de références d'éléments. Tant que la fonction anonyme existe, le numéro de référence d'elem est au moins 1, donc la mémoire qu'elle occupe ne sera jamais recyclée.

Le code ci-dessus peut être résolu avec une légère modification :

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

En enregistrant une copie de elem.id dans une variable et dans la fermeture Le référencement de cette variable élimine la circulaire référence. Mais le simple fait de suivre cette étape ne peut toujours pas résoudre le problème de fuite de mémoire.

"La fermeture fera référence à l'intégralité de l'objet actif contenant la fonction, qui contient des éléments. Même si la fermeture ne fait pas directement référence à des éléments, une référence sera quand même enregistrée dans l'objet actif contenant la fonction. Par conséquent, il est nécessaire de définir elem sur null. Cela déréférencera l'objet DOM, réduira avec succès son nombre de références et assurera un recyclage normal de la mémoire qu'il occupe."

Résumé : ce qui précède est l'intégralité du contenu de cet article. , j’espère que c’est possible. Cela sera utile à l’étude de chacun. Pour plus de didacticiels connexes, veuillez visiter le Tutoriel vidéo JavaScript !

Recommandations associées :

Tutoriel vidéo de formation sur le bien-être public php

Tutoriel graphique JavaScript

Manuel JavaScript en ligne

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer