作为标题,为什么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);
答案 0 :(得分:9)
requestAnimationFrame
通知浏览器,一旦帧需要绘制,它就希望执行回调函数。必须存储函数的闭包直到进行回调,但之后它可以被垃圾收集,只要它不在别处引用。
这里没有递归,因为我们通过一个断开执行的事件循环。该函数不会调用自身,它要求被调用。每次完成执行时,都可以回收那一点RAM。
值得记住,如果step
简单地称自己,那将是无限递归。在这种情况下,堆栈会爆炸。如果我们想象一个无法爆炸的无限堆栈(或尾调用递归),它会阻止事件循环并阻止任何其他代码运行,因为只能运行一个函数。