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

时间:2013-07-29 14:13:00

标签: javascript google-chrome v8

作为标题,为什么requestAnimationFrame递归不会占用RAM。这个post说V8引擎没有tail call的优化,所以我想我一定错过了什么。是因为浏览器背后有什么东西吗?或者V8支持tail call的优化?

这是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);

1 个答案:

答案 0 :(得分:9)

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

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

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