次のコードを検討してください(これはChromeのデベロッパーコンソールに入れて確認できます)。Javascript/ECMAScriptガベージコレクション
var obj = {
f: function() {
var myRef = this;
val = setTimeout(function() {
console.log("time down!");
myRef.f();
}, 1000);
}
};
私はその後、
obj.f();
はタイマーを開始するために実行した場合、私は "ダウンタイム!" 秒ごとに見ることができます私はその後、
obj = null;
を実行する場合
タイマーがまだ起動します。
なぜガーベジコレクションはタイマーをクリアしていないのですか?怖いのは、のタイマーを今すぐ削除する方法がないようです。 - 私は正しいですか?
私の推測では、技術的にはwindow
にはまだオブジェクトへの参照が保持されていますが、結果としてオブジェクトはメモリ内にとどまっています。私は別のECMAベースの言語(Actionscript)でこの問題を経験し、それを扱うためのライブラリを構築しましたが、Javascriptは別のアプローチを取ると考えていました。
それは答えをチェックアウトする価値があるかもしれません:http://stackoverflow.com/questions/858619/viewing-all-the-timouts-intervals-in-javascriptそれはあるようですが停止する方法はありませんこのようにしたらタイマー! –
これは特別な処理が必要な問題ではありません。これは設計によるものです。ユーザーがページから移動する前にタイマーを停止させる場合は、 'setTimeout'の戻り値を放棄するのではなく、' clearTimeout'を使ってその値を止めることができます。 –
実際のコードでは、このようなことは実際には起こりません。このインライン関数宣言、コンテナオブジェクト、およびあるスコープから別のスコープへの漏洩のこのような組み合わせはすべて、コードを読みにくくします。少し包装がいくつかの問題を解決できるいくつかの状況がありますが、これはそれらの1つのようではありません。 – aaaaaaaaaaaa