2013-07-29 10 views
5

タイトルとして、なぜ​​再帰はRAMを食べていません。このpostは、V8エンジンにtail callの最適化がないと言いました。それはブラウザがその背後に何かをしたからですか?または、V8はtail callの最適化をサポートしていますか?ここでなぜ "requestAnimationFrame"再帰はRAMを使い果たしませんか?

はMDNのexampleです:

function step(timestamp) { 
    var progress = timestamp - start; 
    d.style.left = Math.min(progress/10, 200) + "px"; 
    if (progress < 2000) { 
    requestAnimationFrame(step); 
    } 
} 

requestAnimationFrame(step); 

答えて

9

​​は、それが、すぐにフレームが描画必要として実行されるコールバック関数を望んでブラウザに通知します。関数のクロージャは、コールバックが行われるまで格納されなければなりませんが、その後は別の場所で参照されない限り、ガベージコレクトされます。

ここでは、実行を切断するイベントループを経由しているため、再帰はありません。この関数はそれ自身を呼び出すのではなく、呼び出されることを要求しています。実行が終了するたびに、そのビットのRAMを再利用することができます。

値がstepであれば、それは無限の再帰になります。この場合、スタックは爆発するでしょう。私たちが爆破できない無限のスタック(またはテールコール再帰)を想像すると、イベントループをブロックし、他のコードが実行されないようにします。

+1

優れた単語の選択、メイト! –

関連する問題