如何用JavaScript实现一个简单的计时器_setInterval和setTimeout如何使用?

JavaScript计时器核心是setInterval(重复执行,如每秒更新)和setTimeout(延迟执行一次,如倒计时结束提示),需理解用途差异、配合使用、及时清理及规避精度误差。

用 JavaScript 实现简单计时器,核心就是 setIntervalsetTimeout —— 前者用于**重复执行**(比如每秒更新时间),后者用于**延迟执行一次**(比如倒计时结束触发提示)。关键不是背语法,而是理解它们的用途差异和如何配合控制。

setInterval:启动并持续运行的“心跳”

它会按固定间隔反复调用函数,适合做实时计数、动画帧、轮询等。返回一个定时器 ID,后续可用 clearInterval 停止。

常见写法:

  • const timerId = setInterval(() => { console.log('滴'); }, 1000); —— 每秒打印一次
  • 在计时器中通常配合变量累加:let seconds = 0; setInterval(() => { seconds++; display(seconds); }, 1000);
  • 务必记得在不需要时清除,否则内存泄漏或逻辑错乱:clearInterval(timerId);

setTimeout:只响一次的“闹钟”

它在指定毫秒后执行一次函数,适合延后操作、防抖、倒计时最后一刻提醒等。同样返回 ID,用 clearTimeout 可取消未执行的任务。

小技巧:

  • 模拟“等待3秒再开始计时”:setTimeout(startTimer, 3000);
  • 实现倒计时(递归方式):function countDown(n) { if (n countDown(n - 1), 1000); }
  • setInterval 更精准控制单次行为,尤其适合“执行一次就停”的场景

组合使用:一个实用的倒计时计时器示例

比如做一个 5 秒倒计时,结束后显示“时间到”。不用 setInterval 死守,也不用 setTimeout 纯递归,可以混搭:

  • setInterval 每秒更新界面(让 UI 实时响应)
  • setTimeout 在第 5 秒末精确触发完成回调(避免 setInterval 累积误差)
  • 点击“暂停”时,clearInterval;点击“继续”,重新 setInterval

这样既保证视觉流畅,又确保终点动作不漂移。

注意几个易错点

实际写的时候容易踩坑:

  • setInterval(fn, 0) 不会立刻执行,仍要进事件队列,最小间隔约 4ms(浏览器限制)
  • 如果回调执行时间 > 间隔时间,会“堆积”——比如 setInterval(heavyFn, 100),但 heavyFn 耗时 200ms,那它会连续无空隙执行
  • 页面切到后台时,大多数浏览器会把 interval 降频(如 1s → 1s+),setTimeout 也可能延迟,别依赖它做高精度计时
  • 不要在循环里直接写 setTimeout(() => ..., i * 1000) 却没处理闭包问题——用 let 或包装 IIFE

基本上就这些。掌握好什么时候该“反复跑”,什么时候该“准时响一次”,再注意清理和误差,一个干净可用的计时器就出来了。