2009-07-27 1 views
5

Я читал довольно много о том, как утечки памяти создаются в различных версиях IE. Некоторой большая информации можно найти здесь:О jquery, замыканиях и возможных утечках памяти

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

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

Использования затворов с JQuery является очень распространенной практикой. Я не могу найти статей вообще, которые говорят с моделью событий JQuery (где закрытие сильно используется) в отношении IE и утечек памяти. Во второй статье, опубликованной выше, есть стратегия, позволяющая избежать утечек памяти при использовании закрытий.

Содержит ли JQuery стратегию, аналогичную описанной в статье, в том, что касается очистки потенциальных утечек при использовании закрытий? Или это то, о чем я должен знать и код?

Например,

Создает утечку памяти в IE6/7:

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

выполняет следующие версии JQuery из приведенного выше примера вызвать утечку памяти в IE6/7?

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

ответ

4

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

, как вы можете видеть, он удаляет все обработчик событий и связанные с ними данные перед удалением элемента и его дочерних элементов.

+3

В вызове метода .remove() ничего нет. –

+3

Известная проблема с утечкой в ​​IE возникает, когда вы удаляете объект DOM с обработчиками событий, который может быть закрытием, содержащим ссылку на этот же объект DOM. Решение состоит в том, чтобы удалить все обработчики событий из объекта DOM, прежде чем удалять его из дерева DOM. Этот метод jQuery's .remove() делает именно это. – Javier