2011-06-24 6 views
0

私はこのQnAで同様のスレッドを見ましたが、具体的なシナリオは次のとおりです。Javascriptオブジェクトがメモリからガベージコレクションされるときは?

function render(canvas) { 
    var renderer = new Renderer(canvas); 
    renderer.render(); 
} 

Renderer.render()<canvas>にいくつかのものを描画します。今のところ、これは動作するということです。つまり、インスタンスrendererはガベージコレクションされません。これは私の質問に私をもたらします - rendererはいつゴミ収集されますか?このオブジェクトは、それ自身のメソッドを除いてどこでも参照されることに注意してください。

レンダリングが終了すると、そのオブジェクトはガベージコレクションされます。それを強制する方法はありますか?

+1

レンダラが範囲外になった後、**ガベージコレクションではないことをどのように知っていますか? –

+0

それまでは、範囲外になるとすぐにレンダリングが停止するはずでした。それは事実上何もレンダリングできなかったことを意味します。 – AppleGrew

+0

ああ、私は 'render()'はすぐにレンダリングするつもりはないと付け加えるべきです。これはキューの並べ替えであり、キューを処理するために後で実行される 'setTimeout'を設定します。これは、レンダリング中にブラウザがロックされないようにするためのトリックです。 – AppleGrew

答えて

0

あなたのタイムアウトはrender()で、レンダラへの参照を保持する関数への参照を保持します。タイムアウトが実行され、それ以上タイムアウトが設定されない場合、関数への参照はなく、レンダラーへの参照がないため、ガベージコレクションが行われることは明らかです。

+0

はい、私はそれを得ました。ありがとう。 – AppleGrew

1

v8の方法では、オブジェクトの参照はなく、javascriptエンジンはアイドル状態になります。

1

ECMAScript仕様では、ECMAScript仕様では詳細が定義されていないため、さまざまなブラウザで実装が異なりますが、JavaScriptでは通常、オブジェクトに参照が残っていないとガベージコレクションが可能になります。

例の場合は、rendererが宣言された関数が返されます。

+0

'render'関数は非同期であり、新しいスレッドやそのようなものを開始します。 –

+0

はい。だから私はこの質問をしました。 – AppleGrew

+0

@Kerrek SB - これは可能ですが、いずれの場合でも 'renderer'オブジェクトに参照が残っていなければガベージコレクションに利用できるようになります。 –

関連する問題