You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于requestAnimationFrame执行时机与触发条件的疑问

关于requestAnimationFrame执行时机与触发条件的疑问

嘿,我来帮你理清这个误区~

首先你的观察完全没错:只要你像代码里那样持续注册requestAnimationFrame回调,它就会在浏览器的每一个刷新周期里被调用,不管页面有没有发生视觉变化。你之前的误解主要是把两个概念搞混了:

  • 资料里说的「requestAnimationFrame在浏览器重绘前运行」是对的,但重绘的触发和requestAnimationFrame的回调触发并不是绑定的因果关系。浏览器的刷新周期是固定的(比如主流的60Hz屏幕就是每16.6ms一次),哪怕页面完全静止,前台状态下的浏览器也会维持这个刷新节奏——requestAnimationFrame的回调就是在这个固定的刷新周期里执行,不管你有没有修改视图。
  • 你代码里的逻辑是:每次step执行时,都主动调用window.requestAnimationFrame(step),相当于一直在给浏览器“预约”下一次刷新的回调名额。所以不管你有没有改变页面内容,浏览器都会在每个刷新周期执行这个回调,自然console.log("aaa")会一直打印。
  • 至于浏览器是否会重绘,那是在requestAnimationFrame回调执行之后才会判断的:如果回调里的代码修改了DOM的样式、布局等会影响视觉的内容,浏览器就会进行重绘;如果回调里只是做了日志打印这种不影响视图的操作,浏览器可能会跳过重绘,但回调本身还是会按时执行。

举个简单的对比:如果把你的代码改成只注册一次requestAnimationFrame(step),那它只会执行一次;但你在回调里又重复注册,就形成了一个持续的循环,绑定了每一次刷新周期。

你的测试代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="some">aaa</div>
  </body>
  <script>
    function step(timeStamp) {
      console.log("aaa"); // gets printed every frame
      window.requestAnimationFrame(step);
    }
    window.requestAnimationFrame(step);
  </script>
</html>

备注:内容来源于stack exchange,提问作者ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:14:51