【JS】防抖(debounce)和节流(throttle)

1. debounce(防抖)

原理

debounce 的核心思想是:事件被触发后,等一段时间(比如300ms)没有再触发时,才执行一次函数。如果在这段时间内又触发了事件,则重新计时。

场景举例

  • 输入框搜索:用户输入时不马上请求接口,等停止输入一段时间后才发送请求,避免频繁调用接口。
  • 调整窗口大小:窗口尺寸变化频繁,只在调整停止后执行一次重绘。

📝debounce 手写实现

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

解析

  • timer 用来保存当前计时器。
  • 每次触发函数时,先清除旧的计时器。
  • 设置新的计时器,延迟 delay 毫秒后执行目标函数 func。
  • apply(this, args) 保持调用时的上下文和参数。

2. throttle(节流)

原理

throttle 的核心思想是:保证在一个固定时间间隔内,函数最多执行一次。即使触发事件很多,函数调用频率也会被限制。

场景举例

  • 滚动加载:监听滚动事件时,不想频繁调用函数,节省性能。
  • 按钮连续点击防止多次提交。

📝throttle 手写实现

ini 复制代码
function throttle(func, interval) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      lastTime = now;
      func.apply(this, args);
    }
  };
}

解析

  • lastTime 记录上一次执行函数的时间戳。
  • 当前时间 now 减去 lastTime 大于等于间隔时,执行函数,并更新时间戳。
  • 其他触发在这段时间内的调用都会被忽略。

总结对比

特点 debounce throttle
执行时机 停止触发后执行一次 固定时间间隔内执行一次
适用场景 输入框搜索,窗口调整等停止触发才执行 滚动监听,按钮点击限制等频率限制
触发次数 最后一次触发执行 按时间间隔执行
相关推荐
梦曦i4 分钟前
uni-app x下自研架构的工程化突围
前端·架构·uni-app x
速易达网络17 分钟前
ECharts 图表制作完全指南:从零到可视化实战
前端·javascript·echarts
IT_陈寒21 分钟前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端
徐小夕34 分钟前
深度剖析 30k star 的编码 Agent DeepSeek-Reasonix:长会话 Token 成本直降 80%
前端·vue.js·github
轻松西西莱尔36 分钟前
谷歌+斯坦福+CMU 等五家 203 页综述,我做了个HTML把主动式AI的边界跑给你看
前端·html·agent
吴凡wudianmei1 小时前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc
不可能片场1 小时前
Electron 发布 别拿 load 事件当页面就绪
前端·electron
paopaokaka_luck1 小时前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
kyriewen1 小时前
我验了 7 种 sticky 失效说法:3 种根本不成立
前端·javascript·程序员
程序边界1 小时前
一台数据集成软件的拆解笔记(下):一致性、容错、跑批与迁移,KFS 真正难的地方在这
java·前端·笔记