节流和防抖是肩并肩关系

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

共同点:

都是用来避免一个事件短时间内被重复触发多次,减少函数的调用频率,以减少不必要的操作从而提高性能。通常在用户输入(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.mfbz.cn/a/771252.html

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

相关文章

堆结构、堆排序

堆 是完全二叉树&#xff0c;类似这种样式的 而这种有右子节点&#xff0c;没左子节点的就不是完全二叉树 分为大根堆和小根堆 大根堆是二叉树里每一颗子树的父节点都是这颗子树里最大的&#xff0c;即每一棵子树最大值是头节点的值 小根堆相反 把数组中从0开始的一段数人…

【等保2.0是什么意思?等保2.0的基本要求有哪些? 】

一、等保2.0是什么意思&#xff1f; 等保2.0又称“网络安全等级保护2.0”体系&#xff0c;它是国家的一项基本国策和基本制度。在1.0版本的基础上&#xff0c;等级保护标准以主动防御为重点&#xff0c;由被动防守转向安全可信&#xff0c;动态感知&#xff0c;以及事前、事中…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时&#xff0c;脸部细节往往不够精细&#xff1f; 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己…

开源的基于图像识别本地实名认证系统(本项目不借助任何api) v1.0

前言: 本项目主要是代替昂贵的实名认证服务api或者sdk&#xff0c;目前仍然存在很多缺点 一、具体介绍 1.组成: 人脸识别服务器分为两部分: (1)、http服务端 server.py共有四个函数: DrawFaceinIdCard:用户上传身份证图片后&#xff0c;服务端会对身份证进行抠人像和ocr处理…

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日&#xff0c;福州市工业和信息化局公布2024年第一批《福州市名优产品目录》&#xff0c;澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…

正交的拉丁方阵(MOLS)

在组合数学中&#xff0c;如果两个同阶的拉丁方阵叠加后&#xff0c;每个位置上的有序对条目都是唯一的&#xff0c;则这两个拉丁方阵被称为正交的。 如果一组同阶的拉丁方阵中&#xff0c;任意两个方阵都是正交的&#xff0c;则这组方阵被称为一组相互正交的拉丁方阵&#xf…

Prometheus 监控Kubelet的运行状态

kubelet通过/metrics暴露自身的指标数据。kubelet有两个端口都提供了这个url&#xff0c;一个是安全端口&#xff08;10250&#xff09;&#xff0c;一个是非安全端口&#xff08;10255&#xff0c;kubeadm安装的集群该端口是关闭的&#xff09;。安全端口使用https协议&#x…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller)&#xff1a;2. 请求映射(Request Mapping)&#xff1a;3. 参数绑定(Request Parameters Binding)&#xff1a;4. 视图解析器(View Resolver)&#xff1a;5. 数据绑定(Data Binding)&#xff1a;6. 表单验证(Form Validation)…

02-部署LVS-DR群集

1.LVS-DR工作原理 LVS-DR模式&#xff0c;Director Server作为群集的访问入口&#xff0c;不作为网购使用&#xff0c;节点Director Server 与 Real Server 需要在同一个网络中&#xff0c;返回给客户端的数据不需要经过Director Server 为了响应对整个群集的访问&#xff0c;…

【JS】过滤数组中空值——arr.filter(Boolean)

前言&#xff1a;过滤数组中的空值&#xff0c;包括 &#xff08;undefined、null、“”、0、false、NaN&#xff09; Boolean函数可以将一个值转换为布尔值&#xff0c;空值会被转换为false&#xff0c;非空值会被转换为true 方法&#xff1a; const arr [1, 2, ""…

Redis 典型应用——分布式锁

一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况&#xff0c;此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于 "线程安全" 的问题&#xff1b; 而 Java 中的 synchronized&#xff0c;只能在当前进程中生…

线上问题定位分析宝典——Linux中定位JVM问题常用命令

查询Java进程ID #ps axu | grep java #ps elf | grep java查看机器负载及CPU信息 #top -p 1(进程ID) #top (查看所有进程)获取CPU飙升线程堆栈 1. top -c 找到CPU飙升进程ID&#xff1b; 2. top -Hbp 9702(替换成进程ID) 找到CPU飙升线程ID&#xff1b; 3. $ printf &quo…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

【SpringBoot3学习 | 第2篇】SpringBoot3整合+SpringBoot3项目打包运行

文章目录 一. SpringBoot3 整合 SpringMVC1.1 配置静态资源位置1.2 自定义拦截器&#xff08;SpringMVC配置&#xff09; 二. SpringBoot3 整合 Druid 数据源三. SpringBoot3 整合 Mybatis3.1 Mybatis整合3.2 声明式事务整合配置3.3 AOP整合配置 四. SpringBoot3 项目打包和运行…

界面材料知识

界面材料是用于填充芯片和散热器之间的空隙&#xff0c;将低导热系数的空气挤出&#xff0c;换成较高导热系数的材料&#xff0c;以提高芯片散热能力。参考下图 图片来源网上 热阻是衡量界面材料性能最终的参数&#xff0c;其中与热阻有关的有&#xff1a; 1、导热系数&#x…

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

使用java stream对集合中的对象按指定字段进行分组并统计

一、概述 有这样一个需求&#xff0c;在一个list集合中的对象有相同的name&#xff0c;我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求&#xff0c;这里做一个记录&#xff0c;希望对有需求的同学提供帮助 一、根据指定字段进行分组 一、先准备好给前端要…

菱形继承和菱形虚拟继承

c具有多继承的特性&#xff0c;那么菱形继承就是多继承的一种特殊情况&#xff0c;但是菱形继承会出现一些问题&#xff0c;比如数据冗余和二义性&#xff1b; 那么怎么解决这个问题呢&#xff1f; 菱形虚拟继承 菱形虚拟继承的原理 class A { public:int _a; };class B: v…

Stable Diffusion【基础篇】:降噪强度(denoising strength)

提到降噪强度&#xff08;denoising strength&#xff09;&#xff0c;大家一定不会陌生&#xff0c;这个参数是图生图中最关键的参数之一。今天在Stable Diffusion Art网站看到一篇介绍降噪强度&#xff08;denoising strength&#xff09;的文章&#xff08;地址&#xff1a;…

【postgresql】版本学习

PostgreSQL 17 Beta 2 发布于2024-06-27。 PostgreSQL 17 Beta 2功能和变更功能的完整列表&#xff1a;PostgreSQL: Documentation: 17: E.1. Release 17 ​ 支持的版本&#xff1a; 16 ( 当前版本) / 15 / 14 / 13 / 12 ​ 不支持的版本&#xff1a; 11 / 10 / 9.6 / 9.5 /…