【前端每天一题】🔥 第 18 题:防抖和节流是什么?区别是什么?如何实现?

下面是 第 18 题:防抖(debounce)和节流(throttle)

依旧:详细版 + 手写实现 + 场景 + 速记卡


✅ 第 18 题:防抖和节流是什么?区别是什么?如何实现?


📘 一、前端为什么需要防抖节流?

前端有很多高频触发事件

  • input 输入
  • scroll 滚动
  • resize 窗口尺寸变化
  • mousemove 鼠标移动
  • keyup/keyDown

如果不控制频率,会导致:

  • 性能下降
  • 请求过多
  • 渲染抖动

防抖和节流就是为了解决这个问题。


📘 二、防抖(Debounce)

🧠 机制:

事件触发后等待 n ms,如果期间又触发,则重新计时。只有最后一次触发才执行。

使用场景:

  • 关键字搜索(用户停止输入才发请求)
  • 调整窗口大小(结束调整再计算)
  • 文本输入校验

🧪 示例:

用户连续输入:a → ab → abc

等待 300ms,不再输入 → 执行一次请求。

✍️ 手写防抖(立即执行可选)

ini 复制代码
function debounce(fn, delay, immediate = false) {
  let timer = null;

  return function(...args) {
    const context = this;

    if (timer) clearTimeout(timer);

    if (immediate && !timer) {
      fn.apply(context, args);
    }

    timer = setTimeout(() => {
      if (!immediate) fn.apply(context, args);
      timer = null;
    }, delay);
  };
}

📘 三、节流(Throttle)

🧠 机制:

无论事件触发多少次,每隔 n ms 只执行一次。

使用场景:

  • 页面滚动,触发统计(每 200ms 记录一次位置)
  • 按钮连续点击(防止疯狂点击)
  • 悬停拖拽 mousemove 事件

🧪 示例:

持续滚动:

0ms → 执行

100ms → 忽略

200ms → 执行

300ms → 忽略

...

✍️ 手写节流(时间戳版)

ini 复制代码
function throttle(fn, delay) {
  let last = 0;

  return function(...args) {
    const now = Date.now();
    if (now - last > delay) {
      fn.apply(this, args);
      last = now;
    }
  };
}

✍️ 另一版(定时器版)

ini 复制代码
function throttle(fn, delay) {
  let timer = null;

  return function(...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

📘 四、区别总结(必背)

特性 防抖 Debounce 节流 Throttle
执行次数 只执行 最后一次 按固定间隔执行
应用场景 输入框搜索、窗口调整 scroll、mousemove、抢购按钮
高频触发 不执行 间隔执行
核心思路 等一等 降速执行

📘 五、速记卡片(10 秒版)

arduino 复制代码
防抖:最后一次 ------ 停下来我再执行(搜索框)
节流:固定频率 ------ 你再急也按节奏来(scroll)

防抖用 setTimeout,触发就清空重新计时
节流用时间戳或定时器,不到时间不执行

要继续下一题吗?
第 19 题:前端常见渲染机制(重排 + 重绘 + 浏览器渲染流水线)

相关推荐
lichenyang4531 天前
鸿蒙电商 Demo v2:真实商品接口 + 支付/订单闭环 + 收藏功能,外加一个 ArkUI V2 @Builder 响应式断链的硬核坑
前端·后端
前端的阶梯1 天前
如何节省你的token,请看CodeGraph
前端·人工智能·后端
万少1 天前
产品原型不用从零画 -GPT 出图,Gemini 生成 HTML
前端·javascript·后端
wuhen_n1 天前
RAG 第一步:多格式文档加载与文本预处理实战
前端·langchain·ai编程
程序员黑豆1 天前
全新系列开启:AI 全栈开发
前端·后端·全栈
小小小小宇1 天前
Partial Clone
前端
小小小小宇1 天前
git sparse-checkout(稀疏检出)
前端
ZC跨境爬虫1 天前
跟着 MDN 学JavaScript day_9:字符串方法实战挑战与解题思路
开发语言·前端·javascript
夜焱辰1 天前
WebMCP 的正确打开方式:只注册 2 个工具,代理 N 个——CreatorWeave 的 On-Demand 实践
前端
用户7459571748401 天前
Fabric:Python SSH 远程执行利器
前端