我沒有在應用程序中遇到內存泄漏,但我擔心未來可能出現的問題。我想知道,如果做這樣的事情:Javascript中的事件處理程序,閉包和垃圾回收
SomeClass.prototype.someMethod= function() {
var that= this
this.$div2.click(function() {
that.someMethod2();
});
}
並讓說,這$ DIV2追加到另一個DIV這個$ DIV1。如果我叫
this.$div1.remove();
,後來失去了我SomeClass的實例的引用並在SomeClass的實例被垃圾回收?那麼HTML元素呢。$ div2?這個。$ div2不會在DOM裏面,因爲它被附加到這個$ div1。
我問這是因爲這個。$ div2中的事件處理程序可能會保留對HTML元素this。$ div2的引用,並且由於變量「that」而通過閉包保留對SomeClass實例的引用。
所以我應該關心如何正確移除所有事件和HTML元素?或者乾脆刪除「根」元素(這個。$ div1)解決了這個問題?
我會認爲會。垃圾收集器應該跟蹤引用,所以理論上最後一個引用不見了的時候,該項目應該是垃圾收集的候選者。我不知道是否在JS引擎中的那些也可以分析不可達代碼並標記仍然有引用,但其引用未使用的項目... – RonaldBarzell
這取決於。使用經典的Web應用程序,這不是一個真正的問題,因爲您經常提交給服務器,該服務器加載或刷新不同的視圖。隨着新興的單頁應用程序,這可能是一個問題,特別是像IE瀏覽器的'死'瀏覽器。 – asgoth
@asgoth我正在製作一個單頁的應用程序。無需刷新頁面就必須可靠運行至少12小時,因此我擔心垃圾收集。 – Hoffmann