news 2026/4/25 13:33:04

RAF是在事件循环的哪个时刻执行的?(非常棒!)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAF是在事件循环的哪个时刻执行的?(非常棒!)

面试官问requestAnimationFrame(简称rAF)及其在事件循环中的位置,核心是考察你对浏览器事件循环机制、渲染流水线的底层理解,以及rAF的实际应用价值。以下是结构化的回答思路,从“是什么”到“事件循环中的位置”,再到“为什么用”,逻辑层层递进:

一、先回答:什么是requestAnimationFrame?

先给出核心定义,让回答有基础:

requestAnimationFrame是浏览器提供的专门用于动画渲染的API,它的核心作用是:让代码在浏览器“下一次重绘(Repaint)”之前执行,保证动画帧率和浏览器刷新频率(通常60Hz,即16.6ms/帧)同步,避免掉帧、卡顿,是实现高性能前端动画的首选方案(替代setTimeout/setInterval)。

简单举例(基础用法):

// 实现一个简单的元素移动动画constbox=document.getElementById('box');letleft=0;functionmove(){left+=1;box.style.left=`${left}px`;// 递归调用,在下一帧继续执行if(left<300)requestAnimationFrame(move);}// 启动动画requestAnimationFrame(move);

二、核心:requestAnimationFrame在事件循环中的位置

要讲清位置,先回顾浏览器事件循环的核心阶段(简化版):

宏任务队列(Macrotask)→ 微任务队列(Microtask)→ 渲染阶段(重排/重绘)→ 下一轮事件循环

其中:

  • 宏任务:setTimeout/setInterval/AJAX/DOM事件/script标签等;
  • 微任务:Promise.then/catch/async/await/MutationObserver/queueMicrotask等;
  • 渲染阶段:执行重排(Layout)、重绘(Paint)、合成(Composite),更新屏幕。
rAF的核心定位:介于“微任务执行完毕”和“渲染阶段开始”之间

更精准的事件循环执行顺序(含rAF):

  1. 执行当前宏任务(如执行一段script代码、触发一个click事件);
  2. 执行该宏任务对应的所有微任务(清空微任务队列);
  3. 执行requestAnimationFrame回调队列(所有rAF回调);
  4. 浏览器执行渲染阶段(重排、重绘、合成);
  5. 执行requestIdleCallback(如果浏览器有空闲时间);
  6. 进入下一轮事件循环,取出下一个宏任务执行。
关键验证(代码示例):

通过代码能直观证明rAF的执行时机:

// 宏任务(script标签本身是第一个宏任务)console.log('1. 宏任务执行');// 微任务Promise.resolve().then(()=>{console.log('2. 微任务执行');});// requestAnimationFramerequestAnimationFrame(()=>{console.log('3. rAF回调执行(渲染前)');});// 渲染阶段(无控制台输出,是浏览器内部操作)// 下一轮宏任务(setTimeout)setTimeout(()=>{console.log('4. 下一轮宏任务执行');},0);// 输出顺序:1 → 2 → 3 → 4

输出顺序清晰印证:rAF在微任务之后、渲染之前执行,且早于下一轮宏任务(setTimeout)。

补充:rAF和setTimeout的核心区别(面试高频延伸)

很多人会混淆rAF和setTimeout,这里可以对比说明,强化理解:

特性requestAnimationFramesetTimeout/setInterval
执行时机渲染前(与屏幕刷新同步)宏任务队列,时机不可控
帧率自动适配浏览器刷新率(60Hz)固定延迟(如16ms),易掉帧
性能浏览器后台标签页会暂停执行仍会执行,浪费性能
精度由浏览器控制,更精准受事件循环阻塞影响,精度低

三、为什么要设计这个位置?(体现底层思考)

浏览器把rAF放在“微任务后、渲染前”,核心是为了保证动画的高性能和准确性

  1. 同步刷新频率:rAF的回调执行时机刚好在“渲染前”,修改DOM样式后,能直接在本次渲染中生效,避免“修改DOM后错过本次渲染,要等下一轮”的延迟,保证动画帧率和屏幕刷新同步;
  2. 避免无效渲染:如果在渲染阶段之后执行动画逻辑,修改DOM会触发额外的重排/重绘,导致性能损耗;而渲染前执行,所有DOM修改都会合并到一次渲染中;
  3. 节能优化:当页面处于后台标签页时,浏览器会暂停rAF的执行,减少CPU/GPU占用,而setTimeout仍会执行,造成不必要的资源浪费。

四、实际应用场景(面试加分,体现落地能力)

讲完原理后,补充实际用法,证明你懂怎么用:

  1. 高性能动画:替代setTimeout实现元素移动、渐变、滚动动画(如轮播图、下拉刷新);
  2. 防抖/节流优化:高频事件(如resize、scroll)中,用rAF做节流,保证每帧只执行一次逻辑,避免频繁触发:
    // scroll事件节流letisRafPending=false;window.addEventListener('scroll',()=>{if(!isRafPending){isRafPending=true;requestAnimationFrame(()=>{console.log('处理滚动逻辑');isRafPending=false;});}});
  3. 数据可视化渲染:大数据量的图表(如ECharts)渲染时,用rAF分批渲染,避免一次性渲染阻塞主线程;
  4. React中的应用:React 18的useTransition、Suspense的底层调度,也用到了类似rAF的“渲染前调度”思路,保证UI更新不阻塞主线程。

回答总结(精简版,面试时可直接说)

我了解requestAnimationFrame,它是浏览器专为动画设计的API,核心作用是让代码在浏览器下一次重绘前执行,保证动画和屏幕刷新频率同步。

它在事件循环中的位置很明确:执行完当前宏任务的所有微任务后,浏览器渲染阶段开始前。具体顺序是:宏任务 → 所有微任务 → rAF回调 → 渲染 → 下一轮宏任务。这个位置设计的目的是让动画逻辑修改DOM后,能直接在本次渲染生效,避免掉帧,同时浏览器后台标签页会暂停rAF,更节能。

相比setTimeout,rAF帧率更稳定、性能更好,实际开发中常用于高性能动画、高频事件节流(如scroll/resize)、大数据可视化分批渲染等场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:41:24

如何开始你的数据科学职业之旅

原文&#xff1a;towardsdatascience.com/how-to-get-started-on-your-data-science-career-journey-e99f450c93c5?sourcecollection_archive---------4-----------------------#2024-10-20 初学者在选择数据科学及 AI/ML 提升资源时需要考虑的六个要点 https://medium.com/r…

作者头像 李华
网站建设 2026/4/17 23:47:27

幽冥大陆(六十五) PHP6.x SSL 文字解密—东方仙盟古法结界

php 6 ssl 解密代码function 未来之窗_safe_解密($text, $sKey) {// 强制开启错误输出&#xff0c;避免无返回error_reporting(E_ALL);ini_set(display_errors, 1);// 第一步&#xff1a;先返回基础信息&#xff08;确保有输出&#xff09;$debugInfo [密钥原始值 > $sKey,…

作者头像 李华
网站建设 2026/4/17 17:55:57

PCB FR-4材料是什么?分享从成分到应用

作为 PCB 行业的老工程师&#xff0c;我经常遇到刚入行的朋友问&#xff1a;“为什么大部分 PCB 都用 FR-4 材料&#xff1f;它到底有什么特别之处&#xff1f;” 其实&#xff0c;FR-4 是目前 PCB 行业应用最广泛的基材&#xff0c;没有之一。小到手机充电器&#xff0c;大到工…

作者头像 李华
网站建设 2026/4/23 12:27:47

利用Keil仿真功能验证51单片机流水灯逻辑

从零开始&#xff1a;用Keil仿真彻底搞懂51单片机流水灯你有没有过这样的经历&#xff1f;写完一段看似完美的流水灯代码&#xff0c;烧进开发板后却发现LED乱闪、不亮、或者卡在某个位置不动。反复插拔下载线、换电源、查电路……最后发现只是延时写错了两个数。别急——其实这…

作者头像 李华
网站建设 2026/4/23 7:31:39

中文语音合成首选:GPT-SoVITS优化适配本地化发音习惯

中文语音合成的破局者&#xff1a;GPT-SoVITS 如何重塑本地化发音体验 在智能音箱念出“今天气温是25度”时&#xff0c;你有没有一瞬间觉得它像极了某位熟人&#xff1f;这种“似曾相识”的语音质感&#xff0c;不再是大型科技公司的专属魔法。如今&#xff0c;只需一段一分钟…

作者头像 李华