浅析函数防抖节流

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

一、定义

防抖:

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

节流:

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

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

简单理解为

节流: 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. 适用于实时性要求不高的场景:相比于防抖,节流可以更加灵活地控制执行次数,适用于实时性要求不高的场景,如页面滚动、搜索建议等。

节流的不足:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSL证书实惠品牌——JoySSL

随着互联网的普及和发展,网络安全问题日益严重。为了保护网站数据的安全,越来越多的网站开始使用SSL证书。JoySSL证书作为一款高性价比的SSL证书,受到了广泛的关注和好评。 目前市面上主流的证书基本上都是国外证书,也就是说你在验…

爬虫程序为什么一次写不好?需要一直修改BUG?

从我学习编程以来,尤其是在学习数据抓取采集这方面工作,经常遇到改不完的代码,我毕竟从事了8年的编程工作,算不上大佬,但是也不至于那么差。那么哪些因素导致爬虫代码一直需要修改出现BUG?下面来谈谈我的感…

一种新的基于物理的AlGaN/GaN HFET紧凑模型

标题:A new physics-based compact model for AlGaN/GaN HFETs (IEEE MTT-S International Microwave Symposium) 摘要 摘要 - 针对AlGaN/GaN HFET,提出了一种无拟合参数的物理解析模型。对于非饱和操作,建立了两个接入区和栅极下方I-V特性的…

【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述 裁剪空间是一个顶点乘以MVP矩阵之后所在的空间,Vertex Shader的输出就是在裁剪空间上(划重点) NDC空间概述 接上面,由GPU自己做透视除法将顶点转到NDC空间 两者的转换 透视除法将Clip Space顶点的4个分量都除以…

selenium 工具 的基本使用

公司每天要做工作汇报,汇报使用的网页版, 所以又想起 selenium 这个老朋友了。 再次上手,发现很多接口都变了, 怎么说呢, 应该是易用性更强了, 不过还是得重新看看, 我这里是python3。 pip安装…

双音多频的通信(数字信号处理实验3)

(1)从数字信号处理的角度分析双音多频通信,查阅资料了解双音多频通信的原理及工作过程,总结在实验报告中。 (2)了解DTMF接收信号时,离散傅立叶变化的过程。 (3)在程序中改…

人工智能 -- 技术概览

1、我们身处人工智能的时代 人们从早期做web开发,到移动端的开发;之后随着数据量的增大,人们开始研究高并发的问题;当数据量不断的增大,而人们希望数据不被浪费时,产生了大数据的技术,包括&…

真空工艺腔内潮湿有什么危害?

在半导体制程中,真空工艺腔被广泛使用。薄膜沉积,干法刻蚀,光刻,退火,离子注入等工序均需要在相应的真空腔室中完成相应制程。真空工艺腔在半导体制程中起着至关重要的作用,它能够提供一个高度控制的环境&a…

河北中洺科技-数据标注是怎样工作的?

由于人工智能系统的普及,各种智能场景在生活中变得普遍。然而,在这些极大方便我们生活的智能背后,数据标注似乎从未被人们所重视。数据标注是怎样的工作?为什么被称为人工智能训练师? 要想了解这些问题,我…

npm-工具包

npm-工具包 npm 介绍 npm&#xff08;Node Package Manager&#xff09;是用于管理和共享Node.js包&#xff08;包括代码、工具和资源&#xff09;的包管理工具 常用命令 局部安装包 npm install <package-name>: 安装指定的包 npm install <package-name> --save…

将二维数组ndarray转置ndarray.T

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将二维数组ndarray转置 ndarray.T 选择题 执行以下代码transposed_arr的输出结果为&#xff1f; import numpy as np arr np.array([[1, 2, 3], [4, 5, 6]]) transposed_arr arr.T print(&q…

json处理由fastjson换jackjson

fastjson没有jackjson稳定&#xff0c;所以换成jackjson来处理对象转json和json转对象问题。 首先下载jackjson包&#xff0c;三个都要引用 然后修改实现类 package JRT.Core.Util;import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.ja…

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

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

【攻防世界-misc】hit-the-core

1.将文件打开后发现文件内容为这样子的&#xff0c; 2.看文件内容里面有一串字符&#xff0c;发现除第一个大写字母不是隔四个小写以外&#xff0c;剩下的每隔四个小写字母就可以看到一个大写字母&#xff0c;刚好是ALEXCTF&#xff0c;按这个规律找下去&#xff0c;应该就可以…

Kubernetes入门篇

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容Kubernetes是什么&#xff1f;为什么需要 Kubernetes&#xff0c;它能做什么&#xff1f;Kubernetes 版本进化Kubernetes 概念Kubernetes 中 3 个重要概念 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中&#xff0c;在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术&#xff0c;这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

精力管理金字塔

精力管理金字塔 由协和医学院的张遇升博士在《掌控精力&#xff1a;不疲惫的身心管理术》一书中提出&#xff0c;分层次对精力管理提出了解析和有效的建议。 模型介绍 精力管理是一个可以学会的技能&#xff0c;学会了科学的精力管理方法&#xff0c;就能使自己的精力越来越好…

webpack项目工程初始化

一、初始化项目 默认系统已经安装node //初始化 pnpm init//安装webpack pnpm i -D webpack webpack-cli 新建一个index.html的入口文件 新建一个src文件存放js代码&#xff0c;src里面新建一个index.js package.josn配置打包命令 {"name": "webpack-cs&q…

【算法】算法题-20231129

这里写目录标题 一、15. 三数之和二、205. 同构字符串三、383. 赎金信 一、15. 三数之和 提示 中等 6.5K 相关企业 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] …

计算机服务器中了faust勒索病毒怎么办,faust勒索病毒解密文件恢复

计算机技术的不断发展&#xff0c;为企业的生产生活运营提供了坚实基础&#xff0c;但网络是一把双刃剑&#xff0c;网络安全威胁也在不断增加&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了faust勒索病毒攻击&…