2011-06-09 22 views
15

i Ben isimsiz işlevinde geçmesi bujavascript anonim işlev çöp toplama

function do(callback) { 
    //do stuff 
    callback(); 
} 

ve sonra gibi bir işlevi varsa:

do(function() { //do something else }); 

anonim işlev hiç görev süreci boyunca toplanan olsun bunu yapar sayfa? Değilse, GC için nasıl kullanılabilir yapabilirim?

Bunu yapmak zorunda mıyım?

var h = function() { //do something }; 
do(h); 
delete h; 

Bunun için endişelenmem gerekir mi? Uzun bir ömrü olan bir web uygulaması yapıyorum, çok fazla ajax araması bir süredir nesneleri tutar ve gerçekten gezinmek için bir sayfa yenileme gerektirmez. Bu yüzden bir bellek sızıntısı canavara düşebilir miyim anlamaya çalışıyorum.

+0

Benim için, ben ben silindi sanıyordum nesnelere olay dinleyicileri kaldırmasını bellek sızıntısının en miktarını almak eğilimindedir. Buralarda http://stackoverflow.com/questions/5028479/finding-memory-leaks-in-javascript-using-firebug http://stackoverflow.com adresine bakmak isteyebilirsiniz./questions/864516/what-is-javascript-çöp toplama-toplama – mrk

cevap

9

Anonim işlevin tek başvurusu işlev argümanıdır ve işlev bittiğinde kaybolur, bu nedenle geri dönüşünüz bundan sonra çöp toplama için kullanılabilir olacaktır. Başka bir şey bir kapanışları ile kolayca ortaya çıkabilir buna referansı, aldığında hariç: (doo arayarak yarattığı bütün kapsamı ile birlikte)

function doo(callback) { 
    $.get(url, function() { 
     // callback is visible here! 
    }); 
    callback(); 
} 
doo(function() { /* do something else */ }); 

callback iç fonksiyonu bunu yoluyla başvurabilir, çünkü hafızada kalmalı kapanış; Sadece iç işlev toplanan çöp toplandığında çöp toplanabilir ve bu işlev jqXHR nesnesinin bir özelliği olduğundan, bu nesne bundan önce toplanan çöp olmalıdır ve bunun ne zaman olacağını bilmelidir ...

diğer fonksiyonlar içine fonksiyonlarınızı tanımlayarak vermeyerek gereksiz kapanışları önleyebilirsiniz Güncelleme:

var func = function() { 
    // callback is not visible here 
} 
function doo(callback) { 
    $.get(url, func); 
    callback(); 
} 
doo(function() { /* do something else */ }); 
+0

eğer bunu doo' işlevinde yaparsam var var var = $; g.get ... 'geri arama toplanabilir mi? Veya örnek koleksiyonunuzu ne yapabilirim? – Jose

+0

@Jose: Başka bir adla '$' ye başvurmak yararlı bir şey yapmaz. Yanıtlarımın nasıl önlenebileceğini göstermek için cevabımı güncelledim.Tabii ki, her seferinde anonim bir işlev oluşturmak yerine, aynı argümanları her zaman "doo" olarak çağırırsanız, bu sorunu çözmek için daha basit bir yoldur. – Tgr

+0

Sanırım "var func = function() ..." değil "var fun" ... ya da $ .get (url, func) güncellendi. – Crashalot

2

Dairesel referanslara dikkat edin, aksi takdirde tarayıcı için GC bunları temizleyecektir. Kapaklar, dairesel bir referans oluşturmayı gerçekten kolaylaştırır ve bu, onu oluşturan sayfadan ayrılsanız bile bellekte sıkışmış olabilir. Yani, uzun süre ekran üzerinde kalan web uygulamaları özellikle savunmasızdır.

"Bellek sızıntısı" bölümüne bakın: https://developer.mozilla.org/en/A_re-introduction_to_JavaScript.

Oldukça az sayıda statik sayfa web uygulaması tasarladım. ,'un bile olmadığı zaman bile, nesneleri ve olay işleyicilerini temizlemeniz gerektiğini öğrendim (örneğin, dairesel bir referans olmadığından emin olursunuz), bu zarar veremez. Genellikle sadece birkaç ek kod satırı ekler ve kodunuzu yazarken zihninizin ön planda bellek kullanımını ve verimliliğini korur. Bu, web geliştiricileri için bir değişikliktir çünkü bir web sitesi oluştururken genellikle bu tür şeyleri düşünmek zorunda değiliz.