Javascript 为什么;requestAnimationFrame";递归赢了';不要吃掉公羊?

Javascript 为什么;requestAnimationFrame";递归赢了';不要吃掉公羊?,javascript,google-chrome,v8,Javascript,Google Chrome,V8,作为标题,为什么requestAnimationFrame递归不会消耗RAM。这意味着V8发动机没有针对尾部调用进行优化,因此我想我一定错过了什么。这是因为浏览器在背后做了什么吗?或者V8支持优化尾部调用 以下是MDN的: 功能步骤(时间戳){ var progress=时间戳-开始; d、 style.left=Math.min(progress/10200)+“px”; 如果(进度

作为标题,为什么
requestAnimationFrame
递归不会消耗RAM。这意味着V8发动机没有针对
尾部调用进行优化,因此我想我一定错过了什么。这是因为浏览器在背后做了什么吗?或者V8支持优化
尾部调用

以下是MDN的:

功能步骤(时间戳){
var progress=时间戳-开始;
d、 style.left=Math.min(progress/10200)+“px”;
如果(进度<2000年){
请求动画帧(步骤);
}
}
请求动画帧(步骤);

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

这里没有递归,因为我们将通过一个断开执行的事件循环。函数不是在调用自身,而是在请求被调用。每次它完成执行时,该内存位都可以被回收


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

非常好的选择,伙计!
function step(timestamp) {
  var progress = timestamp - start;
  d.style.left = Math.min(progress/10, 200) + "px";
  if (progress < 2000) {
    requestAnimationFrame(step);
  }
}

requestAnimationFrame(step);