2013-01-09 34 views
3

我從來沒有真正考慮垃圾收集,我不知道在製作小型JavaScript遊戲/應用程序時是否需要考慮垃圾收集。任何建議表示讚賞,但最後我會問我的具體問題。當我清除數組時,JavaScript內部數組內的對象是否會從內存中擦除?

很多我寫這種形式的代碼的時間:

var foos=new Array(); 
generateFoos(); 
function generateFoos() 
{ 
    foos=[]; 
    for (fooIndex=0;fooIndex<numberOfFoos;fooIndex++) 
    { 
     foos[fooIndex]=new foo(Math.random(),Math.random()); 
    } 
} 
function foo(bar,bas) 
{ 
    this.bar=bar; 
    this.bas=bas; 
} 

所以我的問題是,當我說foos=[](5號線),這是否從內存中刪除該數組中的對象或做他們在某個地方浮動,使程序變得越來越大,越來越慢?我應該怎麼做,如果我想打電話給generateFoos() loooot的時間,就像每次用戶按下一個鍵。

謝謝!

+0

的Foo []在函數的範圍僅存在 - 所以,如果函數代碼結束FOOS被刪除。 – Bernhard

+1

@Bernhard不,foos是在第一行中聲明的。 –

+0

改爲使用'delete'。 – Amareswar

回答

8

對於一個特定的答案,由於接受的答案並不直接回答問題,那麼是的,foo = []會取消引用數組中的任何以前的值。

正如Ales所說:「一個對象在變得無法訪問時就有資格進行垃圾回收。」事實上,這是瀏覽器從內存中清除這些東西的時候。

重要的一點,刪除不垃圾收集

你一遍又一遍地看到這個,甚至在這個問題的評論。 刪除關鍵字從對象中刪除屬性並且與垃圾回收無關。

我也想對你的代碼本身提供一些建議。

1)使用文字,而不是新的,對於基本數據類型

2)聲明他們之前不要調用函數。是的,它可行,但稍後會變得雜亂難讀。請記住,你花更多的時間來閱讀你的代碼,而不是寫它。稍後再輕鬆一點。

3)記住你的功能範圍。任何沒有var的變量都是全局變量。使用var時,它仍然在包含它的函數的範圍內。變量在函數中作用的另一種方式是當它們作爲命名參數傳遞時。

4)創建它們時,在你的函數中使用var。在你的代碼中,你的函數是全局的。

5)使用間距。文字的密度並不靠近敬虔。你現在可能有20多個東西,視力很好,但在短短几年內你會欣賞白色空間。

6)用var聲明循環中的計數器。除非你希望他們成爲全球。而你幾乎絕不會會。

現在,讓我們重新工作,你的代碼:

var numberOfFoos = 10, 
    foos = []; 

var generateFoos = function(){ 

    foos = []; 

    for(var fooIndex = 0; fooIndex < numberOfFoos; fooIndex++){ 

     foos[ fooIndex ] = new foo(Math.random(), Math.random()); 

    } 

}, 

foo = function(bar, bas){ 

    this.bar = bar; 
    this.bas = bas; 

} 

generateFoos(); 
console.log(foos); 
+0

+1代碼提示。 –

+0

謝謝...真正有用的東西,我一定會採取您的所有建議。對不起Ales轉換接受的答案。 –

+0

我想指出「4)在創建函數時使用var,在你的代碼中,你的函數是全局變量。」是不正確的。在這種情況下使用var _是純粹的風格,兩個版本都會產生一個全局函數。沒有封裝功能,OP和你的版本都是一樣的(除了潛在的功能提升)。雖然即使OP的函數被封裝,但通過函數聲明而不是var也不會影響範圍。 –

6

回答你的問題:當一個對象變爲無法訪問時,它就有資格進行垃圾回收。如果你的程序沒有對該數組中的對象進行任何其他引用,它們將被垃圾收集。

實際垃圾收集的時間取決於許多方面以及選擇垃圾收集算法,但在編寫代碼時不應該擔心。

最佳建議當考慮垃圾收集是爲了離開垃圾收集器去做它的工作。不要試圖指導或幫助它(例如,通過手動清除引用)。關注代碼的問題和功能方面。

+0

謝謝...很高興知道,如果一個對象變得無法訪問,它將被垃圾收集。這意味着在我給出的例子中,我不必擔心存儲數千個對象。 –

+2

注意記憶仍然是一個好主意。例如,Javascript應用程序中的一個內存泄漏源是綁定處理程序到全局事件,然後從不刪除它們,即使它們不再需要時也是如此。 – robbrit

+0

我同意。我不是一個Javascript專家,總的來說,仍然需要小心內存泄漏,但不應該試圖通過清零引用或明確調用GC來提高GC性能。 GC代碼完成並運行後,可以稍後再進行GC調整。 –

相關問題