← 返回目录

11. setTimeout 延时定时器

setTimeout 就是延迟执行,等 N 毫秒后执行一次。

核心两个:
setTimeout(fn, 毫秒)——N 毫秒后执行一次
clearTimeout(id)——取消定时器

坑:this 在回调里是 window(非严格模式)、闭包拿变量、最小延迟 4ms 不是 0

11.1 互动演示(延迟执行 + 清除)

延迟(毫秒):
闹钟倒计时进度条
等你点"开始"
点"开始延迟任务",到时间后只执行一次;点"取消"可阻止。

11.2 知识点讲解

① 语法:两个参数 + 三种写法

// 语法: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,闹钟形同虚设——这是新手高频错误。

② 返回值是 ID:为什么必须用变量保存?

// 定一个闹钟,它会给你一个编号(比如 1、2、3…)
// 这编号就是"取消闹钟的遥控器",没它你按不下去
let timerId = setTimeout(function () {
  // 已经被取消,这行根本跑不到
  console.log("不会执行了");
}, 5000);

// 在响之前按遥控器取消它
// 闹钟作废,到点不响了
clearTimeout(timerId);

没保存 ID = 无法取消 = 定时器失控。作业里"忘记保存定时器 ID 导致无法清除"就是专门考这个。

③ 补充说明:单位与"不精准"

// 单位是毫秒:1000 毫秒 = 1 秒
// 它说的"延迟 2 秒"是"最早 2 秒后",不是"分秒不差 2 秒":
// 前面要是还有一大堆代码在跑,它就得往后排队等
// 常拿来做:延迟提示、防抖、倒计时前的那一下等待

"延迟 2 秒"不是"保证第 2 秒整执行",而是"至少 2 秒后"——主线程忙完才轮得到它。

一句话记住:setTimeout 延迟执行一次、返回的 ID 必须存变量、clearTimeout(ID) 可以取消;延迟是最低等待时间不绝对精准

本页重点

API作用参数返回值代码示例
setTimeout(函数, 毫秒)到时间后只执行一次函数、延迟毫秒数定时器编号 IDlet id = setTimeout(function () { console.log('2秒后'); }, 2000);
clearTimeout(ID)在响之前取消它定时器编号clearTimeout(id); // 响之前取消