In che modo le chiusure di JavaScript sono spazzate via

Ho registrato il seguente bug di Chrome , che ha portato a molte perdite di memoria serie e non ovvie nel mio codice:

(Questi risultati utilizzano il profiler della memoria di Chrome Dev Tools, che esegue il GC, e quindi acquisisce un’istantanea dell’heap di tutto ciò che non è raccolto.)

Nel codice sottostante, l’istanza someClass è garbage someClass (buona):

 var someClass = function() {}; function f() { var some = new someClass(); return function() {}; } window.f_ = f(); 

Ma in questo caso non saranno raccolti i rifiuti (male):

 var someClass = function() {}; function f() { var some = new someClass(); function unreachable() { some; } return function() {}; } window.f_ = f(); 

E lo screenshot corrispondente:

screenshot di Chromebug

Sembra che una chiusura (in questo caso, function() {} ) mantenga tutti gli oggetti “vivi” se l’object è referenziato da qualsiasi altra chiusura nello stesso contesto, indipendentemente dal fatto che la stessa chiusura sia addirittura raggiungibile.

La mia domanda riguarda la raccolta dei dati obsoleti di chiusura in altri browser (IE 9+ e Firefox). Ho una certa familiarità con gli strumenti del webkit, come il profiler dell’heap di JavaScript, ma conosco poco degli altri strumenti del browser, quindi non sono stato in grado di testarlo.

In quali di questi tre casi IE9 + e Firefox garbage raccolgono l’ istanza someClass ?