2016-05-29 12 views
1

私はちょうどjavascriptのスコープでいくつかの実験をやっています。 私の質問:次のコードスニペットでは、 'second'と 'third'はガベージコレクションされますか?これは、リンクされたリストを扱う際に特に役立ちます。それはまだゴミを収集することはできませんのでnullを指し示すjavascriptオブジェクトのチェーンがガベージコレクションされますか?

var first = {} 
var second = first; 
var third = second; 

first = null; 
+0

短い答え:はい。なぜでしょうか? –

+0

オブジェクトはまだ2番目と3番目に利用できるので、いいえ、GCを取得しません。 – MinusFour

+1

@JanDvorak - そうではありません。オブジェクトには、まだ「second」と「third」がスコープの範囲内にある限り、ライブ参照があります(クロージャー内であっても)。 –

答えて

3

secondthirdはまだあなたのオブジェクトへの参照を持っています。

あなたがこれを行うと:

var first = {}; 
var second = first; 

あなたの変数secondfirstへの参照を持っていません。 firstが指し示すのと同じオブジェクトへの参照があります。したがって、同じオブジェクトへの参照を持つ2つの等しい変数があります。

あなたが設定した場合:

first = null; 

すべては、あなたがfirst変数にそのオブジェクトへの参照は明らかでした。オブジェクト自体はまったく影響を受けませんでした。そして、あなたの質問にとって最も重要なのは、変数secondはまったく影響を受けていないため、そのオブジェクトへの参照がまだ残っているため、ガベージコレクションできません。

Javascriptのオブジェクトをガベージコレクトするには、コード内のどこにでも到達可能なコード内のそのオブジェクトへのライブ参照が存在していない必要があります。 secondがまだ到達可能な変数である限り、その変数が指すオブジェクトはガベージコレクションできません。あなたはポインタとC++のような言語を知っている場合は、firstにあなたのオブジェクトへのポインタを置くよう

var first = {}; 

に行ったよう


、あなたは割り当てを考えることができます。 firstは実際にオブジェクト自体を含んでいません。オブジェクトはそれ自身で存在します。 firstには、そのオブジェクトのポイントが含まれています。

次に、あなたが行うとき:

var second = first; 

あなたが別の変数を作成し、firstからポインタを取得し、secondにその同じポイントのコピーを置きます。これで、オブジェクトへのポインタを含む2つの完全に別々の変数が作成されました。あなたがやるときにオブジェクトがそれ自身の上に存在する、覚えておいてください:

first = null; 

あなたはfirstにポインタをクリアしている行っているすべての。オブジェクトはまだそこにあり、secondにはまだポインタが含まれています。まだライブポインタがあるので、オブジェクトはガベージコレクションされません。ごみを収集するためにあなたのオブジェクトの場合


、あなたはのようにクリアするオブジェクトへの参照が含まれている3つのすべての変数必要があります、次のいずれか

var first = {} 
var second = first; 
var third = second; 

first = null; 
second = null; 
third = null; 

それとも、あなたはすべての3つの変数が必要になりますがスコープの外に出て変数自体がガベージコレクションされるようにします。

+0

MDNには、古い「参照カウント」アルゴリズムと新しい「マークとスイープ」が記載されています。アルゴリズムはオブジェクトへの参照の点で重要ですか? [Memory Management](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management) – Duco

+0

@Duco - これは、ガベージコレクタがライブ参照を追跡するために使用する実装メソッドです。ガベージコレクションの背後にある目的は同じです。特に、オブジェクトの数が多くなり、それらの間の関係が複雑になったり、部分的なスコープを収集したり、循環参照の問題がないようにしたい場合は、信頼性が高く、高速なガベージコレクタは簡単ではありません。これに加えて、ブラウザには収集する2つのオブジェクト空間(JavascriptとDOM)があり、JavascriptにDOMオブジェクトへの参照があるときに相互に関連付けることができます。 – jfriend00

+0

助けてくれてありがとう!オブジェクトは参照によってのみ参照されることがわかりますが、直感的ではありません。前の項目がnullの場合、リンクリストをnullにするgetterメソッドを使用します... hmmm。再度、感謝します。 – Duco

関連する問題