当前位置: 首页 > news >正文

Web前端防抖与节流的那些事

防抖与节流:

这是前端面试中比较常见的一个问题,可能会让你现场手写,其实说白了,节流和防抖就是用来控制某些函数的调用频率。因为有时候我们一个函数可能在短时间内会被触发多次,但是每次触发都发送一次请求的话就没有必要,所以我们要通过防抖与节流来控制。

防抖:

防抖就像是PK赛里的待定区,下一个待定的人会把上一个待定的人踢出局,换句话说,一个函数在短时间内被调用多次,只会执行最后一次(划重点)

下面是我写的一个demo来帮助大家理解一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <div style="text-align:center;">
        <button id="btn1" style="height:50px;width:100px;font-size: 20px;">按钮1</button>
    </div>
    

    <script>
    	//防抖
        let time1;
        document.getElementById('btn1').onclick =
        function () {
            clearTimeout(time1);
            time1=setTimeout(function () {
                alert("我是按钮1");
                 console.log(time1);
            },2000);
        };
    </script>
</body>
</html>

解析:在这个例子中,我们可以看到当我们多次点击按钮的时候,只会执行最后一次的点击事件,clearTimeout是用来清除setTimeout的定时事件,一定要放在setTimeout的前面,因为当我们第一次点击按钮时,setTimeout函数的返回值是1,点击一次加一次,这个返回的数值是setTimeout函数的id,我们也是通过这个返回的数值(也就是id),从而使用clearTimeout来取消这一次的触发的。执行过程是这样的:当我们点击一次返回数值是1,然后我们又接着马上点击了一次,在第二次执行函数的过程中,首先clearTimeout把刚才数值为1的setTimeout事件取消掉了,然后执行数值为2的setTimeout事件,从而实现了防抖功能。

节流:

节流就像是一个看门大爷,每一段时间内它只会放一个人进去。换句话说,节流的意思就是函数在一段时间内的多次调用,仅第一次有效。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div style="text-align:center;">
        <button id="btn1" style="height:50px;width:100px;font-size: 20px;">按钮1</button>
    </div>
    
    <script>
        //节流
        let bool=true;
        document.getElementById('btn1').onclick = function () {
        if(bool){
            alert("你好呀");
            bool=false;
            setTimeout(()=>{
                bool=true
            },2000)
        }
    }
    </script>
</body>
</html>

解析:2秒内多次点击按钮,只有第一次是有效的,原理直接看代码就不多加赘述了

相关文章:

  • HTTP与TCP的区别和联系
  • ES6:箭头函数
  • 十分钟教你弄懂深浅拷贝
  • 一篇文章教你弄懂到底什么是BFC
  • <template>标签的用法
  • JS获取JSON字符串的几种方式
  • JS关于定义函数的区别(为啥推荐第二种方式)
  • 关于对JS立即执行函数(function(){...})()的深度理解
  • 10分钟Canvas从入门到实践
  • e.target与e.currentTarget的区别
  • 解决:微信小程序饼状图组件层级过高覆盖在日历选择器上
  • JS中数组splice方法使用需要注意的点
  • JS中for,for...in,for...of和forEach的用法和区别
  • JSON.parse和JSON.stringify的用法
  • 一文搞懂JS中变量作用域的那些事
  • 2017 前端面试准备 - 收藏集 - 掘金
  • crontab执行失败的多种原因
  • E-HPC支持多队列管理和自动伸缩
  • httpie使用详解
  • JavaScript 基础知识 - 入门篇(一)
  • Mac转Windows的拯救指南
  • Spring声明式事务管理之一:五大属性分析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue.js框架原理浅析
  • 从0实现一个tiny react(三)生命周期
  • 电商搜索引擎的架构设计和性能优化
  • 聊聊sentinel的DegradeSlot
  • 实战|智能家居行业移动应用性能分析
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 详解NodeJs流之一
  • 新手搭建网站的主要流程
  • 积累各种好的链接
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #LLM入门|Prompt#3.3_存储_Memory
  • $.ajax,axios,fetch三种ajax请求的区别
  • (4)(4.6) Triducer
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (42)STM32——LCD显示屏实验笔记
  • (Forward) Music Player: From UI Proposal to Code
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)EXC_BREAKPOINT僵尸错误
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ..回顾17,展望18
  • .“空心村”成因分析及解决对策122344
  • .net 生成二级域名
  • .net 怎么循环得到数组里的值_关于js数组
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET是什么
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • /proc/stat文件详解(翻译)
  • ::before和::after 常见的用法
  • [1]-基于图搜索的路径规划基础