2009-10-05 61 views
22

我知道Javascript有一個垃圾收集器。因此,使用刪除只刪除對象的引用,並且當沒有更多引用此對象時,它將被GC刪除。Javascript內存管理陷阱?

JavaScript是棘手的,封閉,模糊的名稱空間和原型繼承,知道何時現在或爲什麼並不總是顯而易見的。

我正在編寫一個相當大的Javascript項目,並希望避免內存泄漏,同時限制全局內存使用量。在優化階段,我一點都沒有(讓我們先弄清楚這些東西:-)),但是爲了避免編寫糟糕的代碼,瞭解內存管理的良好實踐將會很好。

  • 那麼我應該什麼時候用刪除
  • 我應該避開什麼陷阱, 使用對象?
  • 有些東西要知道關閉?
  • 一些好的做法來突出顯示?
+0

有沒有可能存在一個錯誤,你有什麼時候知道**現在**或爲什麼?我無法解析這一點英語...... – hippietrail 2013-01-04 21:42:35

+0

我自己無法理解我。也許我喝醉了,或者當我寫這些時我就醒了。或兩者。直接無視(好了。 – 2013-01-06 22:32:08

回答

3

我想通過在DOM節點上存儲數據,您可以輕鬆創建並非所有瀏覽器都可以處理的循環引用。例如:

this.element = document.getElementById('something'); 
this.element.attachedObject = this; 
5
  • 在IE瀏覽器,至少在舊版本中,一個DOM元素被保存在內存中刪除您使用removeChild之,如果它有附加的事件偵聽器之後。將其從內存中移除的唯一方法是在將事件從DOM中移除之前將其分離。
  • 只要你不經常創建和刪除元素,你不必擔心這一點。如果在應用程序啓動時創建大量元素,但在此之後不創建新對象,則不要過多擔心內存泄漏。
10

根據我的經驗,垃圾收集器很好/很差實施取決於瀏覽器。應用良好的面向對象編程實踐是一個好的開始。

我唯一的建議:不會通過連接DOM & javascript對象(不會被DOM和JS GC清除的循環引用)來創建內存泄漏。這些錯誤將比您在應用程序中實例化的任何對象消耗更多的內存。

有關DOM/JS內存泄漏的更多詳細信息。 http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

+1

同意將DOM與js對象連接是我意識到的最大問題。我認爲大多數瀏覽器分別爲DOM和js對象分配不同的內存堆,因此在它們之間建立連接通常會導致內存泄漏。另一個有用的鏈接:http://www.ibm.com/developerworks/web/library/wa-memleak/ – Vojta 2010-12-13 09:48:11