2013-09-26 20 views
5

如果我在JavaScript中的任何元素添加事件處理程序像JavaScript事件處理程序刪除節點

var link = document.createElement("a"); 

document.body.appendChild(link); 


link.addEventListner("click",function(){ 

    alert("do something"); 

}); 

,然後我刪除鏈接

link.parrentNode.removeChild(link); 

則有關事件,我附鏈接什麼後將它也被刪除或將它保留在內存中(與事件如何存儲在內存中以及多久有點混淆),或者我應該先刪除事件處理程序,然後刪除鏈接節點。

+0

你不附加事件,你附加一個事件的監聽器(因此方法的名稱)。偵聽器僅在它所連接的對象(DOM元素)存在時才存在。 – RobG

回答

1

在javascript函數表達式(在你的情況下事件綁定)分配一個對象,因此消耗內存。您應該正確移除或處理它。查看詳細解釋內存管理的鏈接。

Js Memory Management

檢查垃圾收集部分。

3

當垃圾收集器被調用時,幾乎所有的瀏覽器都會從內存中移除事件處理程序。但是,IE6及以下版本有一個已知的錯誤,可能會導致事件處理程序未被垃圾收集,導致頁面泄漏內存。

在刪除元素之前清理事件處理程序(實際上,像YUI和JQuery這樣的庫具有這個功能)被認爲是很好的做法。但是現在,如果你關心IE6,我只會擔心這個問題。


注意:如果你想知道有關的bug。這是因爲IE的垃圾收集器無法處理循環引用(如果涉及DOM)(在較早的IE中,即使它不涉及DOM,也無法處理循環引用)。

因此,舉例來說,如果你有這樣的代碼:

myDiv.onclick = function() { myDiv.style.backgroundColor = 'red' } 
//        ^
//        | 
//      circular reference 

然後IE6及以下不能釋放事件處理程序。但是,如果您的事件處理程序不包含任何循環引用回到它附加到的DOM對象,那麼IE將垃圾收集它。

+0

鏈接到一個相關的問題:http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

IE 6和7不支持* addEventListener *無論如何,所以在這種情況下,他們只會拋出一個錯誤。 ;-) – RobG