当前位置: 首页 > news >正文

JavaScript 定时器完全攻略

一、前言

在 JavaScript 中,定时器是实现延迟执行代码、周期性执行代码的核心工具,广泛应用于轮播图、倒计时、定时刷新数据等场景。本文将全面梳理 JS 定时器的核心用法、区别、注意事项及实战技巧,适合前端初学者巩固基础,也可作为开发中的参考手册。

二、JS 定时器的两种核心类型

JavaScript 提供了两种原生定时器方法,均挂载在window对象上(浏览器环境),无需额外引入依赖即可使用。

一次性定时器:setTimeout ()

延迟指定时间后,只执行一次指定的回调函数(或代码片段)。

// 语法1:传入回调函数lettimeoutId=setTimeout(callback,delay,[param1,param2,...]);

参数说明:

  • callback:必需,延迟后要执行的回调函数(无返回值)。

  • delay:可选,延迟时间,单位为毫秒(ms),默认值为0(注意:不是立即执行,后续会解释)。

  • [param1, param2, …]:可选,传递给回调函数的参数列表。

  • timeoutId:返回值,定时器的唯一标识(正整数),用于后续取消定时器。

周期性定时器:setInterval ()

每隔指定时间,重复执行指定的回调函数(或代码片段),直到主动取消或页面卸载。

letintervalId=setInterval(函数,时间)
  • 第一个参数传函数名,第二个参数是间隔时间,毫秒为单位

  • intervalId:返回值,定时器的唯一标识(正整数),用于后续取消定时器。

三、取消定时器:清除已创建的定时器

定时器创建后,可通过其返回的唯一标识(timeoutId/intervalId)取消执行,避免不必要的性能消耗。

  • 取消一次性定时器:clearTimeout(timeoutId)
  • 取消周期性定时器:clearInterval(intervalId)
letn=setInterval(function(){i--btn.innerHTML=`我已经阅读用户协议(${i})`if(i===0){clearInterval(n)btn.disabled=falsebtn.innerHTML=`同意`}},1000)

已取消的定时器标识无法再复用,若需重新执行定时器,需重新调用setTimeout()/setInterval()并获取新标识。

四、关键理解:定时器的延迟时间不是绝对的

很多初学者会疑惑:为什么设置delay=1000,但函数不是恰好 1 秒后执行?
核心原因:JavaScript 是单线程语言,定时器的回调函数需要等待主线程空闲后才能执行。

  1. 当调用setTimeout()/setInterval()时,JS 引擎会将定时器回调函数放入定时器队列,并开始计时。
  2. 当delay时间到达后,回调函数并不会立即执行,而是会被移入任务队列(宏任务队列)。
  3. JS 主线程遵循 “事件循环(Event Loop)” 机制,只有当主线程当前的同步代码执行完毕,且任务队列中没有其他更早的宏任务时,才会从任务队列中取出回调函数执行。
  4. 因此,若主线程被耗时的同步代码(如复杂循环、大型计算)阻塞,回调函数的执行时间会大于等于delay设定的时间。

五、setInterval () 的潜在问题:回调执行重叠(及解决方案)

  • 潜在问题:回调执行重叠
    setInterval()的设计缺陷:它会按照固定的时间间隔将回调函数推入任务队列,不关心上一次的回调函数是否已经执行完毕。
  • 若上一次回调函数执行耗时超过delay设定的时间间隔,下一次回调函数已经被推入任务队列,会导致多个回调函数连续执行(即 “执行重叠”)。
  • 长期运行可能导致内存泄漏、页面卡顿,尤其在处理网络请求、DOM 操作等耗时操作时风险更高。

2.解决方案:嵌套 setTimeout () 实现可靠的周期性执行

  • 通过在setTimeout()的回调函数中重新调用自身,实现周期性执行,优势是确保上一次回调函数完全执行完毕后,再开始下一次计时,避免执行重叠。
// 嵌套setTimeout()实现周期性执行(推荐)functionperiodicTask(){// 1. 执行核心业务逻辑letnow=newDate().toLocaleTimeString();console.log("当前时间:",now);// 2. 上一次任务执行完毕后,延迟1秒再开启下一次任务setTimeout(periodicTask,1000);}// 启动周期性任务periodicTask();// 如需取消,可保存定时器标识并调用clearTimeout()lettaskId;functioncancelPeriodicTask(){clearTimeout(taskId);console.log("周期性任务已取消");}

相比setInterval(),嵌套setTimeout()的执行间隔是 “上一次任务结束到下一次任务开始” 的间隔,更可控。
避免了回调重叠问题,适合执行耗时不确定的周期性任务(如定时请求接口获取数据)。
核心作用

  • 实现 “异步执行”,将耗时较短的任务推迟到同步代码执行完毕后执行,避免阻塞主线程。
  • 常用于调整代码执行顺序,例如:优先执行同步 DOM 操作,再执行后续的逻辑处理。

六、总结

  1. JS 定时器有两种核心类型:一次性setTimeout()(只执行一次)、周期性setInterval()(重复执行)。
  2. 取消定时器对应clearTimeout()和clearInterval(),需依赖定时器返回的唯一标识。
  3. 定时器的延迟时间是 “最小延迟”,而非 “绝对延迟”,受单线程事件循环机制影响。
  4. setInterval()存在回调重叠风险,推荐使用嵌套setTimeout()实现可靠的周期性执行。
  5. setTimeout(callback, 0)用于将任务推迟到同步代码执行完毕后执行,实现异步插队。
  6. 开发中需注意及时清除定时器、处理this指向、避免传入字符串回调等避坑点。
http://www.jsqmd.com/news/249892/

相关文章:

  • 【课程设计/毕业设计】基于SpringBoot的水族馆商品销售与经营管理系统商品资源管理(水族活体、器材、饲料分类,规格定价、库存预警、产地与养护说明)【附源码、数据库、万字文档】
  • Java毕设项目:基于SpringBoot的水族馆商品销售与经营管理系统(源码+文档,讲解、调试运行,定制等)
  • 【无人机三维路径规划】基于RRT路径规划+多机V 型编队跟随+动态障碍物避障+碰撞检测附Matlab代码
  • 【路径规划】基于RRT算法结合Dubins实现车辆路径规划附matlab代码
  • Java毕设选题推荐:基于SpringBoot的水族馆宠物鱼销售与经营管理系统基于SpringBoot的水族馆商品销售与经营管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • day132—链表—K个一组翻转链表(LeetCode-25)
  • Java计算机毕设之基于SpringBoot+vue的海洋馆商品销售与经营管理系统基于SpringBoot的水族馆商品销售与经营管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设项目推荐-基于Java+SpringBoot+Vue的身体素质测评管理系统基于SpringBoot的学生身体素质测评管理系统【附源码+文档,调试定制服务】
  • Java毕设项目推荐-基于SpringBoot的水族馆线下门店与线上销售的一体化管理系统基于SpringBoot的水族馆商品销售与经营管理系统【附源码+文档,调试定制服务】
  • C/C++内存管理:从内存布局到malloc/free 与 new/delete 的深度解析
  • 初识Jmeter
  • C语言内存函数:介绍使用及其模拟实现
  • 技术资产管理:智能复用评估
  • 【计算机毕业设计案例】基于SpringBoot的大学生综合素质测评系统设计与实现基于SpringBoot的学生身体素质测评管理系统(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于SpringBoot的水族馆鱼类商品销售与经营管理系统基于SpringBoot的水族馆商品销售与经营管理系统(程序+文档+讲解+定制)
  • 无线网络仿真:6G网络仿真_(19).6G网络仿真未来趋势
  • 无线网络仿真:6G网络仿真_(20).6G网络仿真实践项目
  • 智能编程平台:低代码开发实践
  • 无线网络仿真:Wi-Fi网络仿真_(3).仿真软件介绍与使用
  • 无线网络仿真:6G网络仿真_(15).6G网络仿真参数设置
  • 大数据浪潮下,ClickHouse的破局之道
  • 大数据建模中的向量化处理:SIMD指令优化计算
  • 别再重复造轮子!AI应用架构师:企业AI中台可复用组件库建设,附开发规范
  • 这3个内幕曝光,了解洁净室专用电话机的技术内核!
  • 【毕业设计】基于Java的学生身体素质测评管理系统基于SpringBoot的学生身体素质测评管理系统(源码+文档+远程调试,全bao定制等)
  • 计算机毕设 java 基于协同过滤算法的就业推荐系统的设计与实现 基于协同过滤算法的智能就业推荐平台 求职与企业招聘匹配系统
  • 计算机毕设 java 基于智能机器人的智能答疑系统的设计与实现 基于智能机器人的交互式答疑平台 师生问答与知识交流系统
  • 【单相STATCOM】单相STATCOM在单相系统中补偿无功功率,并减轻谐波附Simulink仿真
  • Unity3D 绿色家园 垃圾分类
  • 【信号处理】通过 “最近邻匹配” 和 “球面线性插值(SLERP)” 两种方式将 GNSS 位姿(位置 + 四元数)插值到激光雷达时间戳附Matlab代码