2013-05-28 10 views
8

私はいくつかの異なるコメントを見たので、これについて混乱しています。私はnullにグローバル変数を設定することは良い練習(他の参照がないと仮定)であり、GCがこの変数のメモリを次の掃引に取り戻すことを言及するjavascriptの本を読んでいます。私はグローバル変数がGCによって決して廃棄されないと言う他のコメントを見てきました。 OOP構造でJavaScriptをプログラミングする場合(ゲームがグローバルコンテキストである場合)、私はこのような何かを持っている場合JavaScriptのガベージコレクタはグローバル変数を破棄しますか?

はまた、何が起こる:

var game = {}; 
game.level = 0; 
game.hero = new hero(); 
//do stuff 
game.hero = null; 

ヒーローがゲームに格納されているオブジェクトの内側に住んでいるので、これはグローバルなコンテキストにあります。たとえば、ヒーローをnullに設定した場合、これはGCによって破棄されますか?

+2

[JavaScriptのガベージコレクションとは何ですか?](http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection?rq=1)を参照してください。 –

答えて

14

大域変数は、大域変数が依然として存在するという意味でGCによって決して処理されません。ただし、nullに設定すると、参照先のメモリが収集されます。

など。

前:

global -> {nothingness} 

後:

global -> var a -> object { foo: "bar" } 

設定しanullへ:ここ

global -> var a -> null 

、オブジェクトによって使用されるメモリは、コレクションの対象となります。変数aがまだ存在し、単にnullを参照しています。

グローバル変数が収集されないという記述は、誤解を招く可能性があります。グローバルコンテキストに戻ってトレーサブル可能なメモリは現在収集対象にはなっていないと言う方がより正確かもしれません。

質問に答えると、グローバルコンテキストへの間接的な接続が切断されているため、ヒーローオブジェクトはコレクションの対象となります。

+0

それを明らかにしてくれてありがとう。私は今、グローバルスコープで10000の変数があった場合にどうなるのだろうかと疑問に思っています。 – user2000950

+2

おそらくそれほど悪くはありません。しかし、グローバル名前空間を変数で汚染するのは悪い習慣と考えられます。 – izb

関連する問題