JavaScript 调度:setTimeout 和 setInterval

一、基础语法与核心差异

1. setTimeout:单次延迟执行

javascript 复制代码
const timerId = setTimeout(callback, delay, arg1, arg2, ...);  

功能 :在指定延迟(毫秒)后执行一次回调函数。

取消方法clearTimeout(timerId)

2. setInterval:循环重复执行

javascript 复制代码
const intervalId = setInterval(callback, interval, arg1, arg2, ...);  

功能 :每隔固定时间重复执行回调函数。

取消方法clearInterval(intervalId)

核心差异

setTimeout单次触发 ,适合延迟任务或递归实现循环。

setInterval固定间隔触发,适合周期性任务(需注意累积问题)。


二、实战技巧与经典问题

1. 用setTimeout模拟setInterval

由于setInterval可能因回调执行时间过长导致任务堆积 ,更安全的做法是递归调用setTimeout

javascript 复制代码
function safeInterval(callback, interval) {  
  let timerId = null;  
  function execute() {  
    callback();  
    timerId = setTimeout(execute, interval); // 递归调用  
  }  
  timerId = setTimeout(execute, interval);  
  return () => clearTimeout(timerId); // 返回清除函数  
}  

此方法确保每次回调执行完毕后再重新计时,避免任务重叠。

2. 事件循环与时间精度问题

JavaScript是单线程的,定时器的回调会被推入任务队列,实际执行时间可能晚于预期

javascript 复制代码
console.log("Start");  
setTimeout(() => console.log("Timeout"), 0);  
console.log("End");  
// 输出顺序:Start → End → Timeout  

即使延迟设为0,回调仍需等待主线程空闲。

3. 内存泄漏:忘记清除定时器

未及时调用clearTimeoutclearInterval会导致回调持续引用外部变量,内存无法释放

javascript 复制代码
function startPolling() {  
  setInterval(() => {  
    fetchData(); // 持续运行,即使组件已销毁  
  }, 5000);  
}  

解决方案:在组件卸载或条件变更时主动清除定时器。


三、高级应用场景

1. 节流(Throttling)与防抖(Debouncing)

防抖:连续事件中只执行最后一次:

javascript 复制代码
function debounce(func, delay) {  
  let timerId;  
  return (...args) => {  
    clearTimeout(timerId);  
    timerId = setTimeout(() => func(...args), delay);  
  };  
}  

节流:固定时间内只执行一次:

javascript 复制代码
function throttle(func, interval) {  
  let lastTime = 0;  
  return (...args) => {  
    const now = Date.now();  
    if (now - lastTime >= interval) {  
      func(...args);  
      lastTime = now;  
    }  
  };  
}  
相关推荐
练习两年半的工程师2 小时前
使用React和google gemini api 打造一个google gemini应用
javascript·人工智能·react.js
勘察加熊人3 小时前
angular九宫格ui
javascript·ui·angular.js
姑苏洛言4 小时前
30天搭建消防安全培训小程序
前端
左钦杨5 小时前
Nuxt2 vue 给特定的页面 body 设置 background 不影响其他页面
前端·javascript·vue.js
yechaoa5 小时前
【揭秘大厂】技术专项落地全流程
android·前端·后端
MurphyChen5 小时前
🤯 一行代码,优雅的终结 React Context 嵌套地狱!
前端·react.js
逛逛GitHub5 小时前
推荐 10 个受欢迎的 OCR 开源项目
前端·后端·github
_xaboy6 小时前
开源 FormCreate 表单设计器配置组件的多语言
前端·vue.js·低代码·开源·可视化表单设计器
uglyduckling04126 小时前
小程序构建NPM失败
前端·小程序·npm
草原上唱山歌6 小时前
C/C++都有哪些开源的Web框架?
前端·c++·开源