5

タイトルのとおり、なぜrequestAnimationFrame再帰が RAM を消費しないのか。この投稿では、V8 エンジンには の最適化が行われていないと述べているため、tail call何かを見逃しているに違いないと思います。それはブラウザが背後で何かをしたからですか?または、V8 は次の最適化をサポートしていtail callますか?

MDN のを次に示します。

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

requestAnimationFrame(step);
4

1 に答える 1

12

requestAnimationFrameフレームの描画が必要になったらすぐにコールバック関数を実行することをブラウザに通知します。関数のクロージャーは、コールバックが行われるまで保存する必要がありますが、その後は、他の場所で参照されていない限り、ガベージ コレクションを実行できます。

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

単純stepに自分自身を呼び出すと、無限再帰になることに注意してください。この場合、スタックは爆発します。爆破 (またはテールコール再帰) できない無限スタックを想像すると、イベント ループがブロックされ、一度に 1 つの関数しか実行できないため、他のコードの実行が妨げられます。

于 2013-07-29T14:27:30.880 に答える