为什么"requestAnimationFrame”;递归获胜'不要占用RAM

Why "requestAnimationFrame" recursion won't eat up RAM?

本文关键字:RAM 递归 quot requestAnimationFrame 为什么 获胜      更新时间:2023-09-26

作为标题,为什么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);

requestAnimationFrame通知浏览器,它希望在需要绘制框架时立即执行回调函数。函数的闭包必须在回调之前存储,但在回调之后可以进行垃圾回收,前提是它没有在其他地方被引用。

这里没有递归,因为我们要通过一个断开执行的事件循环。函数不是在调用自己,而是要求被调用。每当它完成执行时,那一位RAM就可以被回收。

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