JavaScriptもしくはJScriptではJavaと同様にGCが実装されています。GCでは使われなくなったオブジェクトが開放されます。しかしGCは使われなくなったオブジェクトが発生する度に実行されるわけではありません。タイミングは任意で、JavaScriptエンジンが適宜判断して行なわれます。
※IEでは「CollectGarbage();」を書くことで明示的にGCを実行させることができます
変数に明示的にnullを代入すると、その変数に代入されていたオブジェクトは、他のオブジェクトに代入されていない限りは開放対象になります。
また、ローカル変数であれば明示的にnullを代入しなくても、関数の呼び出しの終了とともに変数自体が破棄されます。この際、当然オブジェクトも開放対象になります。そのため、関数の終わりでローカル変数にnullを代入するコードは全く意味がありません。意味が無いだけならまだしも、代入処理の分わずかながらパフォーマンスが劣化します。※そのようなコードを書くことは「JavaScriptをあまり理解していません」と自己紹介しているようなもので恥ずかしいことですので気をつけましょう。
しかし、グローバル変数として宣言されている場合には、ページがunloadされるまで変数が破棄されません。当然オブジェクトも保持されます。そのため、使用しなくなった際に明示的にnullを設定することに意味が発生します。
まとめ
一般的にローカル変数に対しnullを代入するコードを書くのは、避けるべきだと思います。変数のスコープ・GCの仕組み等をきちんと理解したうえで、適切な記述を行なうことが大切です。
2012/01/08
|