2009-07-27 11 views
5

He leído bastante sobre cómo se crean fugas de memoria en varias versiones de IE. una gran información se puede encontrar aquí:En jquery, cierres y posibles fugas de memoria

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

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

El uso de cierres con jQuery es una práctica muy común. No puedo encontrar ningún artículo que se relacione con el modelo de eventos de JQuery (donde los cierres son muy utilizados) con respecto a IE y fugas de memoria. En el segundo artículo publicado anteriormente, se trata de una estrategia para evitar fugas de memoria cuando se usan cierres.

¿JQuery ya implementa una estrategia similar a la descrita en el artículo con respecto a ayudar a limpiar posibles fugas cuando se usan cierres? ¿O es algo que debo conocer y codificar?

Por ejemplo,

Crea una pérdida de memoria en IE6/7:

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

hace lo siguiente versión JQuery del ejemplo anterior causa una pérdida de memoria en IE6/7?

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

Respuesta

4

de jQuery 1.3 fuente:

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); 
    } 
}, 

como se puede ver, que elimina todos los controladores de eventos y datos relacionados antes de retirar un elemento y es sub-elementos.

+3

No hay nada en la pregunta sobre la invocación del método .remove(). –

+3

El conocido problema de fuga con IE aparece cuando elimina un objeto DOM que tiene controladores de eventos, que puede ser un cierre que contiene una referencia a este mismo objeto DOM. La solución es eliminar todos los controladores de eventos del objeto DOM antes de eliminarlo del árbol DOM. El método .remove() de jQuery hace exactamente eso. – Javier