javascript的垃圾收集

时间:2010-10-14 03:10:29

标签: javascript garbage-collection closures

我有两段代码 样本1

(function(){

var x = 1;

 this.getx = function() { return x; };

})();

样本2

(function(){

var x = 1;

 this.getx = function() { };

})();

两个代码示例都创建了一个闭包,样本一中的x被引用,而样本二中的x未被引用,我知道样本一中的x不会被垃圾收集,我的问题是样本二中的x会被垃圾收集吗? / p>

3 个答案:

答案 0 :(得分:1)

ECMAScript标准有意保持垃圾收集器的工作原理,因此实现可能会有所不同。但是,通常情况下,如果某个对象无法从活动对象中引用,则会收集该对象。

在样本2中,这意味着可能会收集闭包,但由于函数没有引用闭包,因此甚至可能无法创建闭包。闭包是昂贵的,现代JavaScript引擎试图避免创建它们,除非他们被迫。

答案 1 :(得分:0)

Javascript中的垃圾收集是一件很神奇的事情。一般来说,你可以假设(虽然我们知道假设是什么),一旦没有对变量的引用(例如,一旦它超出范围),它将被垃圾收集。但是,你的闭包不会像你想要的那样工作,因为它们没有分配给任何东西;因此,您将没有函数对象来调用getx()。但是,如果您要分配它,x将永远不会超出范围,除非您在持有函数引用的任何变量上使用delete关键字。

简单规则:每当您担心收集时使用delete运算符 - 这将删除引用,并且更有可能释放内存。

编辑:@chuckj旁边的评论,无论你使用delete还是将变量分配给undefined,如果有任何希望,你仍然希望将引用计数设为0解放记忆。

答案 2 :(得分:0)

对于现代浏览器,样本2中的x将在大多数浏览器中被垃圾收集,除了ie6