跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

深入理解前端防抖与节流:原理、区别与实战示例

前端高频事件处理常导致性能问题,防抖与节流是核心优化方案。防抖延迟执行最后一次触发,适用于搜索框输入;节流固定间隔执行,适用于滚动监听。通过原生实现或 Lodash 库可快速应用,结合 Vue 框架能提升页面流畅度并减少无效计算。

乱七八糟发布于 2026/4/12更新于 2026/9/453 浏览
深入理解前端防抖与节流:原理、区别与实战示例

引言

在前端开发中,高频事件(如输入框输入、滚动、窗口调整大小等)若不加限制,浏览器会频繁触发回调函数,导致性能问题甚至页面卡顿。

防抖(Debounce)和节流(Throttle)是两种优化方案,可以有效控制事件触发的频率,提高应用的性能和用户体验。以下内容将详细解析防抖和节流的原理、适用场景及代码实现。

1. 什么是防抖(Debounce)?

概念

防抖是一种在事件触发后延迟执行的技术,如果在延迟期间事件被再次触发,计时器会重置,重新计算延迟时间。

核心思想:短时间内多次触发,只执行最后一次。

适用场景
  • 搜索框输入(防止用户每次输入都发送请求)
  • 窗口调整大小(resize)(防止短时间内多次触发计算)
  • 表单输入验证(用户停止输入后再进行验证)
代码实现
function debounce(fn, delay = 300) {
    let timer;
    return function (...args) {
        if (timer) clearTimeout(timer);
        timer = setTimeout(() => fn.apply(this, args), delay);
    };
}

示例:输入框防抖

<input type="text" id="search" placeholder="请输入内容">
<script>
const input = document.getElementById('search');
input.addEventListener('input', debounce((e) => {
    console.log('搜索内容:', e.target.value);
}, ));

500
</script>

效果:用户输入停止 500ms 后,才触发 console.log。

2. 什么是节流(Throttle)?

概念

节流是一种限定函数执行频率的技术,即在一定时间间隔内,函数最多执行一次,即使事件被频繁触发。

核心思想:高频触发,固定间隔执行。

适用场景
  • 滚动事件(scroll)(如懒加载、页面滚动监听)
  • 鼠标移动(mousemove)(防止触发过多计算)
  • 按钮点击(click)(防止用户疯狂点击)
代码实现
function throttle(fn, interval = 300) {
    let lastTime = 0;
    return function (...args) {
        const now = Date.now();
        if (now - lastTime >= interval) {
            fn.apply(this, args);
            lastTime = now;
        }
    };
}

示例:滚动监听

<div style="height: 2000px;"></div>
<script>
window.addEventListener('scroll', throttle(() => {
    console.log('滚动中...', new Date().toLocaleTimeString());
}, 1000));
</script>

效果:无论滚动多快,scroll 事件每秒最多执行一次。

3. 防抖 vs. 节流:有什么区别?

防抖(Debounce)节流(Throttle)
触发方式事件触发后延迟执行事件触发后间隔执行
特性短时间连续触发,只执行最后一次固定时间间隔内最多执行一次
适用场景输入框输入、搜索框、表单验证滚动、鼠标移动、按钮点击
优势避免无效调用,减少资源消耗保证高频事件可执行,提高流畅度
实现方式setTimeout 延迟执行Date.now() 控制执行间隔
总结
  • 如果你想等用户停止操作后再执行任务,使用防抖(Debounce)。
  • 如果你希望控制函数执行的频率,使用节流(Throttle)。

4. 进阶优化:使用 Lodash

可以直接使用 Lodash 提供的 debounce 和 throttle 方法,避免自己实现。

Lodash 防抖
npm install lodash
import _ from 'lodash';
const handleInput = _.debounce((e) => {
    console.log('防抖触发:', e.target.value);
}, 500);
document.getElementById('search').addEventListener('input', handleInput);
Lodash 节流
const handleScroll = _.throttle(() => {
    console.log('节流触发', new Date().toLocaleTimeString());
}, 1000);
window.addEventListener('scroll', handleScroll);

Lodash 优势:内部优化更好,支持立即执行(leading)和延迟执行(trailing)。

5. 结合 Vue 实战应用

Vue 中使用防抖
<template>
    <input v-model="searchText" @input="handleInput" placeholder="搜索">
</template>
<script>
import { ref } from 'vue';
import _ from 'lodash';
export default {
    setup() {
        const searchText = ref('');
        const handleInput = _.debounce((e) => {
            console.log('搜索关键词:', e.target.value);
        }, 500);
        return {
            searchText,
            handleInput
        };
    }
};
</script>

效果:用户停止输入 500ms 后才会触发搜索请求。

Vue 中使用节流
<template>
    <button @click="handleClick">点击节流</button>
</template>
<script>
import _ from 'lodash';
export default {
    setup() {
        const handleClick = _.throttle(() => {
            console.log('按钮点击', new Date().toLocaleTimeString());
        }, 2000);
        return {
            handleClick
        };
    }
};
</script>

效果:按钮每 2s 只能点击一次。

6. 结论

防抖(Debounce)和节流(Throttle)是前端性能优化的重要技术,合理使用可以显著减少不必要的计算,提高页面流畅度。

适用场景推荐方法
输入框防止频繁请求防抖(Debounce)
窗口调整大小(resize)防抖(Debounce)
滚动事件(scroll)节流(Throttle)
鼠标移动(mousemove)节流(Throttle)
按钮点击(click)节流(Throttle)

目录

  1. 引言
  2. 1. 什么是防抖(Debounce)?
  3. 概念
  4. 适用场景
  5. 代码实现
  6. 2. 什么是节流(Throttle)?
  7. 概念
  8. 适用场景
  9. 代码实现
  10. 3. 防抖 vs. 节流:有什么区别?
  11. 总结
  12. 4. 进阶优化:使用 Lodash
  13. Lodash 防抖
  14. Lodash 节流
  15. 5. 结合 Vue 实战应用
  16. Vue 中使用防抖
  17. Vue 中使用节流
  18. 6. 结论

更多推荐文章

查看全部
  • 无人机视觉任务常用数据集汇总:检测与分割资源整理
  • Flutter 与 OpenHarmony 实战:web_socket_channel WebSocket 通信原理与实现
  • 大模型教程:使用 Milvus、vLLM 和 Llama 3.1 搭建 RAG 应用
  • 提示词的进化之路:从框架表达到压缩表达
  • 20 款程序员开发必备软件推荐
  • C++元编程进阶指南:构建可复用代码生成器
  • 从零搭建你的第一个 AI Agent
  • 无人机视角军事目标细分类检测数据集及多 YOLO 版本训练验证
  • 无人机 Remote ID Beacon 帧结构与字段深度解析
  • 融合语言模型的多模态触觉传感器 SuperTac 助力机器人触觉感知
  • 无人机数据采集中的C语言优化技巧与性能调优
  • Python 四大 Web 框架对比:FastAPI、Django、Flask 与 Tornado
  • Xred 蠕虫行为分析及修复工具开发
  • 大模型驱动下 Agent 任务规划的 10 种创新方式
  • 自然语言处理与计算机视觉的融合应用实战
  • 无人机如何通过视觉闭环实现精准空投
  • 树莓派Pico双语言开发对比:MicroPython原型与C/C++性能优化
  • whisperX 入门指南:从安装到实现语音识别
  • 前端调试:Debugger 断点设置与使用
  • 基于 CSANMT 的实时中英对照翻译服务实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online