javascript垃圾收集器是否处理全局变量?

时间:2013-05-28 08:23:44

标签: javascript garbage-collection

我对此感到困惑,因为我看过几个不同的评论。我正在阅读一本javascript书,其中提到将全局变量设置为null是一种很好的做法(假设没有其他引用)并且GC在下一次扫描时回收此变量的内存。我已经看到其他评论说全局变量从未被GC处理过。

当在OOP结构中编写javascript时,如果我有类似的东西(游戏在全局范围内)会发生什么:

var game = {};
game.level = 0;
game.hero = new hero();
//do stuff
game.hero = null;

由于英雄生活在一个存储在游戏中的对象中,这个对象位于全局上下文中,如果我将例如英雄设置为null,那么这会被GC处理吗?

1 个答案:

答案 0 :(得分:15)

全局变量永远不会被GC处理,因为全局变量仍然存在。但是,将其设置为null将允许收集它引用的内存。

E.g。

在:

global -> {nothingness}

后:

global -> var a -> object { foo: "bar" }

a设为null

global -> var a -> null

此处,对象使用的内存将有资格进行收集。变量a仍然存在,它只是引用null

永远不会收集全局变量的说法有点误导。可以更准确地说,任何可追溯到全局上下文的内存目前都不符合收集条件。

在回答你的问题时,是的 - 英雄对象将有资格收集,因为它与全球背景的间接联系已被切断。