Javascript内存管理陷阱?

时间:2009-10-05 09:49:19

标签: javascript memory-management garbage-collection

我知道Javascript有一个垃圾收集器。因此,使用 delete 仅删除对象的引用,当没有对该对象的引用时,它将被GC删除。

Javascript很棘手,包括闭包,模糊名称空间和原型继承,知道何时到现在或为什么并不总是显而易见。

我正在编写一个相当大的Javascript项目,并希望避免内存泄漏,同时限制全局内存使用。我根本没有处于优化阶段(让我们先把这些东西搞定:-)),但是为了避免编写糟糕的代码,知道内存管理的良好实践会很好。

  • 那我什么时候应该使用删除
  • 我应该避免什么陷阱, 使用对象?
  • 关于闭包的一些事情?
  • 要强调一些好的做法?

3 个答案:

答案 0 :(得分:10)

根据我的经验,根据浏览器的不同,垃圾收集器的实现很差/很差。应用良好的面向对象编程实践是一个良好的开端。

我唯一的建议:不要通过连接DOM和&创建内存泄漏javascript对象(DOM和JS GC不会清除的循环引用)。这些错误将比你在应用程序中实例化的任何对象占用更多的内存。

有关DOM / JS内存泄漏的更多详细信息。 http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

答案 1 :(得分:5)

  • 在IE中,至少在旧版本中,如果DOM元素附加了事件监听器,则在使用removeChild将其删除后,将其保留在内存中。从内存中删除它的唯一方法是在将事件从DOM中删除之前分离事件。
  • 只要您不经常创建和删除元素,您就不必担心这一点。如果在应用程序启动时创建了许多元素,但之后没有创建新对象,那么不要过多担心内存泄漏。

答案 2 :(得分:3)

我认为通过在DOM节点上存储数据,您可以轻松创建并非所有浏览器都能处理的循环引用。例如:

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