JS 防抖与节流的原理分析和代码手写

2023-05-16

目录

前言

作用 

防抖

使用场景

分析原理

手写代码

节流

使用场景

原理分析

手写代码

小补充


前言

前一段时间,我学习了 JS 的防抖与节流,自认为掌握住了它们,当我在做面试题的时候,遇到了一道:手写节流,我当时就觉得这题稳了!然鹅,当我结束题目,再去翻看节流的代码时,发现,我磕磕绊绊写出来的,并不是正确答案!!因此,我决定再重新梳理一遍防抖和节流,并记录下来。

作用 

对用户短时间内的操作进行限制,避免页面重复渲染, 降低服务器的压力,减少资源消耗,优化性能。

防抖

使用场景

例如:当用户在文本框输入一段内容时,每输入一个字符,就会触发一次事件,但这个频繁触发事件是不必要的,没用的,只需要在最后把所有的内容输入完成,再去触发相应事件即可。这个地方就用到了防抖的原理,js 会将前面所有的点击操作销毁,只会执行最后的一次操作,当最后一次执行完成,过了设置的时间间隔,这时,再次触发时,就会正常执行相应的操作。

分析原理

当用户触发一个事件,会立马产生一个计时变量 timer ,每次触发该事件之前,会先判断是否超过设置的时间间隔,如果没有超过,也就是短时间内,重复操作同一 dom ,这时,会先判断计时变量 timer 是否存在,存在的话,会将其清除,重新开始计时,同时,之前的 dom 操作也会失效,只会在最后一次触发回调函数。简单来说,在不超过设置时间间隔内,重复操作同一dom元素,只会执行最后一次。

手写代码

    //参数:要执行的回调函数fn,延时时间delay,如delay = 1000
    function debounce(fn,delay){
            // 计时
            var timer = null;
            return function(){
                // this是触发 fn 回调函数的那个(组件)实例对象
                var that = this;
                var args = arguments;
                // 如果timer已经存在,则清除
                if(timer){
                    clearTimeout(timer);
                }

                timer = setTimeout(()=>{
                    fn.apply(that,args);
                },delay);
            }
        }

节流

使用场景

例如:用户频繁点击提交按钮,这个时候,多次的点击,提交的内容都是一样的,因此,当用户第一次点击提交按钮时,就发送请求,触发回调,而接下来的第 2 次,……第 n 次的提交操作(在设置的时间间隔内)都不触发回调函数,直到第一次的操作与第 n+1次的操作,时间超过了设置的时间间隔。也就是,当用户频繁操作 dom 元素时,在设置的时间间隔内,只执行第一次操作触发的回调。

原理分析

定义一个标志位,当超过了规定的时间间隔,标志位 flag 为 true ,执行回调函数,否则为 false ,不执行回调函数。

手写代码

    export default function throttle(fn,delay){
            //设置初始状态为true,允许执行fn
            var falg = true;
            return function(){
                var that = this;
                var args = arguments;
                // 没有超过设置的时间间隔
                if(!falg){
                    return false;
                }

                // 超过设置的时间间隔,允许执行fn
                fn.apply(that,args);
                // 此时是在时间间隔内,将标志位设置为false,禁止执行fn
                flag = false;

                setTimeout(()=>{
                    // 超过时间间隔,把标志位设置为true,允许执行fn
                    flag = true;
                },delay);
            }
        }

小补充

Vue 框架中,已经为我们事先封装好防抖和节流的代码,只需要执行命令 npm install 安装即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 防抖与节流的原理分析和代码手写 的相关文章

  • ubuntu 22.04设置root密码,与开启sshd服务

    1 sudo passwd root 直接输入两次密码即可完成 2 安装sshd服务 xff1a apt install ssh 3 启动ssh服务 systemctl start sshd 4 设置开机启动 xff1a systemctl
  • Python+Flask+Docker+Vue实现简单的股票数据统计

    闲暇时间实现了一个简单的股票数据统计功能 数据是从网上爬下来的 xff0c 页面支持按照股票名称 股票代码 股票类型 股价 市值等搜索并展示在下方列表 除了股票的基本信息以外 xff0c 还会显示其他炒股软件上不会展示的信息如流动比率 速动
  • [2020-07-23]备战考博的一点点经历

    首先声明 xff0c 博主只是个普通人 xff0c 不是北清复交那种天才选手 xff0c 本硕都是普通一本 xff0c 像个不断前进的蜗牛一样 xff0c 好不容易还有继续往上爬的机会 xff0c 所以博主只会从一个普通学生的视角去讲自己的
  • 遇见Java

    Java是一门面向对象的编程语言 xff0c 不仅吸收了C 43 43 语言的各种优点 xff0c 还摒弃了C 43 43 里难以理解的多继承 指针等概念 xff0c 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向
  • STM32F103移植FreeRTOS警告记录

    1 xff1a 新建MDK工程 xff0c 选择文件存放路径 xff0c 选择芯片型号 xff0c 创建一个USER文件 xff0c 复制自动创建的文件到USER文件中 xff0c 关闭程序 创建一个OBJ目标文件夹 xff0c 打开软件选
  • tensorflow实现简单的卷积神经网络

    1 卷积神经网络 xff08 Convolutional Neural Network xff0c CNN xff09 优点 xff1a xff08 1 xff09 直接使用图像的原始像素作为输入 xff0c 不必先使用SIFT等算法提取特
  • zabbix4.0学习八:JMX有能监控哪些监控项详说

    zabbix4 0学习八 xff1a JMX有能监控哪些监控项详说 文章目录 zabbix4 0学习八 xff1a JMX有能监控哪些监控项详说 前言远程连接tomcat远程连接java 前言 在使用jmx监控tomcat时一直好奇MBea
  • 排序算法之冒泡排序、选择排序、插入排序的区别与联系

    冒泡排序 xff08 1 xff09 算法 xff1a 假如有N项数据 第一趟 xff0c 将首项与第二项比较 xff0c 较小者放在前面 xff0c 较大者放后面 xff0c 然后比较第二项和第三项 xff0c 依次进行 xff0c 第一
  • 排序算法之快速排序算法

    核心思想 xff1a xff08 1 xff09 要排序的一组数据中取一个数为 基准数 xff08 2 xff09 通过一趟排序将要排序的数据分割成独立的两部分 xff0c 其中左边的数据都比 基准数 小 xff0c 右边的数据都比 基准数
  • 数据结构之树知识汇总——思维导图

  • Linux基础学习与VMWare的安装和使用

    一 Linux入门概述 1 1 概述 Linux内核最初只是由芬兰人林纳斯 托瓦兹 xff08 Linus Torvalds xff09 在赫尔辛基大学上学时出于个人爱好而编写的 Linux是一套免费使用和自由传播的类Unix操作系统 xf
  • OJ刷题之1035:列车长的烦恼

    OJ刷题之1035 xff1a 列车长的烦恼 1 题目以及要求2 题目解析3 代码思路 1 题目以及要求 description John是个小列车站的站长 xff0c 每次列车在这里重新编组时他就很烦恼 因为站上只有一个人字形的编组轨道
  • python数据可视化之matplotlib学习

    python数据可视化 xff1a Matplotlib的scatter函数详解 scatter 函数参数详解 xff1a scatter x y s 61 None c 61 None marker 61 None cmap 61 Non
  • Ubuntu16.04使用sudo apt-get install ,报错E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)

    Ubuntu16 04 使用sudo apt get install git 安装git服务器 xff0c 结果出现下面的错误 E 无法获得锁 var lib dpkg lock frontend open 11 资源暂时不可用 E Una
  • python之机器学习案例实战:信用卡欺诈异常值检测

    案例背景 xff1a 有些人利用信用卡进行诈骗活动 xff0c 如何根据用户的行为 xff0c 来判断该用户的信用卡账单是否属于欺诈呢 xff1f 想获取数据集请点此处 在这个数据集中 xff0c 由于原始的用户数据具有一定的隐私 xff0
  • 信用卡欺诈检测数据集

    1 数据集简介 信用卡欺诈检测 xff0c 即异常检测 xff0c 指的是信用卡被盗刷的情况检测 该数据集中收集的是2013年9月欧洲人使用信用卡在两天内产生的交易数据 xff0c 其中284807笔交易中有492笔被盗刷 是机器学习与Py
  • 上手Vue:深度理解computed、watch及其区别

    computed xff08 计算属性 xff09 与watch xff08 侦听器 xff09 xff0c 是Vue中常用的属性 xff0c 那么什么时候该如何computed xff0c 什么时候该使用watch呢 xff1f 1 co
  • Zabbix自动发现和自动注册

    Zabbix自动发现和自动注册 文章目录 Zabbix自动发现和自动注册 前言客户端配置指定服务器自动发现添加自动发现规则创建自动发现动作添加linux主机自动发现动作添加Windows自动发现动作 查看客户端日记信息 xff1a acti
  • 深度理解Vue组件的子组件向父组件传递数据的通信方式,全面详细,看这一篇就够了,推荐收藏

    目录 Vue子组件向父组件传递数据的通信方式有很多 xff0c 我这里列举了三种 方法一 xff1a 使用props实现 方法二 xff1a 使用v on或者 64 xff0c 给组件Student的实例对象绑定一个自定义事件实现 方法三

随机推荐