javascript – 为什么在循环开始时调用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是异步的.因此,语句按您看到的顺序执行.这意味着主线程在调用render()之前不会等待对requestAnimFrame的调用返回.因此几乎立即调用render().然而,回调(在这种情况下是animloop)不会立即调用.当你已经退出第一次调用animloop时,可能会在将来某个时候调用它.这个对animloop的新调用有自己的上下文和堆栈,因为它实际上并没有在第一个animloop调用的执行上下文中调用.这就是为什么你最终没有无限递归和堆栈溢出.

翻译自:https://stackoverflow.com/questions/21866329/why-does-calling-calling-requestanimationframe-at-the-beginning-of-a-loop-not-ca

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章