setInterval 函数用法与常见坑
setInterval 是 JavaScript 里定时执行代码的函数,每隔指定毫秒数调用一次回调。和 setTimeout(只执行一次)不同,setInterval 会持续执行,直到 clearInterval 清除。
一、基本语法
const timer = setInterval(callback, delay, ...args);
- callback:要执行的函数。
- delay:间隔毫秒数。
- ...args:传给 callback 的参数。
- 返回值:定时器 ID,用于 clearInterval。
二、基本示例
let count = 0;
const timer = setInterval(() => {
count++;
console.log(count);
if (count >= 5) clearInterval(timer);
}, 1000);
三、常见坑
1. this 指向问题
setInterval 的回调里 this 默认指向 window(非严格模式)或 undefined(严格模式),不是调用者。用箭头函数或 bind 解决。
2. 定时器泄漏
组件销毁时忘记 clearInterval,导致内存泄漏和重复执行。React/Vue 中要在 unmount 时清理。
3. delay 不精确
setInterval 不保证精确间隔,如果回调执行时间超过 delay,下一次调用会紧接上一次,间隔被压缩。
4. 递归 setInterval
在回调里再次 setInterval 会造成定时器嵌套,指数增长。应使用 setTimeout 递归代替。
四、替代方案
需要精确计时或异步操作时,用 setTimeout 递归更可靠:
function tick() {
doWork().then(() => setTimeout(tick, 1000));
}
tick();