我对此感到困惑,因为我看过几个不同的评论。我正在阅读一本javascript书,其中提到将全局变量设置为null是一种很好的做法(假设没有其他引用)并且GC在下一次扫描时回收此变量的内存。我已经看到其他评论说全局变量从未被GC处理过。
当在OOP结构中编写javascript时,如果我有类似的东西(游戏在全局范围内)会发生什么:
var game = {};
game.level = 0;
game.hero = new hero();
//do stuff
game.hero = null;
由于英雄生活在一个存储在游戏中的对象中,这个对象位于全局上下文中,如果我将例如英雄设置为null,那么这会被GC处理吗?
答案 0 :(得分:15)
全局变量永远不会被GC处理,因为全局变量仍然存在。但是,将其设置为null
将允许收集它引用的内存。
E.g。
在:
global -> {nothingness}
后:
global -> var a -> object { foo: "bar" }
将a
设为null
:
global -> var a -> null
此处,对象使用的内存将有资格进行收集。变量a
仍然存在,它只是引用null
。
永远不会收集全局变量的说法有点误导。可以更准确地说,任何可追溯到全局上下文的内存目前都不符合收集条件。
在回答你的问题时,是的 - 英雄对象将有资格收集,因为它与全球背景的间接联系已被切断。