簡體   English   中英

JavaScript 內存管理陷阱?

[英]JavaScript memory management pitfalls?

我知道 JavaScript 有一個垃圾收集器。 因此,使用delete刪除的只是該對象的一個​​引用,當不再有這個對象的引用時,由GC刪除。

JavaScript 很棘手,因為有閉包、模糊的命名空間和原型繼承,所以現在知道何時或為什么並不總是很明顯。

我正在編寫一個相當大的 JavaScript 項目,希望避免內存泄漏,同時限制全局內存使用。 我根本不在優化階段(讓我們先讓這些東西工作:-)),但最好了解內存管理的良好實踐,以避免編寫糟糕的代碼。

  • 那么我應該什么時候使用delete呢?
  • 使用對象時我應該避免哪些陷阱?
  • 關於閉包需要了解的一些事情?
  • 一些值得強調的好做法?

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

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

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

  • 在 IE 中,至少在舊版本中,如果 DOM 元素附加了事件偵聽器,則在使用 removeChild 將其刪除后,它會保留在內存中。 從內存中刪除它的唯一方法是在從 DOM 中刪除它之前分離事件。
  • 只要您不經常創建和刪除元素,您就不必擔心這一點。 如果您在應用程序啟動時創建了大量元素,但之后不創建新對象,則不必太擔心內存泄漏。

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

this.element = document.getElementById('something');
this.element.attachedObject = this;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM