11

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

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

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

由于 hero 存在于存储在游戏中的全局上下文中的对象中,如果我将例如 hero 设置为 null,这会被 GC 处理吗?

4

1 回答 1

16

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

例如

前:

global -> {nothingness}

后:

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

设置anull

global -> var a -> null

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

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

在回答您的问题时,是的 - hero 对象将有资格被收集,因为它与全局上下文的间接连接已被切断。

于 2013-05-28T08:45:46.703 回答