号second
とthird
はまだあなたのオブジェクトへの参照を持っています。
あなたがこれを行うと:
var first = {};
var second = first;
あなたの変数second
first
への参照を持っていません。 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つの変数が必要になりますがスコープの外に出て変数自体がガベージコレクションされるようにします。
短い答え:はい。なぜでしょうか? –
オブジェクトはまだ2番目と3番目に利用できるので、いいえ、GCを取得しません。 – MinusFour
@JanDvorak - そうではありません。オブジェクトには、まだ「second」と「third」がスコープの範囲内にある限り、ライブ参照があります(クロージャー内であっても)。 –