【前端每天一题】🔥 第 9 题:防抖(debounce)与节流(throttle)的区别?如何实现?

防抖与节流 - 前端高频面试题

本题属于前端工程师几乎"必问"的那类:防抖与节流

第 9 题:防抖(debounce)与节流(throttle)的区别?如何实现?


一、面试官期待的关键点

⭐ 1. 防抖(Debounce)

含义:一定时间内只执行最后一次。

  • 用户停止触发后 N 毫秒再执行
  • 连续触发时会不断"重新计时"
  • 常用于:
    • 搜索框输入
    • 窗口 resize
    • 表单实时校验
➤ 防抖示意图
复制代码
触发 → 重置 → 重置 → ... → 停止 → 执行
➤ 防抖实现(面试必写)
javascript 复制代码
function debounce(fn, delay) {
  let timer = null
  return function (...args) {
    clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

⭐ 2. 节流(Throttle)

含义:规定时间内只执行一次。

  • 每隔 N 毫秒执行一次动作
  • 无论触发多少次
  • 常用于:
    • 滚动事件
    • 页面 resize
    • 高频拖拽事件
➤ 节流示意图
复制代码
触发 → 执行 → 冷却中 → 执行
➤ 节流实现(时间戳版)
javascript 复制代码
function throttle(fn, delay) {
  let last = 0
  return function (...args) {
    const now = Date.now()
    if (now - last >= delay) {
      last = now
      fn.apply(this, args)
    }
  }
}

二、两者的根本区别(面试官最爱听)

特性 防抖 debounce 节流 throttle
执行次数 高频触发下 只执行一次 高频触发下 每隔固定时间执行一次
使用场景 用户输入校验、防止重复提交 滚动监听、拖拽、窗口 resize
实现原理 setTimeout + 清除定时器 时间戳或定时器

三、手写带立即执行版本(加分)

🔹 防抖(立即执行版)

输入时立刻响应(如实时提示)

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

  return function (...args) {
    const callNow = immediate && !timer
    clearTimeout(timer)

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

    if (callNow) fn.apply(this, args)
  }
}

四、速记卡片(上班摸鱼记忆版)

javascript 复制代码
🎯 防抖:只执行最后一次(停止后执行)
📌 用于:输入框、实时校验
🧠 原理:setTimeout + clearTimeout

🎯 节流:固定间隔执行
📌 用于:滚动、拖拽、resize
🧠 原理:时间戳或定时器

⭐ 防抖 = "等你不动再说"
⭐ 节流 = "一秒说一次"
相关推荐
独自破碎E3 小时前
【面试真题拆解】Spring事务机制
java·spring·面试
程序员爱钓鱼3 小时前
Go PDF处理利器: github.com/pdfcpu/pdfcpu 深度指南
后端·面试·go
我命由我123453 小时前
Element Plus 2.2.27 的单选框 Radio 组件,选中一个选项后,全部选项都变为选中状态
开发语言·前端·javascript·html·ecmascript·html5·js
Luna-player3 小时前
第3章 Spring Boot的Web应用支持,个人学习笔记
前端·spring boot·学习
bugcome_com3 小时前
【ASP.NET Web Pages】页面布局核心实战:从复用性到安全性,打造一致化网站界面
前端·后端·asp.net
Sylus_sui3 小时前
Class 模型 + 跨组件状态(@Observed)+ 网络请求封装 + 本地存储全部是鸿蒙 Next/Stage 模型标准写法
前端
代码栈上的思考3 小时前
消息队列持久化:文件存储设计与实现全解析
java·前端·算法
踩着两条虫3 小时前
去“AI味儿”实操手册:从“机器脸”到“高级脸”,只差这三步!
前端·vue.js·ai编程
江湖十年3 小时前
使用 testing/synctest 测试并发代码
后端·面试·go
qq_211387473 小时前
基于LangGraph多agent
开发语言·前端·javascript·agent·langgraph