浏览器常用定时器是 setTimeout 和 setInterval;setImmediate 仅 Node.js 支持,非标准 Web API;requestAnimationFrame 专用于动画,由屏幕刷新率驱动。

选定时器不是看名字多酷,而是看任务要“等多久”“执行几次”“在哪一环执行”。浏览器环境里真正常用的是 setTimeout 和 setInterval;setImmediate 基本只在 Node.js 里可用,浏览器不支持,别硬套。
一次性延迟执行?用 setTimeout
适合弹窗提示、延后加载、防抖触发等只需跑一次的场景。它保证回调函数在指定毫秒数后“进入任务队列”,但实际执行时间取决于主线程是否空闲。
- 语法简洁:
const id = setTimeout(() => console.log('1秒后执行'), 1000) - 支持传参(IE9+):
setTimeout(fn, 500, 'a', 'b'),比拼字符串更安全 - 必须清除:不用时调用
clearTimeout(id),避免内存泄漏或误触发 - 最小延迟约 4ms:即使写
setTimeout(fn, 0),浏览器也会按至少 4ms 处理
周期性重复执行?优先考虑 setInterval
轮播图切换、心跳检测、实时倒计时等固定间隔任务,直接用 setInterval 最直观。
- 语法类似:
const id = setInterval(() => updateClock(), 1000) - 注意执行节奏:它不管上一次回调有没有结束,到点就往队列塞新任务——如果回调耗时长,可能堆积,造成卡顿
- 务必配对清除:用完立刻
clearInterval(id),尤其在组件卸载、页面跳转前 - 替代方案:若需严格串行(比如上一次完成才启动下一次),改用
setTimeout递归调用更稳妥
setImmediate 不是浏览器定时器
它不属于标准 Web API,在 Chrome、Firefox、Safari 等主流浏览器中无法使用。仅存在于 Node.js(v0.10+)和旧版 IE10,语义是“当前事件循环结束后立即执行”,比 setTimeout(fn, 0) 更早一点,但差异微乎其微。
立即学习“Java免费学习笔记(深入)”;
- 浏览器开发中遇到
setImmediate报错,说明代码被误迁移到前端了 - Node.js 场景下可用,但现代写法更倾向
process.nextTick或 Promise 链 - 想模拟“尽快执行”又兼容浏览器?用
Promise.resolve().then(fn)或queueMicrotask(fn)
其他补充:requestAnimationFrame 是动画专属定时器
虽然不在问题标题里,但常被拿来对比。它不接受毫秒参数,而是由系统决定——每次屏幕刷新前执行一次,天生防丢帧、省电、顺滑。做动画、滚动监听、Canvas 渲染,它比 setTimeout 或 setInterval 更合适。
- 自动节流:屏幕停显时暂停执行,节省资源
- 必须手动清除:用
cancelAnimationFrame(id) - 不能替代倒计时或逻辑轮询——它不保证固定间隔,只保证“下一帧”


















