2009-07-27 20 views
5

Tôi đã đọc khá một chút về cách rò rỉ bộ nhớ được tạo ra trong các phiên bản khác nhau của IE. Một số thông tin tuyệt vời có thể được tìm thấy ở đây:Trên jquery, đóng cửa, và rò rỉ bộ nhớ có thể

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

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

Sử dụng đóng cửa với JQuery là một thực tế rất phổ biến. Tôi không thể tìm thấy bất kỳ bài báo nào nói đến mô hình sự kiện của JQuery (nơi mà các bao đóng được sử dụng nhiều) liên quan đến IE và rò rỉ bộ nhớ Trong bài viết thứ hai được đăng trên đây là một chiến lược để tránh rò rỉ bộ nhớ khi sử dụng các bao đóng.

JQuery đã triển khai một chiến lược tương tự như chiến lược được phác thảo trong bài viết liên quan đến việc giúp làm sạch rò rỉ tiềm ẩn khi sử dụng bao đóng? Hay đó là điều tôi phải biết và viết mã?

Ví dụ,

Tạo một rò rỉ bộ nhớ trong IE6/7:

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

không phiên bản JQuery sau của ví dụ trên gây ra rò rỉ bộ nhớ trong IE6/7?

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

Trả lời

4

từ jQuery 1.3 nguồn:

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

như bạn có thể thấy, nó loại bỏ tất cả các xử lý sự kiện và dữ liệu liên quan trước khi tháo một yếu tố và nó phần tử con.

+3

Không có gì trong câu hỏi về cách gọi phương thức .remove(). –

+3

Vấn đề rò rỉ nổi tiếng với IE xuất hiện khi bạn xóa một đối tượng DOM có trình xử lý sự kiện, có thể là một bao đóng chứa tham chiếu đến cùng một đối tượng DOM này. Giải pháp là xóa tất cả các trình xử lý sự kiện khỏi đối tượng DOM trước khi loại bỏ nó khỏi cây DOM. Phương thức .remove() của jQuery thực hiện chính xác điều đó. – Javier