2012-03-15 7 views
0

この複数レベルのネストされたJavaScriptオブジェクトを考えてみましょう。関数の後Javascriptでのガベージコレクション

function foo() { 
    var channels = { 
     2: { 
      name: "station 1", 
      description: "station1", 
      img: ["img1-a", "img1-b", "img1-c"] 
     }, 
     3: { 
      name: "station 2", 
      description: "station2", 
      img: ["img2-a", "img2-b", "img2-c"] 
     }, 
     4: { 
      name: "station 3", 
      description: "station3", 
      img: ["img3-a", "img3-b", "img3-c"] 
     }, 
    }; 

    console.log(channels);   
};   
....     
// calling foo. 
foo(); 

foo()戻り、あろうすべてのネストされたオブジェクト(すなわち個別チャネルオブジェクト、文字列、アレイIMG、及びIMGアレイ内の文字列は、すべて自動的にガベージ収集することができる?

かは、私は明示的に「削除」の各オブジェクトを反復処理し、する必要がありますか?彼らは、GCの対象としている

+2

これらのオブジェクト/配列への参照はもうなくなり、最終的にガベージコレクションされます。 –

+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collectionを参照してください。 – j08691

+0

@FelixKling:迅速な対応に感謝します。 – Karthik

答えて

2

console.logの状況によって異なります。確かにChromeでは、channelsオブジェクトへの参照がコンソールに保存されているため、channelsはGCできません。

console.logを削除すると、channelというフルオブジェクトは、他の参照がないため、適切にGCされます。

+1

ありがとう。私はconsole.logを考えなかった。だから、クロージャの中の上記のオブジェクトの "チャンネル"への参照を保持するとすれば、_closure_への参照が解放されるとすぐにメモリがガベージコレクションされると思いますか?私は正しい? – Karthik

2

限り何もないとしてそれらを参照している。

0

これは、そのchannelsオブジェクトへの参照やそれを含むクロージャーが存在しないためです。

GCは、ほとんどの場合、それを実装するブラウザに依存しているため、実際に行われる保証はありません。しかし、それぞれの要素が過度に機能するのは、deleteです。

+0

thanks私はRobの答えをconsole.logの追加情報のために行った。 – Karthik

0

Javascriptには、ブラウザのエンジン(v8など)によって実装された独自のガベージコレクタがあります。参照の割り当てを解除する必要はありません。ルートが範囲外になると、それらはすべてgcの対象となります。

関連する問題