【Web 前端】防抖与节流的区别

简介: 【4月更文挑战第22天】【Web 前端】防抖与节流的区别

image.png

防抖(Debouncing)和节流(Throttling)是两种常见的前端优化技术,用于控制事件触发频率,提升页面性能和用户体验。尽管它们的目的相似,但在实现原理和应用场景上有所不同。在本文中,我将详细介绍防抖和节流的区别,并提供相应的示例代码,以帮助读者更好地理解它们的作用和用法。

1. 防抖(Debouncing)

1.1. 概述

防抖是一种技术,用于延迟执行事件处理函数,直到事件停止触发一段时间后。当触发事件时,如果在指定的时间内再次触发了相同事件,则重新计时,直到事件停止触发,才执行事件处理函数。

1.2. 实现原理

防抖的实现原理是通过设置一个定时器,在事件触发时先清除之前的定时器,然后重新设置新的定时器,在延迟时间内如果再次触发了相同事件,则重新计时。

1.3. 应用场景

  • 输入框搜索:用户在输入框中连续输入字符时,延迟一段时间后执行搜索操作,避免频繁发送请求。
  • 窗口调整:当窗口大小调整时,延迟一段时间后执行重新布局或重绘操作,减少不必要的重绘。

1.4. 示例代码

function debounce(func, delay) {
   
   
    let timer;
    return function() {
   
   
        clearTimeout(timer);
        timer = setTimeout(() => {
   
   
            func.apply(this, arguments);
        }, delay);
    };
}

// 使用防抖函数包装事件处理函数
const debouncedFunc = debounce(() => {
   
   
    console.log('Input debounced');
}, 300);

// 添加事件监听器
document.getElementById('inputBox').addEventListener('input', debouncedFunc);

2. 节流(Throttling)

2.1. 概述

节流是一种技术,用于限制事件处理函数的触发频率,在一定时间内只允许事件处理函数执行一次。无论事件触发多频繁,都只会执行一次事件处理函数。

2.2. 实现原理

节流的实现原理是通过设置一个标记变量,在事件触发时先判断标记变量是否为真,如果为真则立即执行事件处理函数,并将标记变量置为假,然后通过定时器在指定时间后将标记变量重新置为真。

2.3. 应用场景

  • 页面滚动:当页面滚动时,限制事件处理函数的执行频率,减少滚动事件的处理次数。
  • 按钮点击:当按钮被点击时,限制事件处理函数的执行频率,防止用户频繁点击造成误操作。

2.4. 示例代码

function throttle(func, delay) {
   
   
    let canRun = true;
    return function() {
   
   
        if (!canRun) return;
        canRun = false;
        setTimeout(() => {
   
   
            func.apply(this, arguments);
            canRun = true;
        }, delay);
    };
}

// 使用节流函数包装事件处理函数
const throttledFunc = throttle(() => {
   
   
    console.log('Scroll throttled');
}, 300);

// 添加事件监听器
window.addEventListener('scroll', throttledFunc);

3. 区别

3.1. 触发频率

  • 防抖: 只有当事件停止触发一段时间后才执行事件处理函数,不管事件触发频率多高,只会执行一次。
  • 节流: 在一定时间内只允许事件处理函数执行一次,无论事件触发频率多高,每隔一段时间就会执行一次事件处理函数。

3.2. 执行时机

  • 防抖: 在事件停止触发一段时间后才执行事件处理函数。
  • 节流: 事件处理函数在一定时间内定期执行,保证了事件处理函数的执行频率。

3.3. 应用场景

  • 防抖: 适用于需要延迟执行的操作,如输入框搜索、窗口调整等。
  • 节流: 适用于限制事件处理函数的触发频率,如页面滚动、按钮点击等。

4. 总结

本文详细介绍了防抖和节流两种前端优化技术的原理、应用场景和实现方法。防抖用于延迟执行事件处理函数,直到事件停止触发一段时间后执行;节流用于限制事件处理函数的触发频率,在一定时间内只允许执行一次。通过合理使用防抖和节流技术,可以有效地提升页面性能和用户体验。

相关文章
|
9天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
137 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
监控 前端开发 JavaScript
前端工程化和传统前端开发的区别是什么?
前端工程化相比传统前端开发,在开发模式、代码组织与管理、构建与部署流程、团队协作、性能优化以及技术选型等方面都有了显著的改进和提升,能够更好地应对现代前端应用开发的复杂性和高要求。
|
6天前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
25 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
3月前
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
3月前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
67 6
|
3月前
|
SQL 安全 网络安全
Web应用防火墙(WAF)与数据库应用防火墙有什么区别?
Web应用防火墙(WAF)专注于Web应用系统和网站的应用层防护,可有效应对OWASP Top 10等常见攻击,防止SQL注入、CC攻击等。而数据库应用防火墙则位于应用服务器与数据库之间,提供数据库访问控制、攻击阻断、虚拟补丁等高级防护功能,直接保护数据库免受攻击。两者分别针对Web层和数据库层提供不同的安全保护。
63 4
|
3月前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
3月前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
4月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
304 14
|
4月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
83 0

热门文章

最新文章

  • 1
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
  • 2
    springSecurity学习之springSecurity过滤web请求
  • 3
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
  • 4
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
  • 5
    WEB 版的报表工具有没有意义?
  • 6
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
  • 7
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
  • 8
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
  • 9
    【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
  • 10
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex