javascript - 为什么在循环开始时调用 requestAnimationFrame 不会导致无限递归?

标签 javascript animation stack-overflow requestanimationframe

是什么让循环的其余部分得以执行,然后让 requestAnimationFrame 执行下一帧?

我误解了这种方法的工作原理,而且在任何地方都看不到明确的解释。我试着在这里阅读时序规范 http://www.w3.org/TR/animation-timing/但我无法弄清楚它是如何工作的。

例如,这段代码取自threejs文档。

var render = function () { 
  requestAnimationFrame(render); 
  cube.rotation.x += 0.1; 
  cube.rotation.y += 0.1;
  renderer.render(scene, camera); 
};

最佳答案

如果我完全偏离基地,请告诉我;我以前没有用过动画的东西。我看到的一个使用 requestAnimationFrame 的例子是:

(function animloop(){
  requestAnimFrame(animloop);
  render();
})();

您想知道为什么 animloop 在被传递到 requestAnimFrame 时不会在随后被调用时导致无限循环吗?

这是因为这个函数不是真正递归的。您可能会想,当您调用 requestAnimFrame 时,会立即调用 animloop。不是这样! requestAnimFrame 是异步的。所以语句按照你看到的顺序执行。这意味着主线程不等待调用requestAnimFrame返回,调用render()之前。所以 render() 几乎立即被调用。但是,回调(在本例中为 animloop)不会立即调用。它可能在您已经退出第一次animloop 的调用时调用。这个对 animloop 的新调用有自己的上下文和堆栈,因为它实际上并没有从第一个 animloop 调用的执行上下文调用.这就是为什么您最终不会遇到无限递归和堆栈溢出的原因。

关于javascript - 为什么在循环开始时调用 requestAnimationFrame 不会导致无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866329/

相关文章:

javascript - 如何使用 amazon-javascript-sdk 列出 AWS S3 存储桶?

javascript - NGRX Action /效果上的多个有效负载

c# - Javascript 在 ASP.NET Web 应用程序中确认框重定向?

安卓小部件 : Animations on RemoteViews ?

reactjs - 如何在react-三纤中n秒后停止useFrame

c++ - 互相调用函数会导致 stackoverflow 错误

java - Java 中带有 BigInteger 的 StackOverFlowError

javascript - Amcharts 中的乱码文本导出为 PDF

Android:TranslateAnimation - 将 View 移动到 ActionBar 之上

java - Eclipse 中未处理的循环异常