news 2026/10/15 21:14:20

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/10/14 7:37:36

12月确认2026专项附加扣除与 明年3月个税汇算,到底啥区别?

12月确认2026专项附加扣除与 明年3月个税汇算&#xff0c;到底啥区别&#xff1f;每年一到12月就懵圈&#xff1a;个税抵扣到底该咋弄&#xff1f; 12月确认2026专项附加扣除与 明年3月个税汇算&#xff0c;到底啥区别&#xff1f; 为啥非要12月确认&#xff1f; 简单说&#x…

作者头像 李华
网站建设 2026/10/13 12:08:30

快手直播灾难级事故?快手是被黑客入侵了?还是有别的特殊原因?快手急招网安岗位?

这场事件甚至可以成为互联网元年事件&#xff0c;因为性质非常严重&#xff0c;你甚至无法想象这是一个中大厂能干出来的T0级事故。 事故能产生具备几个非常难的黑客需要攻破的技术难点。1、同时大量正常号被盗&#xff0c;被用于直播。 2、看起来模型审核失效&#xff0c;快手…

作者头像 李华
网站建设 2026/10/15 1:55:57

27、Drupal API与Drush命令全解析

Drupal API与Drush命令全解析 在Drupal开发中,API和命令行工具起着至关重要的作用。下面将详细介绍Drupal中的Field CRUD API、Field Attach API以及Drush命令等相关内容。 1. Field CRUD API Field CRUD API主要用于创建字段、捆绑包和实例。以下是该API中的一些主要函数和…

作者头像 李华
网站建设 2026/10/14 16:43:17

28、开发技术综合指南

开发技术综合指南 1. 数据库操作 1.1 数据库层概述 数据库层在开发中占据重要地位,涵盖了从抽象到具体操作的多个方面。数据库抽象层(data abstraction layer)为数据库操作提供了统一的接口,使得开发者可以更方便地与不同类型的数据库进行交互。数据库层的抽象(abstrac…

作者头像 李华
网站建设 2026/10/14 21:40:02

ModbusSlave使用教程:STM32平台手把手入门指南

手把手教你用STM32实现Modbus从机&#xff1a;从协议到代码的完整实战指南在工业现场&#xff0c;你是否遇到过这样的问题&#xff1f;多个传感器各自为政&#xff0c;数据无法统一采集&#xff1b;PLC要读取温湿度却对接困难&#xff1b;上位机监控系统只能“盲操”……这些问…

作者头像 李华
网站建设 2026/10/14 19:52:10

基于单片机的模拟I2C工业通信手把手教程

手把手教你用单片机实现工业级模拟I2C通信你有没有遇到过这样的情况&#xff1a;项目紧急&#xff0c;板子已经打好了&#xff0c;结果发现主控芯片的硬件I2C引脚被其他功能占用了&#xff1f;或者现场传感器总是在通信中途“卡死”&#xff0c;硬件模块束手无策&#xff0c;只…

作者头像 李华