我有两段代码示例1
(function(){
var x = 1;
this.getx = function() { return x; };
})();样本2
(function(){
var x = 1;
this.getx = function() { };
})();两个代码示例都创建一个闭包,示例1中的x被引用,而示例2中的x没有被引用,我知道在示例1中的x不会被垃圾收集,我的问题在示例2中会被垃圾收集吗?
发布于 2010-10-14 03:28:02
ECMAScript标准有意对垃圾收集器的工作方式保持沉默,因此实现可能有所不同。但是,通常情况下,如果一个对象不能从活动对象中引用,它将被收集。
在示例2中,这意味着可能会收集闭包,但也可能不会创建闭包,因为函数没有引用它。闭包是昂贵的,现代的JavaScript引擎试图避免创建它们,除非它们是被迫的。
发布于 2010-10-14 03:28:48
Javascript中的垃圾收集是一件很模糊的事情。一般来说,您可以假设(尽管我们知道假设会做什么),一旦没有对变量的引用(例如,一旦它超出作用域),它将被垃圾收集。但是,您的闭包将无法按您的意愿工作,因为它们没有分配给任何东西;因此,您将没有函数对象来调用getx()。但是,如果要分配它,x就永远不会超出作用域,除非您在任何包含函数引用的变量上使用delete关键字。
简单规则:每当您关注集合时都使用delete操作符--这将删除引用,并且更有可能释放内存。
编辑:撇开@chuckj的注释不说,不管您是使用delete还是将变量赋值给undefined,如果希望释放内存,仍然需要将引用计数设为0。
发布于 2012-07-12 05:19:07
对于现代浏览器,除了ie6之外,示例2中的x将在大多数浏览器中被垃圾收集。
https://stackoverflow.com/questions/3929794
复制相似问题