Registrei o seguinte bug do Chrome , o que levou a muitos vazamentos de memória sérios e não óbvios no meu código:
(Esses resultados usam o criador de perfil de memória das Ferramentas de Desenvolvimento do Chrome , que executa o GC e, em seguida, tira um instantâneo de tudo o que não é coletado em lixo.)
No código abaixo, a someClassinstância é coletada como lixo (boa):
var someClass = function() {};
function f() {
var some = new someClass();
return function() {};
}
window.f_ = f();
Mas não será coletado lixo neste caso (ruim):
var someClass = function() {};
function f() {
var some = new someClass();
function unreachable() { some; }
return function() {};
}
window.f_ = f();
E a captura de tela correspondente:

Parece que um fechamento (neste caso function() {}) mantém todos os objetos "vivos" se o objeto for referenciado por qualquer outro fechamento no mesmo contexto, independentemente de esse fechamento ser ou não alcançável.
Minha pergunta é sobre a coleta de lixo de fechamento em outros navegadores (IE 9+ e Firefox). Estou familiarizado com as ferramentas do webkit, como o criador de perfil de heap JavaScript, mas conheço pouco das ferramentas de outros navegadores, portanto não pude testar isso.
Em qual desses três casos o IE9 + e o Firefox coletam a someClass instância?
unreachablefunção nunca é executada, portanto nada é realmente registrado.