浅析函数防抖节流

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

一、定义

防抖:

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

节流:

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

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

简单理解为

节流: 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 线型号。这些类型之间存在显着差异,在…

【干货】接口公共方法(字典表查询)

公共方法 import * as api from /api/commonAjax.js;//获取字典表 const getAjaxListCommonfunction(mm,backfun) {let ajaxFun""if(mm1){//字典表1ajaxFun"getAjax1"}else if(mm2){//字典表2ajaxFun"getAjax12"}api[ajaxFun]({}).then((res)&g…

唯创知音WT2003H系列MP3录音语音芯片:多样封装,录音时长可达70S,满足各种应用需求

在日益发展的电子产品市场中,音频芯片作为产品的重要组成部分,对于提升用户体验和产品质量具有不可忽视的作用。唯创知音的WT2003H系列MP3录音芯片便是其中的佼佼者,其录音时长最多可录70S(采样率为8K),并且…

世岩清上:档案馆展厅设计的特色化

档案馆展厅设计的特色化不仅可以增强参观者的体验感,还可以更好地展现档案馆的历史文化价值。 在设计档案馆展厅时,我们可以通过以下几个方面来让其更具特色: 一、主题明确 首先,确定展厅的主题是关键。可以是档案馆的历史沿革…

git本地新建分支推送到其它分支

1,源码下完成bsp和项目环境配置 2,提交到gitlab master源码仓库 3,在本地仓库新建并切换分支 git branch rel_xxxgit checkout -b rel_xxx4,打包 5,新分支提交本地 6,git切换仓库到项目仓库 git remote ren…

Css解决浏览器缩放后,边框与图片之间有空白的问题

关键词 Css 前言 在项目开发的过程中,提高浏览器分辨率后,边框与图片之间会显示一点空白 原因 当缩放到175%时,应该1.75格代表1像素,但由于硬件层次限制,比如一格用四个物理像素点绘制,0.25格就不绘制&…

智能优化算法应用:基于回溯搜索算法无线传感器网络(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…

浅谈Elasticsearch安全和权限管理

Elasticsearch 安全和权限管理 Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎,它使得用户可以快速地存储、搜索和分析大量数据。在企业级应用中,保证数据的安全性和权限管理是至关重要的。本文将详细讲解 Elasticsearch 的安全和权限管理功能…

安全防控 | 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: 完整原始响应体类型 目标效果开始封装骨架…

dialog打开时重新渲染

在 Vue 中打开 dialog 常用的方法是使用 el-dialog 控件。当 dialog 打开时&#xff0c;常常需要重新渲染对应的内容。这个功能可以通过监听 visible 属性实现。 具体实现方法如下&#xff1a; 在 el-dialog 控件上监听 visible 属性 <template><el-dialog :visibl…

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

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

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

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

leetcode 210.课程表 II

题目链接&#xff1a;leetcode 210 1.题目 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要…

leetcode:455. 分发饼干

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