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

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

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

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

引言

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

防抖(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. 结论
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 视频总结工具:Cursor Agent 实现多平台视频自动笔记
  • AI 基础学习系列:AIGC 从创意到创造
  • 基于 Python 与 AI 的每日新闻简报应用实战
  • AIGC 从创意到创造:概念、场景与进阶
  • AIGC 从创意到创造
  • 深入理解前端防抖与节流:原理、区别与实战示例
  • 基于百度天气 API 的空气质量 WebGIS 可视化实践
  • AIGC 从创意到创造:核心概念与落地场景
  • Ubuntu 系统下 Node.js 环境配置与常见问题排查
  • 2026 年 3 月全球 AI 前沿动态:模型、智能体与硬件突破
  • 机器学习常见名词与核心概念汇总
  • 链表两两交换的三种 Java 解法
  • Apache IoTDB 查询核心:ORDER BY 排序与 ALIGN BY DEVICE 对齐模式详解
  • 机器学习与深度学习核心概念详解
  • 无人机智能巡检系统架构与大疆云端集成方案
  • Rust 异步并发安全与内存管理实战指南
  • C++ 内存管理进阶:从裸指针到智能指针的进化之路
  • 用 C 语言从零实现 Linux Shell:原理与实践
  • JDK 17 安装与环境配置实战指南
  • Python 高效清理 Excel 空白行列:原理与实战

相关免费在线工具

  • 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