为什么"requestAnimationFrame"递归不会占用内存?

Yad*_*ood 5 javascript google-chrome v8

作为标题,为什么requestAnimationFrame递归不会占用内存.这篇帖子说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);
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 11

requestAnimationFrame一旦帧需要绘制,通知浏览器它希望执行回调函数.必须存储函数的闭包直到进行回调,但之后它可以被垃圾收集,只要它不在别处引用.

这里没有递归,因为我们通过一个断开执行的事件循环.该函数不会调用自身,它要求被调用.每次完成执行时,都可以回收该位RAM.

值得记住的是,如果step简单地称自己,那将是一个无限的递归.在这种情况下,堆栈会爆炸.如果我们想象一个无法爆发的无限堆栈(或尾调用递归),它将阻止事件循环并阻止任何其他代码运行,因为一次只能运行一个函数.

  • 选词非常好,伙计! (2认同)