【前端每天一题】🔥 第 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 题:前端常见渲染机制(重排 + 重绘 + 浏览器渲染流水线)

相关推荐
weixin_417396838 分钟前
监控画面卡顿与录像缺失:码率、NVR与存储容量的排查顺序
前端·网络·技术·酒店·综合布线·弱电
曹牧23 分钟前
Eclipse 工作空间(Workspace)的默认 JDK 配置
前端
其实防守也摸鱼1 小时前
Cylab在线靶场——挑战图书馆初学者指南
服务器·前端·数据库·chrome·安全·网络安全·靶场
拆房老料4 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
曹牧9 小时前
C#:空合并运算符
java·前端·数据库
小羊没烦恼!10 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
智能直播12 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
掘金酱13 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel14 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
IT_陈寒14 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端