【JS】浅谈防抖与节流

防抖与节流

  • 前言
  • 一、防抖
    • 1.1是什么?
    • 1.2做什么?
    • 1.3应用场景?
    • 1.4实现原理?
  • 二、节流是什么?
    • 2.1是什么?
    • 2.2做什么?
    • 2.3应用场景?
    • 2.4实现原理?
  • 总结

前言

防抖与节流算是面试题常问的一题。各个博客也经常拿电梯举例,再回顾一下。

防抖:假设你进入一部电梯,当你按某个楼层,电梯10秒关一次门,正要关闭的时候。另外的人又按了开门的按钮后进入电梯,此时电梯门又要等10秒中关闭。直到没有人按开门按钮,最后的关闭按钮才会关门。

节流:我们上下班经常坐地铁,我们知道每到一站会有个15秒上下客时间,超过15秒地铁门就会关闭,坐不上和坐过站的都只能等下一辆地铁。

在这里插入图片描述


一、防抖

1.1是什么?

上面举了电梯的例子,总结一下防抖就是:
当触发后再次触发,会取消上一次触发的执行,直到最后一次触发后过去设定时间后才执行。

1.2做什么?

经常优化的时候会用,比如按钮输入框的输入。优化高频率执行的代码,控制函数的执行频率,从而避免资源浪费,提高程序性能。

1.3应用场景?

  • 搜索框搜索输入。只需用户最后一次输入完,再发送请求
  • 手机号、邮箱验证输入检测
  • 窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

1.4实现原理?

我们已知对于频繁触发的会在一段时间内,清除上一次触发的执行之后,再重新开始下一次的执行,直到最后一次执行。

function debounce(fn, interval = 300) {
  let timeout = null;

  return function () {
  //前一个setTimeout清除掉
    clearTimeout(timeout);
  //重新生成新的setTimeout,在这个时间内还有操作,fn则不执行
    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, interval);
  };
}

二、节流是什么?

2.1是什么?

上面举了地铁的例子,总结一下防抖就是:
触发后立即执行,但如果要执行下一次,需要在离上次执行时间间隔设定时间后再出发才能执行。

2.2做什么?

经常优化的时候会用,比如鼠标滚轮。优化高频率执行的代码,控制函数的执行频率,从而避免资源浪费,提高程序性能。

2.3应用场景?

  • 动画场景:避免短时间内多次触发动画引起性能问题
  • 拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动(mousemove)
  • 缩放场景:监控浏览器窗口大小(resize)
  • 滚轮场景:鼠标滚轮事件(wheel)
  • Canvas 画笔功能

2.4实现原理?

function throttled(fn, delay) {
    let timer = null
    let starttime = Date.now()
    return function () {
        let curTime = Date.now() // 当前时间
        let remaining  = delay - (curTime - starttime)  // 从上一次到现在,还剩下多少多余时间
        clearTimeout(timer)
        //进入下一次执行
        if (remaining <= 0) {
            fn.apply(this, arguments)
            starttime = Date.now()
        } else {
            timer = setTimeout(fn, remaining);
        }
    }
}

总结

防抖: 执行最后一次
节流:每隔一段时间执行一次

共同点:优化高频率执行的代码,通过降低回调函数的执行频率,从而避免资源浪费
在这里插入图片描述

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

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

相关文章

一起玩儿3D打印机——01 3D打印机初探

摘要&#xff1a;本文介绍3D打印技术的基本知识以及3D打印机的结构分类和组成 3D打印技术这几年得到了快速的发展&#xff0c;在一些特定领域和特定行业逐渐被越来越多的人所接受并大量使用。与之相关的供应链和产业链也日益壮大&#xff0c;并形成了完善的体系。 这次之所以…

虚拟化技术的介绍

查看是否支持虚拟化: Linux虚拟化平台安装 云服务类型: 华为云的介绍: 公有云配置 区域&#xff1a; 同一个区域中的云主机是可以互相连通的&#xff0c;不通区域云主机是不能使用内部网络互相通信的 选择离自己比较近的区域&#xff0c;可以减少网络延时卡顿 华为云yum仓库&…

[C语言] 数据存储

类型意义&#xff1a; 1.类型决定内存空间大小&#xff08;大小决定了使用范围&#xff09; 2.如何看待内存空间的视角 类型分类 整形 类型大小(字节)short2int4long4long8 浮点型 类型大小(字节)float4double8long double12 构造类型 数组结构性struct联合union枚举enum 指…

windows下安装python3.8

一、从官网下载安装包 官网地址&#xff1a;https://www.python.org/downloads/ 华为云地址&#xff1a;https://mirrors.huaweicloud.com/python/ 第三方镜像&#xff1a;https://registry.npmmirror.com/binary.html?pathpython/ 注意&#xff1a;从python3.8.10版本开始…

java八股文 笔记(持续更新中~)

1 Redis 2Mysql 3JVM 4java基础底层 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1.穿透 2&#xff1a;击穿 3&#xff1a;雪崩 3 33 4:双写一致 5.持久化

Vue3全家桶 - Vue3 - 【8】模板引用【ref】(访问模板引用 + v-for中的模板引用 + 组件上的ref)

模板引用【ref】 Vue3官网-模板引用&#xff1b;如果我们需要直接访问组件中的底层DOM元素&#xff0c;可使用vue提供特殊的ref属性来访问&#xff1b; 一、 访问模板引用 在视图元素上采用ref属性来设置需要访问的DOM元素&#xff1a; 该 ref 属性可采用 字符串 值的执行设…

docker-compose Install ONLYOFFICE

ONLYOFFICE 前言 ONLYOFFICE 是一款全面的协作办公软件套件,集成了文档处理、电子表格和演示文稿等功能,为团队提供了无缝协作的工作环境。其功能强大,操作简便,是各种规模和类型的团队的首选工具。 功能介绍 多人协作:ONLYOFFICE 提供实时协作功能,让团队成员可以同时…

QGIS 开发之旅一《二次开发环境搭建》

1、 安装QT 下载QT Index of /new_archive/qt 我选择的版本是 Qt5.14.2 2、安装VS2017 Downloads & Keys - Visual Studio Subscriptions。下载后选择windows通用平台开发和C 开发就可以了。 3、安装插件QT vs tools 搜索 qt vs tools&#xff0c;选择第一个安装 …

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源&#xff0c;对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核&#xff0c;其框图如下&#xff1a; clk_in 输入时钟&#…

MachineSink - 优化阅读笔记

注&#xff1a;该优化与全局子表达式消除刚好是相反的过程&#xff0c;具体该不该做这个优化得看代价模型算出来的结果(有采样文件指导算得会更准确) 该优化过程将指令移动到后继基本块中&#xff0c;以便它们不会在不需要其结果的路径上执行。 该优化过程并非旨在替代或完全…

按键+串口发送实验

摸鱼记录 Day_15 &#xff5e;(&#xffe3;▽&#xffe3;&#xff5e;)(&#xff5e;&#xffe3;▽&#xffe3;)&#xff5e; review 前边已经学习了&#xff1a; 串口发送Vivado 串口通信(UART)------串口发送-CSDN博客 按键基于状态机的按键消抖实现-CSDN博客 1. …

CANopen转Profinet网关连接西门子PLC与变流器通讯

CANopen转Profinet网关&#xff08;XD-COPNm20&#xff09;在智能领域&#xff0c;变流器的应用非常广泛&#xff0c;变流器一般会采用CANopen协议。现场采用台达的变流器&#xff08;支持CANopen协议&#xff09;作为CANopen从站&#xff0c;S7-1500系列PLC做主站&#xff0c;…

ENVI 如何批量拆分多波段栅格

在处理遥感图像时&#xff0c;需要将多波段栅格进行拆分是很常见的需求。下面介绍一种方法&#xff0c;可以实现图像批量拆分并重命名。 打开ENVI的App Store 搜索并下载应用 在ENVI的App Store中搜索"将多波段图像拆分成多个单波段文件"&#xff0c;并下载安装。 打…

索引失效的介绍和避免方法

索引是什么 在关系数据库 中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种 存储结构 &#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录&#xff0c;可以根据…

20240309web前端_第一周作业_完成用户注册界面

作业一&#xff1a;完成用户注册界面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-…

MyBatis拦截器四种类型和自定义拦截器的使用流程

文章目录 MyBatis拦截器四种类型和自定义拦截器的使用流程一、MyBatis拦截器四种类型的详细解释&#xff1a;1. **ParameterHandler 拦截器**&#xff1a;2. **ResultSetHandler 拦截器**&#xff1a;3. **StatementHandler 拦截器**&#xff1a;4. **Interceptor Chain 拦截器…

软考高级:统计过程阶段和工作流概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的常见车型识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本文深入探讨了如何应用深度学习技术开发一个先进的常见车型识别系统。该系统核心采用最新的YOLOv8算法&#xff0c;并与早期的YOLOv7、YOLOv6、YOLOv5等版本进行性能比较&#xff0c;主要评估指标包括mAP和F1 Score等。详细解析了YOLOv8的工作机制&#xff0c…

逆向案例七——中国天气质量参数搜不到加密,以及应对禁止打开开发者工具和反debuger技巧

进入相关城市数据页面&#xff0c;发现不能调试 应对方法&#xff0c;再另一个页面&#xff0c;打开开发者工具&#xff0c;选择取消停靠到单独页面 接着&#xff0c;复制链接在该页面打开。接着会遇到debugger 再debugger处打上断点&#xff0c;一律不在此处暂停。 然后点击继…

InnoDB索引优化

索引 覆盖索引 最左前缀原则 索引下推优化 如果我执行 select * from T where k between 3 and 5 这条语句&#xff08;k 是索引&#xff09;&#xff0c;需要执行几次树的搜索操作&#xff0c;会扫描多少行&#xff1f; 这条 SQL 查询语句的执行流程…