繁体   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