2010-11-04 58 views
0

总之,如果我写的东西,如:空和delete()在关于垃圾收集

var h = 5; 
delete h; 

...我会消除参考,而不是记忆。
现在,如果我将变量设置为null,是否用空对象替换内存?

var h = 5; 
h = null; 

如果是的话,那岂不是更好,不仅delete()参考,而且还带有null对象更换内存,更好的内存优化?

var h = 5; 
h = null; 
delete h; 

如果我想在一个漫长而复杂的脚本来创建动态对象的水桶负荷,什么是摆脱的最好方式,或以其他方式诱导垃圾收集器来消除,对象?因为除了仅仅删除引用之外,我已经读过如果它被空值占用,可以提示收集器释放内存...

+0

什么JavaScript实现有一个销毁运算符? – mikerobi 2010-11-04 21:18:26

回答

5

有没有destroy。您可能正在考虑delete,但delete不能用于删除变量,只有属性。 (虽然目前的浏览器可以让你避开它,但结果会有所不同。)你可以通过从window中删除全局变量来删除全局变量,但不能删除当地人。

无论如何,你不需要在JavaScript中考虑这类东西。将变量设置为空,如果没有更多变量指向同一个对象,它将在不久的将来在某个时间点被垃圾收集。指向null的变量记录占用的空间量很小,不值得担心。除非你故意关闭,否则当本地功能退出时,它会掉到范围之外,因此可以用于GC。

我读过,你可以提示收集器释放内存,如果它是由空占领...

都能跟得上。你只是删除参考文献,GC会收集现在的孤儿物品,并自由地释放记忆。你在这件事上没有发言权。

+0

你会说在给函数末尾的变量赋空值有什么好处吗? – 2011-07-27 09:23:33

+0

@Ash:不,变量无论如何都要超出范围,所以你通过删除前面一行的引用就没有任何好处。除非你正在关闭函数的范围。 – bobince 2011-07-30 16:32:35

+0

@bobince:最后一点“除非你在函数范围内保持关闭”似乎很重要。是不是有可能在任何回调中你都会有局部变量存在,当它触发时回调不需要。如果将它们设置为null,那么垃圾回收器可以在回调完成之前完成它。 – rjmunro 2013-05-24 09:58:09

4

只需删除对buckload的所有引用,并让垃圾收集发挥神奇功效。

+1

把它标记为死,你可以使用'delete container.varName;'(其中容器是窗口,如果全局等) – scunliffe 2010-11-04 21:19:15