Anlayabildiğim kadarıyla, bu bir hata değil, beklenen davranıştır.
Mozilla'nın Bellek yönetimi sayfasından : "2012'den itibaren tüm modern tarayıcılar bir işaretleme ve süpürme çöp toplayıcısı gönderiyor." "Sınırlama: nesnelerin açıkça erişilemez hale getirilmesi gerekir " .
Başarısız someolduğu örneklerinizde kapanışta hala erişilebilir. Erişilemez hale getirmek için iki yol denedim ve her ikisi de işe yaradı. Ya some=nullartık ihtiyaç duymadığınızı belirlersiniz, ya da siz belirlersiniz window.f_ = null;ve gider.
Güncelleme
Windows'ta Chrome 30, FF25, Opera 12 ve IE10'da denedim.
Standart çöp toplama hakkında bir şey söylemek, ama ne olacağına bazı ipuçları verir vermez.
- Bölüm 13 İşlev tanımı, adım 4: "Kapatmanın, 13.2'de belirtildiği gibi yeni bir İşlev nesnesi oluşturmasının sonucu olmasına izin verin"
- Kısım 13.2 "Kapsam tarafından belirtilen Sözlüksel Bir Ortam" (scope = closure)
- Bölüm 10.2 Sözlüksel Ortamlar:
Msgstr "Bir (iç) Lexical Ortamının dış referansı, dahili Lexical Ortamını mantıksal olarak çevreleyen Lexical Environment'a bir referanstır.
Dışsal bir Lexical Environment elbette kendi dış Lexical Environment'a sahip olabilir. Bir Lexical Environment, birden fazla iç Lexical Ortamının dış ortamı olarak işlev görebilir. Bir Örneğin, Fonksiyon Bildirgesi iç içe geçmiş iki içeren Fonksiyon Açıklamasında sonra iç içe fonksiyonların her birinin Sözcük Ortamları dış Sözcük Çevre çevreleyen fonksiyonun mevcut yürütme Sözcük Çevre olarak sahip olacaktır."
Böylece, bir fonksiyonun ebeveynin ortamına erişimi olacaktır.
Bu nedenle, somegeri dönen fonksiyonun kapanmasında mevcut olmalıdır.
O zaman neden her zaman mevcut değil?
Chrome ve FF'nin bazı durumlarda değişkeni ortadan kaldıracak kadar akıllı olduğu görülüyor, ancak hem Opera hem de IE'de somedeğişken kapanmada mevcut (NB: bunu bir kesme noktasını görmek return nullve hata ayıklayıcıyı kontrol etmek için).
GC some, fonksiyonlarda kullanılıp kullanılmadığını tespit etmek için geliştirilebilir , ancak karmaşık olacaktır.
Kötü bir örnek:
var someClass = function() {};
function f() {
var some = new someClass();
return function(code) {
console.log(eval(code));
};
}
window.f_ = f();
window.f_('some');
Yukarıdaki örnekte GC değişkenin kullanılıp kullanılmadığını bilmenin bir yolu yoktur (kod test edildi ve Chrome30, FF25, Opera 12 ve IE10'da çalışıyor).
Nesneye yapılan başvuru, başka bir değer atanarak kesilirse bellek serbest bırakılır window.f_.
Bence bu bir hata değil.