2010-04-13 39 views
7

Nếu tôi sử dụng addEventListener để đăng ký một sự kiện trên một phần tử, sau đó xóa phần tử mà không xóa sự kiện và tôi đã làm điều này nhiều lần tôi có thể tạo rò rỉ bộ nhớ không?javascript addEventListener memory-leaks question

Trả lời

4

Nó không bị rò rỉ. Một trình duyệt nổi tiếng vì bị rò rỉ như địa ngục khi một trình xử lý sự kiện gây ra một đối tượng host <> vòng lặp đối tượng JS là IE (lên đến phiên bản 7) và IE (lên đến phiên bản 8) không hỗ trợ addEventListener.

Rời khỏi hoạt động này và xem cách sử dụng bộ nhớ của trình duyệt bị ảnh hưởng trong thời gian dài, nếu bạn muốn thử nghiệm nó trong một trình duyệt cụ thể.

<div id="x"></div> 
<script type="text/javascript"> 
    function replace() { 
     var x= document.getElementById('x'); 
     if (x.firstChild!==null) 
      x.removeChild(x.firstChild); 
     var el= document.createElement('p'); 
     el.addEventListener('click', click, false); 
     x.appendChild(el); 
    } 
    function click() { 
     alert('click'); 
    }; 
    setInterval(replace, 1); 
</script> 

(Để thử nghiệm nó với một món quà vòng tham khảo, di chuyển nghĩa function click lên vào cơ thể replace.)

0

Bạn sẽ nhận được rò rỉ bộ nhớ nếu bạn xóa từ DOM, yếu tố đã gắn liền nghe. Nhưng điều này chỉ xảy ra trong IE, Fx và những người khác có GC nâng cao.

Thường thì nó sẽ xảy ra, nếu bạn thao tác với các yếu tố DOM không thông qua DOM, nhưng cũng giống như

el.innerHTML = ... 

Ví dụ, YUI có tùy chỉnh thực hiện setInnerHTML, để ngăn chặn rò rỉ bộ nhớ trong trường hợp này.