setTimeout 是浏览器和 Node.js 提供的单次延迟执行函数,指定毫秒后调用回调一次,返回 timeoutId 可 clearTimeout;需避免立即调用、字符串传参等错误,且执行时机受主线程阻塞、页面激活状态和系统精度影响。

setTimeout 是什么,它能做什么
setTimeout 是浏览器环境(以及 Node.js 通过 timers 模块)提供的全局函数,用于在指定毫秒数后执行一次回调函数。它不循环、不重复,只触发一次——这正是“单次延迟执行”的核心保障。
注意:它返回一个数字类型的 timeoutId,可用于后续取消(用 clearTimeout),但如果不取消,到期后自动执行并释放。
基本写法和常见错误写法
正确写法是把函数引用或匿名函数作为第一个参数,毫秒数作为第二个参数:
setTimeout(() => console.log('3秒后执行'), 3000);
常见错误包括:
- 把函数调用写成
setTimeout(myFn(), 1000)—— 这会立即执行myFn,传给setTimeout的是它的返回值(通常是undefined) - 误传字符串如
setTimeout("alert(1)", 1000)—— 虽然能运行,但会触发eval,有安全与性能隐患,已废弃 - 混淆单位:参数是毫秒,不是秒。写
setTimeout(fn, 5)是 5 毫秒,不是 5 秒
传参给回调函数的三种安全方式
setTimeout 支持从第三个参数起向回调函数传递参数,但兼容性需留意:
- 现代写法(推荐):
setTimeout(fn, delay, arg1, arg2)—— Chrome 21+、Firefox 14+、Safari 6.1+、Edge 全支持 - 兼容老浏览器(如 IE9):用匿名函数包裹,
setTimeout(() => fn(arg1, arg2), delay) - 避免用
bind做部分绑定(如fn.bind(null, arg1)),因为会创建新函数,若需 clearTimeout 就得额外存引用
例如:
function greet(name, time) { console.log(`Hello ${name} at ${time}`); }<br>setTimeout(greet, 2000, 'Alice', Date.now());
容易被忽略的执行时机与精度问题
setTimeout 不保证“精确在 N 毫秒后执行”,只保证“至少延迟 N 毫秒”。实际执行时间受以下影响:
- 主线程是否繁忙:如果 JS 主线程正执行长任务(如大数组排序、大量 DOM 操作),回调会被挂起,直到线程空闲
- 浏览器节流策略:标签页非激活状态时,多数浏览器会将最小间隔限制为 1000ms(即使设了 100ms)
- 系统定时器精度:底层依赖操作系统事件循环,通常有 4–16ms 的误差
所以,别用它做高精度倒计时或音视频同步;需要精确节奏请考虑 requestAnimationFrame 或 Web Workers 配合 performance.now() 校准。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











