# requestAnimationFrame和requestIdleCallback以及setTimeout
| 特性 | requestAnimationFrame | requestIdleCallback | setTimeout |
|---|---|---|---|
| 执行时机 | 下一帧渲染前(与绘制同步) | 浏览器空闲时(或超时后) | 指定延迟后(宏任务) |
| 用途 | 动画、读取稳定布局(getBoundingClientRect) | 后台/闲时任务,低优先级工作 | 任意延时/回退/防抖 |
| 精准性 | 高(与帧同步) | 低(由浏览器决定) | 取决于浏览器/标签页可见性 |
| 阻塞渲染? | 否(在绘制前执行短任务可影响帧率) | 否(空闲时执行) | 可能(如果回调执行耗时) |
| 取消方法 | cancelAnimationFrame(id) | cancelIdleCallback(id) | clearTimeout(id) |
| 浏览器支持 | 广泛 | 支持不均(Safari 需 polyfill) | 全浏览器支持 |
# requestAnimationFrame
场景:帧动画、平滑过渡、需要读取元素最新布局(getBoundingClientRect())并基于此做渲染决策。
# requestIdleCallback
- 场景:预加载数据、统计、日志上报、非关键 DOM 检测(比如延迟展示不影响 UX 的 tooltip)、大批量 DOM 操作可拆成多段等。
- 优点:浏览器忙时不会运行,能避免影响主线程性能;支持 timeout 作为兜底。
- 缺点:跨浏览器支持不一(Safari 不支持),回调执行时间不可保证(可能被无限延后直到浏览器空闲)。
# setTimeout
场景:简单的防抖(debounce)、超时兜底、兼容环境下做 fallback、在页不可见时仍需要按时执行(注意有浏览器 throttle)。
优点:简单、跨浏览器、可设任意延时。
缺点:无法与渲染同步、精度受限(最小延时规则)、当页面不可见/后台标签页会被节流(可能 1000ms+)。
← 实现拖拽控制页面宽度 输入即搜索 →