我有两段代码 样本1
(function(){
var x = 1;
this.getx = function() { return x; };
})();
样本2
(function(){
var x = 1;
this.getx = function() { };
})();
两个代码示例都创建了一个闭包,样本一中的x被引用,而样本二中的x未被引用,我知道样本一中的x不会被垃圾收集,我的问题是样本二中的x会被垃圾收集吗? / p>
答案 0 :(得分:1)
ECMAScript标准有意保持垃圾收集器的工作原理,因此实现可能会有所不同。但是,通常情况下,如果某个对象无法从活动对象中引用,则会收集该对象。
在样本2中,这意味着可能会收集闭包,但由于函数没有引用闭包,因此甚至可能无法创建闭包。闭包是昂贵的,现代JavaScript引擎试图避免创建它们,除非他们被迫。
答案 1 :(得分:0)
Javascript中的垃圾收集是一件很神奇的事情。一般来说,你可以假设(虽然我们知道假设是什么),一旦没有对变量的引用(例如,一旦它超出范围),它将被垃圾收集。但是,你的闭包不会像你想要的那样工作,因为它们没有分配给任何东西;因此,您将没有函数对象来调用getx()
。但是,如果您要分配它,x
将永远不会超出范围,除非您在持有函数引用的任何变量上使用delete
关键字。
简单规则:每当您担心收集时使用delete
运算符 - 这将删除引用,并且更有可能释放内存。
编辑:@chuckj旁边的评论,无论你使用delete
还是将变量分配给undefined
,如果有任何希望,你仍然希望将引用计数设为0解放记忆。
答案 2 :(得分:0)
对于现代浏览器,样本2中的x将在大多数浏览器中被垃圾收集,除了ie6