2009-07-27 22 views
5

Czytałem sporo o tym, jak wycieki pamięci są tworzone w różnych wersjach IE. Kilka świetnych informacji można znaleźć tutaj:Na jquery, zamykania i ewentualnych wycieków pamięci

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

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

Korzystanie zamknięć z jQuery jest bardzo częstą praktyką. Nie mogę znaleźć żadnych artykułów mówiących o modelu zdarzeń JQuery'ego (gdzie zamknięcia są intensywnie używane) w odniesieniu do IE i wycieków pamięci W drugim artykule zamieszczonym powyżej jest strategia, aby uniknąć wycieków pamięci podczas korzystania z zamknięć.

Czy JQuery stosuje już strategię podobną do opisanej w artykule w odniesieniu do pomocy w usuwaniu potencjalnych wycieków podczas zamykania? Czy jest to coś, o czym muszę wiedzieć i kodować?

Przykładowo

Tworzy wyciek pamięci IE6/7:

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

sposób Kolejna wersja JQuery z powyższego przykładu spowodować wyciek pamięci IE6/7?

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

Odpowiedz

4

z jQuery 1.3 źródło:

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

jak widać, usuwa wszelkie obsługi zdarzeń i danych przed usunięciem elementu i jego elementy podrzędne.

+3

Nie ma nic w pytaniu o wywołanie metody .remove(). –

+3

Dobrze znany problem wycieku z IE pojawia się po usunięciu obiektu DOM, który ma procedury obsługi zdarzeń, które mogą być zamknięciem, które zawiera odniesienie do tego samego obiektu DOM. Rozwiązaniem jest usunięcie wszystkich procedur obsługi zdarzeń z obiektu DOM przed usunięciem z drzewa DOM. Metoda jQuery .remove() robi dokładnie to. – Javier

Powiązane problemy