为什么"requestAnimationFrame”;递归获胜'不要占用RAM
Why "requestAnimationFrame" recursion won't eat up RAM?
作为标题,为什么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
简单地调用自己,那将是一个无限递归。在这种情况下,烟囱会爆炸。如果我们想象一个无限堆栈不会爆炸(或尾调用递归),它会阻塞事件循环并阻止任何其他代码运行,因为一次只能运行一个函数。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 有更好的方法吗?(递归解析HTML unicode实体)
- 为什么递归生成器函数没有't在ES2015工作
- 使用递归实现加性持久性
- 递归显示n元树
- 无递归的异步循环
- 为什么"requestAnimationFrame”;递归获胜'不要占用RAM