我有一個應用程序,用戶可以在其中創建和銷燬圖形對象。這些對象中的每一個產生多個事件監聽器。當對象被銷燬(從DOM中刪除)時,我是否必須刪除所有這些事件偵聽器?如果我不這樣怎麼辦?我在JavaScript中清除事件處理程序有多重要?
在這種情況下,事件偵聽器在對象本身上是mousedown
和mouseup
,文檔正文上是mousemove
,但在一般情況下最佳做法是什麼。
我有一個應用程序,用戶可以在其中創建和銷燬圖形對象。這些對象中的每一個產生多個事件監聽器。當對象被銷燬(從DOM中刪除)時,我是否必須刪除所有這些事件偵聽器?如果我不這樣怎麼辦?我在JavaScript中清除事件處理程序有多重要?
在這種情況下,事件偵聽器在對象本身上是mousedown
和mouseup
,文檔正文上是mousemove
,但在一般情況下最佳做法是什麼。
如果從DOM中刪除對象,並且在實時Javascript變量中沒有對它的任何引用,則該對象將被垃圾收集,並且與它關聯的任何事件處理程序也將被丟棄。您不需要首先明確清除處理程序。
在現代瀏覽器(chrome/firefox/webkit)中,並不重要 - 當處理DOM元素時,與它們綁定的事件處理程序也是如此,因爲兩者都由相同的內存管理器處理。
對於IE9及以上版本也是如此。
但是,對於IE8和IE7,DOM和jScript有單獨的內存管理器,這意味着除非您在處理DOM元素之前解除綁定事件並清空事件處理程序,否則不會釋放內存。
您可以在這裏IE版本閱讀更多關於內存泄漏:
http://javascript.crockford.com/memory/leak.html
http://blog.j15r.com/blog/2009/07/12/Memory_Leaks_in_IE8
http://msdn.microsoft.com/en-us/library/bb250448(v=vs.85).aspx
http://www.codeproject.com/Articles/12231/Memory-Leakage-in-Internet-Explorer-revisited