我正在做一个小项目,使用Twitter流API并从中制作出一个小型画布动画。由于Twitter流API没有结束,因此动画可能会无限进行。
这就是问题所在。requestAnimationFrame似乎通过递归来运行,而且在ES6之前我们没有得到恰当的尾调用,这意味着我认为这会为每一帧增加调用堆栈。
问题是,我是否正确,这最终会引发超过最大调用堆栈大小的错误,还是浏览器会玩一个技巧以避免限制?requestAnimationFrame是否真的在做我不理解的奇怪事情(也许是类似于setInterval不是递归的东西)?
在Chrome 36.0.1985.32 beta中(其调用堆栈大小为20834),我正在进行测试:
这就是问题所在。requestAnimationFrame似乎通过递归来运行,而且在ES6之前我们没有得到恰当的尾调用,这意味着我认为这会为每一帧增加调用堆栈。
问题是,我是否正确,这最终会引发超过最大调用堆栈大小的错误,还是浏览器会玩一个技巧以避免限制?requestAnimationFrame是否真的在做我不理解的奇怪事情(也许是类似于setInterval不是递归的东西)?
在Chrome 36.0.1985.32 beta中(其调用堆栈大小为20834),我正在进行测试:
function test(t) {
requestAnimationFrame(test);
}
test(performance.now());
我并没有发现任何问题。假设每秒60帧,我预计会在大约6分钟后抛出一个RangeError
。
Chrome开发者工具窗口中的调用堆栈部分显示了另一个误导性信息,它显示了requestAnimationFrame
调用堆栈,似乎会填满整个堆栈,如下图所示: