2009-07-27 8 views
5

J'ai lu un peu sur la façon dont les fuites de mémoire sont créées dans diverses versions de IE. Une bonne informations peuvent être trouvées ici:Sur JQuery, les fermetures et les fuites de mémoire possibles

http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

http://laurens.vd.oever.nl/weblog/items2005/closures/

En utilisant des fermetures avec JQuery est une pratique très courante. Je ne trouve aucun article qui parle du modèle d'événement de JQuery (où les fermetures sont fortement utilisées) en ce qui concerne IE et les fuites de mémoire Dans le deuxième article posté ci-dessus est une stratégie pour éviter les fuites de mémoire lors de l'utilisation des fermetures.

Est-ce que JQuery met déjà en œuvre une stratégie similaire à celle décrite dans l'article pour aider à nettoyer les fuites potentielles lors de l'utilisation des fermetures? Ou est-ce quelque chose dont je dois être conscient et que je code?

Par exemple,

Crée une fuite de mémoire dans IE6/7:

 
function foo(value) { 
    var bar = document.getElementById("selector"); 
    bar.attachEvent("onclick", 
     // closure 
     function() { 
      alert(value); // reference to 'value' from outer function scope 
     } 
    ); 
} 

que la version JQuery suivante de l'exemple ci-dessus provoque une fuite de mémoire dans IE6/7?

 
function foo(value) { 
    $('#selector').click(
     // closure 
     function() { 
      alert(value); // reference to 'value' from outer function scope 
     } 
    ); 
} 

Répondre

4

de la source jQuery 1.3:

remove: function(selector) { 
    if (!selector || jQuery.filter(selector, [ this ]).length) { 
     // Prevent memory leaks 
     jQuery("*", this).add([this]).each(function(){ 
      jQuery.event.remove(this); 
      jQuery.removeData(this); 
     }); 
     if (this.parentNode) 
      this.parentNode.removeChild(this); 
    } 
}, 

comme vous pouvez le voir, il supprime tous les gestionnaires d'événements et les données connexes avant de retirer un élément et il est sous-éléments.

+3

Il n'y a rien dans la question concernant l'appel de la méthode .remove(). –

+3

Le problème de fuites bien connu avec IE se produit lorsque vous supprimez un objet DOM qui a des gestionnaires d'événements, ce qui peut être une fermeture qui contient une référence à ce même objet DOM. La solution consiste à supprimer tous les gestionnaires d'événements de l'objet DOM avant de les supprimer de l'arborescence DOM. La méthode .remove() de jQuery fait exactement cela. – Javier

Questions connexes