节流和防抖是肩并肩关系

防抖节流确实容易混淆,因为我们平常也总是把这两个连在一起说。但其实防抖就是防抖,节流就是节流,它们都属于优化技术的一种,一定不能把节流当作防抖的作用了。此文将带你彻底分清并理解防抖与节流。

共同点:

都是用来避免一个事件短时间内被重复触发多次,减少函数的调用频率,以减少不必要的操作从而提高性能。通常在用户输入(input)、窗口大小调整(resize)、滚动事件(scroll)中使用,这些都是触发非常频繁的事件。input绑定的大多是keyup事件,也就是每松开一个键位它都会触发一次。而scroll更是离谱,随便滚动一下滑轮就触发了几十次甚至上百次。

差别:

先讲节流,以方便我们更好地理解防抖

节流

简单来说就是每过一段时间就执行一次。举个例子,你在导航上位置的变化。把计算你移动的距离当作一个高频事件,一秒计算一千次,你每踏一步这个事件就触发了几百次,显然这造成了不必要的计算负担。节流技术就是可以利用定时器让这个事件在一定的时间间隔内最多执行一次,比如每秒执行一次,那么我们就减少了大量的计算,从而也不太影响你获取在导航上位置的变化。

防抖

顾名思义,防止抖动。还是举上面的这个导航的例子,如果我们跑的够快,那么根据上面节流后的情况,我们是不是在导航上就是跳跃性的,就像位置在抖动。那么防抖技术就是在你停止跑动且过了一小段时间时,才会计算一次你移动的距离,比如你停下来过了一秒就计算一次,那么我们是不是就防止了我们在跑步时导航上位置的抖动,所以叫做防抖。

代码实现方法

看完上面的阐述,想必我们对防抖与节流已经有了大概的了解,那我们现在来聊聊实现方法,这里我用了input中的keyup事件来做例子

节流

下面是JavaScript实现代码,其中inputa是普通input的id,inputc是节流input的id

const inputa = document.getElementById("inputa")const inputc = document.getElementById("inputc")
const ajax = (content) => {    console.log(`ajax request ${content}`);}const throttle = (func, delay) => {    // last:上一次是什么时候执行的    // deferTimer 定时器id    let last, deferTimer    // 事件的处理函数    // 定义时,生成时 func,delay    // keyup return func 调用时能找到闭包的自由变量    return (args) => {        let now = +new Date()        if (last && now < last + delay) {            // 触发干掉            clearTimeout(deferTimer)            deferTimer = setTimeout(() => {                last = now                func(args)            }, delay)        } else {            last = now            func(args)        }    }}
inputa.addEventListener("keyup", (e) => {    ajax(e.target.value)})let throttledFunc = throttle(ajax, 1000)
inputc.addEventListener("keyup", (e) => {    let value = e.target.value    throttledFunc(value)})

  • 功能介绍:简单的节流实现,在控制台输出在输入框输入的值,每一秒输出一次。

  • 关键:其中节流的重点就在throttle方法,利用了闭包的思想return出一个方法。通过let now = +new Date()获取当前时间,last代表上一次事件执行的时间,delay代表每多少时间执行一次,if语句中的作用就是在最后一次行为结束时也会运行一次且清除定时器,else则是让每段时间都会运行一次。

# 防抖

防抖较节流会更容易实现些,下面是JavaScript实现代码,其中unDebounce是普通input的id,debounce是防抖input的id

const inputun = document.getElementById('unDebounce')const inputis = document.getElementById('debounce')function handleNameSearch(e) {    const value = e.target.value    fetch('http://localhost:3000/users')        .then(res => res.json())        .then(data => {            const users = data            // 数组上es6的新方法, filter 过滤            const filterUsers = users.filter(user => {                // 字符串中新方法                return user.name.includes(value)            })            console.log(filterUsers);        })}// 闭包function debounce(func, delay) {    // 返回值必须得是函数 keyup 事件处理函数    return function (args) {        clearTimeout(func.id)        // 函数是对象   id挂在func上  func是闭包中的自由变量        func.id = setTimeout(() => {            func(args)        }, delay);    }}inputun.addEventListener('keyup', handleNameSearch)const debounceNameSearch = debounce(handleNameSearch, 500)inputis.addEventListener('keyup', debounceNameSearch)

  • 功能介绍:这是一个input搜索数据库中姓名的方法,也就是在搜索姓名时停止输入0.5秒后才会进行搜索,而不是每松开一个键位就搜索一次。

  • 关键:其中防抖的重点就在debounce方法,现在我们来剖析一下其中代码的含义。这里我们用到的是闭包思想,return出去了一个方法。clearTimeout用来消除上一次操作的定时器,也就是你在0.5秒内进行了一次新的操作就将上一次操作形成的定时器消除,直到你在一次操作后的0.5秒未进行任何操作了就执行搜索操作。

# 结语

清楚了防抖与节流的原理后,我们就大致可以明白在各种场景中根据具体的业务需求该如何选择。性能提升对于我们程序员是一门很深的学问,它为我们带来优质的运行效率,大幅提升用户体验。

意见和想法可写在评论区哦,看到会回复一起讨论的.

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

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

相关文章

Entity Framework EF Migration 迁移

针对Code First来说关注的只有实体类。当需求变更时只需要添加新的实体类或者在实体类中添加、删除、修改属性即可。但是修改完成之后要如何将修改同步到数据库中&#xff1f; migration 机制就出现了 ●启用Migrations   ●通过Add-Migration添加Migration   ●Update-D…

Java 中Json中既有对象又有数组的参数 如何转化成对象

1.示例一&#xff1a;解析一个既包含对象又包含数组的JSON字符串&#xff0c;并将其转换为Java对象 在Java中处理JSON数据&#xff0c;尤其是当JSON结构中既包含对象又包含数组时&#xff0c;常用的库有org.json、Gson和Jackson。这里我将以Gson为例来展示如何解析一个既包含对…

k8s kubectl top pod报错error Metrics API not available

文章目录 1、场景2、解决方法1、确认Metrics Server是否已经在集群中安装2、安装metric-server组件2.1、组件地址2.2、组件与K8S集群版本对应关系2.3、apply资源清单文件2.4、验证Metrics Server正常工作 1、场景 在使用kubectl top pod 命令时遇到了error: Metrics API not a…

AHK的对象和类学习心得

;---------------------------------- ; AHK的对象和类学习心得 By FeiYue ;---------------------------------- 一、简单对象的使用&#xff08;细节看帮助&#xff09; AHK-V1&#xff1a; 简单数组 arr:[111, 222] 关联数组 arr:{x:111, y:222, id:“abc”} 这两种可以用…

大语言模型融合知识图谱的问答系统研究

文章目录 题目摘要方法实验消融实验 题目 大语言模型融合知识图谱的问答系统研究 论文地址&#xff1a;http://fcst.ceaj.org/CN/10.3778/j.issn.1673-9418.2308070 项目地址&#xff1a;https://github.com/zhangheyi-1/llmkgqas-tcm/ 摘要 问答系统&#xff08;Question Ans…

C-I-O和多线程

C条件变量 C中的条件变量&#xff08;Condition Variable&#xff09;是一种同步原语&#xff0c;用于在多线程程序中阻塞一个或多个线程&#xff0c;直到收到另一个线程的通知。条件变量通常与互斥锁&#xff08;Mutex&#xff09;一起使用&#xff0c;以确保在访问共享数据时…

【持续更新】vs 编译过程中的问题及其解决方案

独立寒秋&#xff0c;湘江北去&#xff0c;橘子洲头。 目录 问题 1 &#xff1a; 无法查看或者打开 PDB 文件。 问题 2 &#xff1a; 命令提示符中查看运行结果&#xff0c;控制台闪退。 问题 3 &#xff1a; 某功能的判断条件&#xff1a;int val > 1e9&#xff0c;逻辑…

领导高水平,在管人上都会做这3点,让下属忠心耿耿

领导高水平&#xff0c;在管人上都会做这3点&#xff0c;让下属忠心耿耿 第一点&#xff1a;给到有面子 作为一个领导&#xff0c;一定要在另一方面给自己的下属做最大努力的争取&#xff0c;只有把利益给到位&#xff0c;让你的下属有面子&#xff0c;才能够真正的赢得下属的心…

命令行运行git reflog(reference log)报错的解决办法

文章目录 1. 检查 Git 是否已安装2. 检查 PATH 环境变量3. 重新安装 Git 在Git中&#xff0c; reflog的英文全称是 “ reference log”。意思是 引用日志&#xff08;参考日志&#xff09;。它记录了本地仓库中HEAD和分支引用所指向的提交的变更历史。这包括了你所有的提交&…

澳大利亚新闻.科技.汽车.旅行.商业类单发媒体

每日简报Daily Bulletin 澳大利亚西部时间ModernAustralian.com 澳大利亚垂直新闻.科技.汽车.旅行.商业类媒体&#xff0c;ModernAustralian.com是澳大利亚西部地区的一家权威媒体平台&#xff0c;提供全面的新闻报道、科技资讯、汽车信息、旅行指南、商业动态等内容。每日简报…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

element-ui Tree之懒加载叶子节点强制设置父级半选效果

效果&#xff1a; 前言&#xff1a; 我们是先只展示一级的&#xff0c;二级的数据是通过点击之后通过服务器获取数据&#xff0c;并不是全量数据直接一起返回回来的。 问题&#xff1a; 当你设置了默认选中的子节点&#xff0c;但是由于刚进入页面此时tree中数据暂是没有这个…

A*——AcWing 179. 八数码

A* 定义 A* 算法是一种在图形或地图中寻找最短路径的启发式搜索算法。它通过综合考虑起始节点到当前节点的实际代价和当前节点到目标节点的预估代价&#xff0c;来决定下一步的搜索方向。 运用情况 路径规划&#xff1a;如在地图导航中为车辆、行人规划最优路线。游戏开发&…

算法刷题笔记 单调栈(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 给定一个长度为N的整数数列&#xff0c;输出每个数左边第一个比它小的数&#xff0c;如果不存在则输出−1。 输入格式 第一行包含整数N&#xff0c;表示数列长度。第二行包含N个整数&#xff0c;表示整数数列。 输出格式 共一…

学会python——用python制作一个登录和注册窗口(python实例十八)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.登录和注册窗口 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

Spring Boot项目中使用MockMvc进行测试的详细指南

目录 MockMvc简介安装和配置基本用法高级用法集成测试测试最佳实践总结 MockMvc简介 MockMvc是Spring框架提供的一种用于测试Spring MVC控制器的工具。它允许开发者在不启动完整的Web服务器的情况下&#xff0c;模拟HTTP请求并验证响应。MockMvc的主要优点包括&#xff1a; …

免杀笔记 ---> PE

本来是想先把Shellcode Loader给更新了的&#xff0c;但是涉及到一些PE相关的知识&#xff0c;所以就先把PE给更了&#xff0c;后面再把Shellcode Loader 给补上。 声明&#xff1a;本文章内容来自于B站小甲鱼 1.PE的结构 首先我们要讲一个PE文件&#xff0c;就得知道它的结构…

SPI四种模式--极性与相位

SPI的四种模式&#xff1a;相位和极性 极性 定义时钟空闲状态&#xff1a; CPOL0&#xff1a;时钟线在空闲状态为低电平 CPOL1&#xff1a;时钟线在空闲状态为高电平 这个设置决定了设备不进行通信时时钟线的状态。 兼容性&#xff1a; 不同的SPI设备可能需要不同的时钟极性…

java.lang.classnotfoundexception jakarta.xml.bind.jaxbexception java 17问题

解决 <dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>4.0.2</version> </dependency>参考&#xff1a; Handling NoClassDefFoundError for JAXBException in Jav…

【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)

目录 项目演示&#xff1a; 1. 主界面 技术讲解&#xff1a; TCP连接 进程的并发 链表 SQLite3 IO对文件的读写 功能实现 实现逻辑 我遇到的问题&#xff1a; 服务器端代码思路解析 必要条件 步骤详解 客户端代码思路解析 步骤详解 服务器源码如下&#xff1a;…