2011-10-11 110 views
1

我想知道是否更有效的方法是在循環之外放置任何引用的變量,或者它們是否可以像函數中的變量一樣收集垃圾?循環內部的局部變量是否被垃圾收集?

var obj = {key:'val'}; 
for(var i=0; i<10; i++){ 
    console.log(obj); 
} 

for(var i=0; i<10; i++){ 
    var obj = {key:'val'}; 
    console.log(obj); 
} 

我試圖運行在瀏覽器中的探查一些內存測試,但仍無法判斷哪個方法更好。

回答

6

var是函數作用域,沒有阻塞作用域,所以無論它們是否出現在循環內部都沒關係。 What is the scope of variables in JavaScript?解釋了這種區別。

JavaScript的下一個版本將有let-scoped變量,並且如果在循環內部聲明,那麼存儲在這些變量中的值將在循環體運行結束時變爲可收集的。

+0

請注意,在風格上(爲了避免讓代碼讀者感到困惑),建議始終在函數的開頭定位'var'語句。 – intuited

+0

@intuited,好點。我認爲像JSLint這樣的工具強制執行。 –

+0

[It does](http://javascript.crockford.com/code.html#variable%20declarations)。 – intuited

1

在變量超出範圍之前,都不會收集垃圾。 Javascript中的作用域是由函數引入的。循環構造對範圍無任何影響。

+0

感謝您的信息。出於任何原因,哪種方法比其他方法更好? –

+0

在循環中一遍又一遍地重新聲明對象並沒有什麼意義,所以1似乎更合適。 – deceze

0

就垃圾收集而言,其他答案應該是true,瀏覽器處理垃圾收集,並且如果變量在內部或外部聲明爲循環,則無關緊要。

至於效率,您的代碼會稍微優化一些,以便在循環之前聲明變量。