簡単な質問ですが、私はまだ100%確信しているという回答は見つかりませんでした。ループ内のJavascript関数の割り当てガベージ作成
バージョン1:
var a = [1,2,3];
function doStuff(obj) {
//do nothing
}
function test() {
a.forEach(doStuff);
}
setInterval(test, 1000/60);
バージョン2:
var a = [1,2,3];
function test() {
a.forEach(function(obj) {
//do nothing
});
}
setInterval(test, 1000/60);
バージョン1は、2つの機能を割り当て、これまでに何かを割り当てません。このコードは考えてみましょう。
バージョン2は、test()が呼び出されるたびに新しい関数を割り当てますか?私は、 test()が呼び出されるたびに、バージョン2のforEach内部の無名関数がで作成されることを理解していますが、test()の呼び出しが終了すると、それ以上参照がなく、ガベージコレクションが可能です。したがって、バージョン2を長時間実行すると、ガベージコレクタは、作成されたガベージオブジェクトバージョン2をクリーンアップする必要があります。私は正しい?
実際にテストを毎秒6万回呼び出すことを意味しましたか?ブラウザはその要求を尊重しないためです。 –
はい、バージョン2は 'test'が呼び出されるたびに新しい関数オブジェクトをインスタンス化しますが、実行する必要のある(ヒープ)ガーベジコレクションなしでスタックに割り当てることができるかもしれません。 – Bergi
ES3は2番目の機能をリサイクルすることを許可しましたが、後のコアでもそのように最適化されず、機能の起動部分以外のすべてを再使用することは想像できません。 – dandavis