(这些结果使用Chrome Dev Tools的memory profiler,它运行GC,然后对未被垃圾回收的所有内容进行堆快照。)
在下面的代码中,
someClass
实例被垃圾回收(很好):var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
但是在这种情况下,它不会被垃圾回收(不好):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
而相应的屏幕截图如下:
看起来闭包(在这种情况下是function() {}
)会保留所有对象的“存活状态”,如果该对象被同一上下文中的任何其他闭包引用,无论该闭包本身是否可达。
我的问题是关于其他浏览器(IE 9+和Firefox)中闭包的垃圾回收。我非常熟悉webkit的工具,例如JavaScript堆分析器,但我对其他浏览器的工具知之甚少,因此我无法进行测试。
在以下三种情况下,IE9+和Firefox将对someClass
实例进行垃圾回收:
unreachable
函数从未被执行,因此实际上没有任何内容被记录。 - James Montagne