setTimeout 就是延迟执行,等 N 毫秒后执行一次。
核心两个:
① setTimeout(fn, 毫秒)——N 毫秒后执行一次
② clearTimeout(id)——取消定时器
坑:this 在回调里是 window(非严格模式)、闭包拿变量、最小延迟 4ms 不是 0。
// 语法:setTimeout(到点要干的事, 等多少毫秒)
// 它会吐回一个数字 ID,这个 ID 必须用变量接住,不然没法取消
// 写法一:直接塞一个匿名函数(最常用)
let timerId = setTimeout(function () {
// 2000 毫秒就是 2 秒,到点喊我
console.log("2秒后执行一次");
}, 2000);
// 写法二:再写一个匿名函数(和写法一一样)
let timerId2 = setTimeout(function () {
// 3 秒后弹个窗
alert("3秒弹窗");
}, 3000);
// 写法三:直接把函数名字传进去(注意:千万别加括号!)
function task() { console.log("执行任务"); }
// 传 task 本人,1 秒后它自己跑
let timerId3 = setTimeout(task, 1000);
setTimeout(task, 1000) 传的是"函数本人";写 setTimeout(task(), 1000)(带了括号)会立刻执行 task,闹钟形同虚设——这是新手高频错误。
// 定一个闹钟,它会给你一个编号(比如 1、2、3…)
// 这编号就是"取消闹钟的遥控器",没它你按不下去
let timerId = setTimeout(function () {
// 已经被取消,这行根本跑不到
console.log("不会执行了");
}, 5000);
// 在响之前按遥控器取消它
// 闹钟作废,到点不响了
clearTimeout(timerId);
没保存 ID = 无法取消 = 定时器失控。作业里"忘记保存定时器 ID 导致无法清除"就是专门考这个。
// 单位是毫秒:1000 毫秒 = 1 秒 // 它说的"延迟 2 秒"是"最早 2 秒后",不是"分秒不差 2 秒": // 前面要是还有一大堆代码在跑,它就得往后排队等 // 常拿来做:延迟提示、防抖、倒计时前的那一下等待
"延迟 2 秒"不是"保证第 2 秒整执行",而是"至少 2 秒后"——主线程忙完才轮得到它。
| API | 作用 | 参数 | 返回值 | 代码示例 |
|---|---|---|---|---|
| setTimeout(函数, 毫秒) | 到时间后只执行一次 | 函数、延迟毫秒数 | 定时器编号 ID | let id = setTimeout(function () { console.log('2秒后'); }, 2000); |
| clearTimeout(ID) | 在响之前取消它 | 定时器编号 | 无 | clearTimeout(id); // 响之前取消 |