var Obj = function(){}; var X = new Obj();
X = null
会正确清除记忆吗?
这也是等同的吗?
var Obj = function(){};
var X = {};
X.obj = new Obj();
delete(X.obj);
修改 虽然删除X.obj似乎不会立即清除内存,但它似乎有助于垃圾收集。如果我不删除X.obj,仍然会有一个指向对象的指针,因此GC可能无法清除它。
虽然我正在接受@ delnan的答案,如果你正在阅读这篇文章,你也应该去找Benubird的文章。
我还注意到我不小心写了删除(X)而不是删除(X.obj) - 对不起。
答案 0 :(得分:18)
简短的回答是你没有。 delete
只是删除了一个引用(而不是您尝试使用它的方式,请参阅上面的链接 - delete
是很少有人真正了解的语言功能之一),仅此而已。实现为您清除了内存,但是当它(并且严格地说 - 这就是为什么人们不应该依赖于提供它们的GC语言中的终结器)时,这不是您的业务。请注意:
从好的方面来说,这意味着你不会得到悬挂的指针错误或(当然除了上述陷阱)内存泄漏。
答案 1 :(得分:15)
答案 2 :(得分:4)
否 - Javascript在感觉就像运行GC一样。
答案 3 :(得分:3)
Delete方法只删除引用 - 而不是对象。任何其他引用都将在打开时等待垃圾收集器。
JavaScript有自己的GC,当没有任何内容引用时,它会运行并清理它们。
我仍然认为将对象置空是一个好习惯。 删除一个对象也有助于GC,因为它会看到晃来晃去的东西,然后说“我要吃你,因为你一个人(现在有些玩世不恭的笑)”。
您应该查看Deleting Objects in JavaScript
即使有GC,您仍然希望确保您的脚本针对性能进行了优化,因为人们的计算机,浏览器和fricken工具栏(以及它们的数量)会有所不同。
答案 4 :(得分:1)
一般来说,Javascript中的内存管理是特定于用户代理的。垃圾收集器的基础是通过引用计数。因此,通过设置null引用(使用delete
关键字或通过显式赋值),您可以确保自己清理引用, IF 对象没有任何引用这将超出它的创造范围。既然如此,GC就已经清理了范围已经结束的任何对象或变量,而没有明确地将其设置为null。
但是有一些事情要处理 - 循环引用很容易在JS中创建,特别是在DOM元素和对象之间。必须注意清除(或不首先创建)对象内DOM元素的引用和/或来自DOM元素的引用。如果您确实创建了一个与DOM相关的to / from引用,请确保通过在对象和DOM元素上设置null引用来显式清除它们。如果存在引用/来自DOM或localStorage的子对象,那么简单地将父对象设置为null是不够的,因为这些引用将继续存在,并且如果从子进程到父进程有任何引用,则父对象将继续存在记忆因为那个参考。
网页实际上可以通过这种方式泄漏内存中的垃圾 - 在您离开之后,循环引用会将对象和DOM元素保留在内存中,直到您重新启动浏览器为止!
有关此主题的文章:http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm,另有详细说明:http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx
答案 5 :(得分:0)
JavaScript内存通常与Java类似地处理 - 我的意思是存在(或应该存在)垃圾收集器,如果没有对它的引用,它将删除该对象。所以是的,简单地“无效”引用是你应该“处理”释放内存的唯一方法,真正的释放是JS主机部分。