首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript的垃圾回收

javascript的垃圾回收
EN

Stack Overflow用户
提问于 2010-10-14 03:10:29
回答 3查看 153关注 0票数 2

我有两段代码示例1

代码语言:javascript
复制
(function(){

var x = 1;

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

})();

样本2

代码语言:javascript
复制
(function(){

var x = 1;

 this.getx = function() { };

})();

两个代码示例都创建一个闭包,示例1中的x被引用,而示例2中的x没有被引用,我知道在示例1中的x不会被垃圾收集,我的问题在示例2中会被垃圾收集吗?

EN

回答 3

Stack Overflow用户

发布于 2010-10-14 03:28:02

ECMAScript标准有意对垃圾收集器的工作方式保持沉默,因此实现可能有所不同。但是,通常情况下,如果一个对象不能从活动对象中引用,它将被收集。

在示例2中,这意味着可能会收集闭包,但也可能不会创建闭包,因为函数没有引用它。闭包是昂贵的,现代的JavaScript引擎试图避免创建它们,除非它们是被迫的。

票数 1
EN

Stack Overflow用户

发布于 2010-10-14 03:28:48

Javascript中的垃圾收集是一件很模糊的事情。一般来说,您可以假设(尽管我们知道假设会做什么),一旦没有对变量的引用(例如,一旦它超出作用域),它将被垃圾收集。但是,您的闭包将无法按您的意愿工作,因为它们没有分配给任何东西;因此,您将没有函数对象来调用getx()。但是,如果要分配它,x就永远不会超出作用域,除非您在任何包含函数引用的变量上使用delete关键字。

简单规则:每当您关注集合时都使用delete操作符--这将删除引用,并且更有可能释放内存。

编辑:撇开@chuckj的注释不说,不管您是使用delete还是将变量赋值给undefined,如果希望释放内存,仍然需要将引用计数设为0。

票数 0
EN

Stack Overflow用户

发布于 2012-07-12 05:19:07

对于现代浏览器,除了ie6之外,示例2中的x将在大多数浏览器中被垃圾收集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3929794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档