JavaScript垃圾回收器会销毁全局变量吗?

11

因为我看到了好几条不同的评论,所以我感到困惑。我正在阅读一本JavaScript书籍,在其中提到将全局变量设置为null是一种良好的实践方法(假设没有其他引用),GC会在下一轮扫描中回收此变量的内存。但我也看到其他评论说全局变量永远不会被GC处理。

此外,在使用OOP结构编写JavaScript时,如果我有像这样的内容(其中game位于全局范围内),会发生什么:

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

由于英雄存在于存储在游戏中的对象内,此对象存在于全局上下文中。例如,如果我将英雄设置为null,那么它是否会被GC处理?


3
你可能会想阅读《什么是 JavaScript 垃圾回收》(https://dev59.com/Z3RA5IYBdhLWcg3wsgBP?rq=1)。 - Felix Kling
1个回答

17

全局变量从来不会被垃圾回收器彻底清除,也就是说全局变量会一直存在。将其设置为null将允许回收其引用的内存。

例如:

之前:

global -> {nothingness}

之后:

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

a设置为null

global -> var a -> null

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

说全局变量永远不会被收集是稍微有些误导性的。更准确地说,可以追溯到全局上下文的任何内存当前都不符合回收的条件。

回答您的问题,是的 - 英雄对象将有资格进行回收,因为它与全局上下文的间接连接已断开。


1
谢谢,这解释得很清楚。现在我在想如果全局作用域中有10000个变量会发生什么... - user2000950
4
可能没有太多不好的地方。但是在全局命名空间中污染变量被认为是不好的做法。 - izb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接