news 2026/4/28 7:31:06

JavaScript 定时器完全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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指向、避免传入字符串回调等避坑点。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 2:51:59

无线网络仿真:6G网络仿真_(19).6G网络仿真未来趋势

6G网络仿真未来趋势 1. 6G网络仿真概述 6G网络仿真是在6G网络研究和开发中不可或缺的一部分。通过仿真,研究人员可以验证理论模型、评估网络性能、测试新算法和技术,以及预测未来网络的行为。6G网络仿真不仅涵盖了传统的无线通信仿真技术,还引…

作者头像 李华
网站建设 2026/4/24 23:40:57

【单仓库多旅行商问题SDMTSP】基于BSLO吸血水蛭优化器求解单仓库多旅行商问题,可以更改数据集和起点附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/4/25 10:02:28

强烈安利9个AI论文网站,MBA论文写作必备!

强烈安利9个AI论文网站,MBA论文写作必备! AI 工具如何助力 MBA 论文写作 MBA 学习过程中,论文写作是一项不可避免的挑战。无论是选题、资料收集还是内容撰写,都需要大量的时间和精力。而随着 AI 技术的发展,越来越多的…

作者头像 李华
网站建设 2026/4/26 6:52:09

大模型高薪岗位汇总:年薪40-220万,程序员必学必收藏

锐仕方达发布热招高薪岗位132个,最高年薪400万。大模型领域薪资诱人,9个精选岗位年薪从40万到220万不等,涵盖杭州、上海、北京等热门城市,涉及互联网、人工智能、航空航天等行业。这些高薪岗位包括大模型研发经理、算法工程师、技…

作者头像 李华
网站建设 2026/4/27 13:15:02

大模型时代职场指南:收藏这份全景职业图谱,找准你的发展赛道

本文将大模型领域岗位划分为基础设施与工程类、模型研发与算法类、数据类、产品与应用类四大类,详细列举了每类典型岗位及职责。文章指出岗位间存在交叉,未来可能出现新角色,并强调除专业技能外,沟通协作、产品思维和伦理意识日益…

作者头像 李华
网站建设 2026/4/22 17:17:01

突破传统训练局限!TRAPO框架实现大模型“边学边练“新范式

TRAPO框架解决了传统"先SFT后RL"两阶段训练的不一致性问题,通过实例级交错执行监督微调与强化学习实现"边学边练"协同范式。其创新"按需支架"机制和信任区域SFT(TrSFT)目标函数,通过梯度裁剪避免策略退化,使模…

作者头像 李华