setInterval
和 setTimeout
是 JavaScript 中用于处理定时任务的核心 API,两者都用于延迟或重复执行代码,但应用场景有所不同。以下是它们的典型使用场景及区别:
setTimeout
用于在指定时间后执行一次函数,执行完成后即终止。
语法:const timerId = setTimeout(回调函数, 延迟时间(ms))
let searchTimer;
const handleInput = (value) => {
// 清除上一次的定时器,避免频繁触发
clearTimeout(searchTimer);
// 300ms后执行搜索,用户停止输入后才触发
searchTimer = setTimeout(() => {
console.log('搜索:', value);
}, 300);
};
const fetchData = () => {
console.log('开始请求...');
// 模拟2秒后请求成功
setTimeout(() => {
console.log('数据返回成功');
}, 2000);
};
let hideTimer;
const showMenu = () => {
clearTimeout(hideTimer);
menuVisible = true;
};
const hideMenu = () => {
// 延迟500ms隐藏,避免快速鼠标移动导致闪烁
hideTimer = setTimeout(() => {
menuVisible = false;
}, 500);
};
setTimeout(() => {
document.getElementById('tip').style.display = 'none';
}, 3000);
setInterval
用于每隔指定时间重复执行函数,直到被手动停止。
语法:const timerId = setInterval(回调函数, 间隔时间(ms))
// 每5秒刷新一次数据
const dataTimer = setInterval(() => {
fetch('/api/latest-data').then(res => res.json()).then(data => {
updateDashboard(data);
});
}, 5000);
let seconds = 0;
const stopwatch = setInterval(() => {
seconds++;
console.log(`已运行: ${seconds}秒`);
}, 1000);
// 停止计时
const stop = () => clearInterval(stopwatch);
requestAnimationFrame
,但 setInterval
可用于简单场景) let left = 0;
const moveDiv = setInterval(() => {
left += 5;
document.getElementById('box').style.left = `${left}px`;
if (left > 500) clearInterval(moveDiv); // 到达位置后停止
}, 30);
let currentIndex = 0;
const carouselTimer = setInterval(() => {
currentIndex = (currentIndex + 1) % images.length;
showImage(currentIndex); // 切换到下一张图
}, 3000);
特性 |
|
|
---|---|---|
执行次数 | 一次(延迟后) | 多次(每隔指定时间) |
终止方式 |
|
|
时间准确性 | 延迟时间是“至少”的时间 | 间隔时间可能因任务耗时被拉长 |
适用场景 | 单次延迟操作 | 周期性重复操作 |
clearTimeout
或 clearInterval
手动清理,否则可能导致内存泄漏(尤其是在 React、Vue 等框架中,组件卸载前务必清除)。 // React 中使用示例
useEffect(() => {
const timer = setInterval(update, 1000);
return () => clearInterval(timer); // 组件卸载时清理
}, []);
setInterval
可能出现累积延迟(前一次未执行完,下一次已触发),此时推荐用 setTimeout
递归调用替代: // 更可靠的周期性执行(避免累积延迟)
const runTask = () => {
// 执行任务
console.log('执行任务');
// 任务完成后再设置下一次执行
setTimeout(runTask, 1000);
};
runTask();
setTimeout
setInterval
(或 setTimeout
递归)原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。