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

use*_*950 9 javascript garbage-collection

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

此外,当在OOP结构中编写javascript时,如果我有类似这样的东西(游戏在全局上下文中)会发生什么:

var game = {};
game.level = 0;
game.hero = new hero();
//do stuff
game.hero = null;
Run Code Online (Sandbox Code Playgroud)

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

izb*_*izb 15

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

例如

之前:

global -> {nothingness}
Run Code Online (Sandbox Code Playgroud)

后:

global -> var a -> object { foo: "bar" }
Run Code Online (Sandbox Code Playgroud)

设置anull:

global -> var a -> null
Run Code Online (Sandbox Code Playgroud)

这里,对象使用的内存将有资格进行收集.该变量a仍然存在,它只是引用null.

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

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

  • 可能不是那么糟糕.然而,用变量污染全局命名空间被认为是不好的做法. (2认同)