浅析函数防抖节流

防抖和节流都是前端开发中常用的优化性能的技术。

一、定义

防抖:

防抖指的是在事件触发后,在规定的时间内若再次触发,则重新计时,直到规定时间内没有再次触发事件,才执行事件处理。这样可以避免在短时间内频繁地触发事件而导致页面卡顿或者出现错误。

节流:

节流指的是在规定的时间内只执行一次事件处理。在事件被触发后,首先会执行一次事件处理,然后在规定时间内,无论事件被触发多少次,都不会再次执行事件处理,直到规定时间过去后才会执行下一次事件处理。这样可以有效节约资源,提高页面的性能。

两者的区别在于防抖是在最后一次事件触发之后再进行事件处理,而节流则是在规定时间内只执行一次事件处理。

简单理解为

节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效
防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时

二、示例

防抖

function debounce(func, delay) {let timer;return function() {clearTimeout(timer);timer = setTimeout(() => {func.apply(this, arguments);}, delay);};
}// 使用防抖函数处理事件
const handleSearch = debounce(function() {// 在这里执行搜索操作
}, 300);// 监听输入框的输入事件,并在防抖函数中处理
input.addEventListener('input', handleSearch);

防抖函数使用了闭包和定时器来实现。当事件触发时,清除之前设置的定时器,然后重新设置一个新的计时器,在规定时间内若再次触发该事件,则重新计时,直到规定时间内没有再次触发事件,才会执行事件处理。这样可以避免在短时间内频繁地触发事件而导致页面卡顿或者出现错误。

具体实现中,首先定义了一个timer变量来保存定时器。然后返回一个匿名函数,当该匿名函数被调用时,会先清除之前设置的定时器,然后重新设置一个新的计时器,等待一段时间后执行目标函数。

节流

function throttle(func, delay) {let timer;let lastTime = 0;return function() {const currentTime = Date.now();if (currentTime - lastTime >= delay) {func.apply(this, arguments);lastTime = currentTime;}};
}// 使用节流函数处理事件
const handleScroll = throttle(function() {// 在这里执行滚动操作
}, 200);// 监听滚动事件,并在节流函数中处理
window.addEventListener('scroll', handleScroll);

节流函数也使用了闭包和定时器来实现。每次事件触发时,判断当前时间和上一次执行事件处理的时间差,只有当时间差超过规定时间间隔时才执行事件处理操作。这样可以有效节约资源,提高页面的性能。

具体实现中,首先定义了一个timer变量来保存定时器,以及一个lastTime变量来保存上一次执行事件处理的时间。然后返回一个匿名函数,当该匿名函数被调用时,会获取当前时间,计算当前时间和上一次执行事件处理的时间差,只有当时间差超过规定时间间隔时才执行事件处理操作,并更新lastTime变量的值。

三、使用场景

  1. 防抖(Debounce)
  • 在用户输入搜索关键字时,可以使用防抖来减少频繁的搜索请求。只有在用户停止输入一段时间后才进行实际的搜索操作。
  • 在窗口大小调整、滚动事件等情况下,可以使用防抖来避免过多的计算和重绘操作。
  1. 节流(Throttle)
  • 在滚动事件处理中,可以使用节流来限制事件处理的频率,减少滚动时的计算量,提高页面性能。
  • 在按钮点击事件或提交表单等情况下,可以使用节流来防止用户重复操作,限制事件的触发频率。

防抖和节流的主要目的是优化性能和提升用户体验,避免不必要的网络请求或频繁的计算和渲染操作。根据具体的业务需求和交互场景,可以选择适合的方式来应用防抖和节流,以达到更好的效果。

四、二者区别

相同点:

  • 目的:防抖和节流都是为了控制事件触发的频率或次数,从而提升性能和用户体验。
  • 实现方式:防抖和节流都可以通过设置定时器来延迟执行或限制执行次数。

不同点:

  1. 触发时机
  • 防抖(Debounce):事件触发后会等待一定的时间间隔(延迟期),只有在延迟期结束后没有再次触发事件时,才会执行事件处理。
  • 节流(Throttle):事件触发后会在固定的时间间隔内执行一次事件处理,无论在这段时间内触发了多少次事件,都只执行一次处理。
  1. 执行次数
  • 防抖:在延迟期内,如果事件触发多次,只会执行一次事件处理,即只执行最后一次触发事件的处理。
  • 节流:在固定的时间间隔内,无论事件触发多少次,都会执行一次事件处理。
  1. 应用场景
  • 防抖 适用于需要等待用户停止操作后再执行的情况,如搜索框输入、窗口调整等场景。
  • 节流 适用于需要限制触发频率的情况,如滚动事件、按钮点击等场景。

就例如,都设置时间频率为500ms,在2秒时间内,频繁触发函数,节流,每隔 500ms 就执行一次。防抖,则不管调动多少次方法,在2s后,只会执行一次
在这里插入图片描述

综上所述,防抖和节流的主要区别在于触发时机和执行次数。防抖用于等待一定时间后执行最后一次操作,节流用于限制在一定时间间隔内执行一次操作。根据具体需求选择适合的方式,可以优化性能和用户体验。

五、优点与存在的不足

防抖的好处:

  1. 减少处理次数:对于频繁触发的事件,使用防抖可以大大减少事件处理的次数,避免过多的计算和渲染,提升性能。
  2. 提升用户体验:防抖可以让用户在停止操作后再执行事件处理,避免了短时间内多次执行处理带来的不必要交互和视觉干扰。
  3. 代码简洁:使用防抖可以通过封装一个函数或组件来统一处理事件,减少重复代码,提高开发效率。

防抖的不足:

  • 延迟期设置不当可能导致误操作:如果将延迟期设置得太长,可能会造成用户的不满或误操作;而设置得太短,则可能会导致事件处理无法完成。
  • 对实时性要求较高的场景不适用:防抖需要等待一段时间才能执行事件处理,因此对于实时性要求较高的场景,如视频播放进度条拖动,防抖并不是最佳选择。

节流的好处:

  1. 控制执行次数:节流可以限制在一定时间间隔内执行事件处理的次数,避免了频繁触发事件带来的性能消耗。
  2. 平滑交互体验:节流可以让事件处理在固定时间间隔内均匀执行,提供更平滑的交互体验,尤其适用于滚动、拖拽等连续触发的场景。
  3. 保留最新状态:由于节流会在固定时间间隔内执行事件处理,可以保留最新的状态或数据,确保处理的准确性和一致性。
  4. 适用于实时性要求不高的场景:相比于防抖,节流可以更加灵活地控制执行次数,适用于实时性要求不高的场景,如页面滚动、搜索建议等。

节流的不足:

  • 延迟响应:由于节流会在固定时间间隔内执行事件处理,可能会造成响应的延迟,特别是在较长的时间间隔设置下。
  • 频率过低可能影响用户体验:如果时间间隔设置得太长,可能会导致事件的实时性不足,影响用户的操作体验。
  • 实现复杂度较高:相比于防抖,实现节流的逻辑相对复杂一些,需要考虑计时器、时间间隔控制等因素,增加了开发的复杂度。

综上所述,防抖和节流都有自己的优点和限制。选择使用哪种方式取决于具体的业务需求、事件类型以及性能和用户体验的权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis实战命令

实战命令 单值缓存 set key value get key 对象缓存 (1)set user:1 value(json格式) (2)mset user:1:name junfeng user:1:age 18 mget user:1:name user:1:age 分布式锁 分布式锁解决了什么问题? 分布式锁解…

2 线、3 线和 4 线 RTD 配置之间有什么区别?

电阻温度检测器 (RTD) 是温度传感器的一种,由于其准确性、可重复性和稳定性而广泛应用于各种工业应用。这些设备通过感测材料温度变化时电阻的变化来测量温度。 RTD 探头有多种配置,包括 2 线、3 线和 4 线型号。这些类型之间存在显着差异,在…

智能优化算法应用:基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于回溯搜索算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.回溯搜索算法4.实验参数设定5.算法结果6.参考…

ubuntu改window任务栏

经常在ubuntu和win之间切换,任务栏的布局不统一会让人很别扭,个人很喜欢win任务栏的不折叠图标功能,而ubuntu没有,又很喜欢的ubuntu的多工作空间,效率比副屏还高,还可以自定义切换工作空间的快捷键。鱼和熊…

2023-11-28-直播单细胞图表美化-seurat数据结构 featureplot dotplot vlnplot

单细胞常见的可视化方式有DimPlot,FeaturePlot ,DotPlot ,VlnPlot 和 DoHeatmap几种 ,Seurat中均可以很简单的实现,但是文献中的图大多会精美很多。 之前 跟SCI学umap图| ggplot2 绘制umap图,坐标位置 &am…

[SaaS] 广告创意中stable-diffusion的应用

深度对谈:广告创意领域中 AIGC 的应用这个领域非常快速发展,所以你应该保持好奇心,不断尝试新事物,不断挑战自己。https://mp.weixin.qq.com/s/ux9iEABNois3y4wwyaDzAQ我对AIGC领域应用调研,除了MaaS服务之外&#xff…

安全防控 | AIRIOT智能安防管理解决方案

现代社会对安全和便捷性的需求越来越高,特别是在大型商业园区、住宅社区和办公大楼等场所。传统的安防系统往往存在一些痛点: 通行效率问题:传统门禁系统通常导致人员排队等待,降低了通行效率。车辆通行管理不当会导致交通拥堵和停车问题。 …

Elasticsearch 线上实战问题及解决方案探讨

1、reindex相关问题 1.1 问题描述 我有 1tb 的一个大索引若干,要迁移到另外一个新集群去,有没有好办法?reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断,而且没地方查到错误?1000多万的数据&…

【axios封装】万字长文,TypeScript实战,封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

鸿运主动安全监控云平台存在任意文件读取漏洞 附POC

@[toc] 鸿运主动安全监控云平台存在任意文件读取漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途…

蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据

理论: 串口采取异步通信,即不依赖时钟节拍来接收或发送数据,而是采用互相约定的波特率传输数据。 波特率与单位时间传输的比特数有关,波特率越大传输的数据越多 传输一个比特花费的时间T 1 / 比特率 接受和发送数据的时候需要…

leetcode:455. 分发饼干

一、题目 原题链接:455. 分发饼干 - 力扣(LeetCode) 函数原型:int findContentChildren(int* g, int gSize, int* s, int sSize) 二、思路 将胃口数组和饼干尺寸数组降序排序 遍历两个数组,从胃口数组中找到符合饼干尺…

网络入门---网络的大致了解

目录标题 网络发展的简单认识协议作用的理解协议的本质什么是协议分层网络通信所面对的问题OSI七层模型TCP/IP模型协议报头的理解局域网通信局域网通信基本原理报头的问题局域网的特点跨网的网络链接如何查看mac地址 网络发展的简单认识 通过之前的学习我们知道计算机是给人提…

使用docker-compose优雅部署nacos

查看代码中引入nacos版本 在应用的pom.xml中搜索nacos关键字,找到相关的nacos依赖 点击以来左边的图标,找到依赖管理器中的pom.xml,并全局搜索nacos,即可找到对应的nacos客户端版本 使用docker-compose部署nacos version: 3s…

Jmeter-分布式压测(远程启动服务器,windows)

1 前提条件 JDK已部署,版本一致Jmeter已部署,版本一致多台服务器连接的同一网络(例如:同一wifi)防火墙处于关闭状态(或者对应默认端口处于开放状态)虚拟网络适配器都处于关闭状态查找到每一台服务器的IP 2 主服务器配…

蓝桥杯第229题 迷宫与陷阱 BFS C++ 模拟 带你理解迷宫的深奥

题目 迷宫与陷阱 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/229/learning/?page1&first_category_id1&name%E8%BF%B7%E5%AE%AB%E4%B8%8E%E9%99%B7%E9%98%B1 思路和解题方法 首先,定义了一个结构体node来表示迷宫中的每个节点,包…

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点,表达真实的地形,这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见的GIS数据…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分,每天都要与之互动。 精通Git不仅能简化你的日常操作,还能显著提高生产力。在这篇文章中,我们将探讨一组能够极大提升生产力的命令。 随着对…

适用于 Windows 的最佳电脑数据恢复软件是什么?

数据丢失是数字世界中令人不快的一部分,它会在某一时刻影响许多计算机用户。很容易意外删除一些重要文件,这可能会在您努力恢复它们时带来不必要的压力。幸运的是,数据恢复软件可以帮助恢复已删除的文件,即使您没有备份它们。这是…

智慧公厕为高速服务区公厕做出的贡献

在现代社会,科技的飞速发展改变了人们的生活方式,也深刻影响着城市的基础设施和公共服务。而在这个数字化时代的背景下,智慧公厕作为城市智能化管理的一部分,为高速服务区公厕带来了一系列的创新和贡献,为旅客的出行提…