浅析函数防抖节流

news2024/12/25 9:35:04

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

一、定义

防抖:

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

节流:

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

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

简单理解为

节流: 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.coloradmin.cn/o/1265784.html

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

相关文章

信创实时云渲染,Paraverse平行云LarkXR适配多个国产操作系统

近日,Paraverse平行云企业级实时云渲染解决方案LarkXR,现已全面支持国产信创技术路线。这一进展不仅是3D/XR领域国产软件领域在操作系统兼容的一次进步,也是对国家自主创新战略的有力响应,展示了Paraverse平行云在推动国产软件发展…

从戴森发明的“球轮手推车”看专利

今天跟大家分享一个特别有意思的专利,那就是戴森发明的球状轮子的手推车。 相信戴森这个品牌很多人都听过,大家熟悉的应该是戴森吹风机和戴森吸尘器。这两个目前是市场上比较高端的家用设备。 很多人也正是因为这些家用设备了解到戴森这个人&#xff0…

第二十章 -----多线程

20.1 线程简介 计算机完全可以将多种活动同时进行,这种思想在java中称为并发,将并发完成的每一件事情称为线程 线程的特点: 极小的单位 一个进程有很多个线程 线程共享进程的资源 20.2 创建线程 20.2.1 继承Thread类 Thread类是Java.l…

EC 404 information economics

EC 404 information economics WeChat: zh6-86

九、LuaTable(表)

文章目录 一、定义二、Table(表)的构造三、Table 操作(一)Table连接(二)插入和移除(三)Table 排序(四)Table 最大值 一、定义 table 是 Lua 的一种数据结构用来帮助我们创建不同的数…

MySQL -DDL 及表类型

DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET&#xff1a…

sqli-labs(6)

27. 过滤了union和select 使用双写绕过 有报错信息使用报错注入 1and(extractvalue(1,concat(0x5c,database())))and11 1and(updatexml(1,concat(0x7e,database(),0x7e),1))and11 1and(extractvalue(1,concat(0x5c,(selseselectlectect(group_concat(table_name))from(inform…

MIT线性代数笔记-第17讲-正交矩阵,Schmidt正交化

目录 17.正交矩阵, S c h m i d t Schmidt Schmidt正交化打赏 17.正交矩阵, S c h m i d t Schmidt Schmidt正交化 “标准”经常表示单位长度 标准正交基:由两两正交的单位向量组成的基 将标准正交基中的元素记作 q ⃗ 1 , q ⃗ 2 , ⋯ , q …

【算法】20231128

这里写目录标题 一、55. 跳跃游戏二、274. H 指数三、125. 验证回文串 一、55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以&am…

面试题:汉诺塔问题 · 递归

你好,我是安然无虞。 文章目录 汉诺塔问题问题描述解题思路代码详解 汉诺塔问题 问题描述 解题思路 这道题的名字还是很响的,基本上都能看出来使用递归解题,但是具体怎么实现还是需要细细想一想。 我们一步一步来,请看&#xff…

vue3中的setup()函数详解

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-setup()函数 目录 setup()函数 1.1 基本使用 1.2 访问 Prop 1.3 Setup的上下文 1.4 与渲…

再探Java集合系列—LinkedList

单向链表 双向链表 LinkedList适用于什么场景? 适用于需要频繁插入和删除元素的场景,例如消息聊天系统,一开始并不明确有多少记录,可以在空间满足的情况下不断增加数据 LinkedList的特点有哪些? LinkedList的底层采…

Blender学习笔记:小车狂奔动画

文章目录 路旁小树汽车尾气移动 教程地址:八个案例教程带你从0到1入门blender【已完结】 小车建模 路旁小树 1 添加摄像机,在小车下面拉一个平面,覆盖到摄像机的观察视窗。复制一层平面,收窄变成小车两侧的路面,编辑…

Windows10系统卸载服务和删除服务

记录一下Windows10系统卸载服务和删除服务 最近在使用自己win电脑的时候 发现服务里存在很久之前就没有使用的应用,对应的文件夹也都已经删除了,但是在win服务里一直存在,不知道会不会影响性能,看着吧还是强迫自己删掉好一些&…

CH58x-BLE 程序阅读笔记

CH58x-BLE 程序阅读笔记 1. 广播1.1 广播类型设置1.2 广播数据长度 2. MTU设置2.1 CH58x 蓝牙协议栈支持有效最大MTU为247 1. 广播 1.1 广播类型设置 1.2 广播数据长度 1) GAP-广播数据(最大大小31字节,但最好保持较短以节省广告时的电量&a…

C++学习之路(十)C++ 用Qt5实现一个工具箱(增加一个时间戳转换功能)- 示例代码拆分讲解

上篇文章,我们用 Qt5 实现了在小工具箱中添加了《JSON数据格式化》功能,还是比较实用的。为了继续丰富我们的工具箱,今天我们就再增加一个平时经常用到的功能吧,就是「 时间戳转换 」功能,而且实现点击按钮后文字进行变…

图解系列--Web服务器,Http首部

1.用单台虚拟主机实现多个域名 HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不…

HbuilderX 项目打包文件过大问题优化

文章目录 HbuilderX 项目打包文件过大问题优化主要操作收效甚微,但又有那么点用的方法使用 gulp 压缩(最后一步)使用与配置 网上找的 gulp 优化压缩配置还未尝试可能有用的方法 尝试过程中看到的一些优质文章 HbuilderX 项目打包文件过大问题…

C语言每日一题(41)循环队列

力扣 622 循环队列 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前…

Mysql8.1.0 安装问题-缺少visual studio 2019x64组件

缺少visual studio x64组件的问题 使用Mysql8以上的安装包mysql-8.1.0-winx64.msi进行安装, 提示缺少visual studio 2019 x64可再发行组件 在微软官网下载vc可再发行程序包 Microsoft Visual C 可再发行程序包最新支持的下载 在Visual Studio 2015、2017、2019 和…