防抖

简介: 如果你在日常开发中,在滚动事件或者窗口resize事件时需要做一个复杂的计算,如果不限制事件处理函数调用的频率,会加重浏览器的负担,造成性能浪费甚至页面卡顿。此时我们可以采用防抖(debounce)和节流(throttle)的方式来减少调用频率,同时又不影响实际效果,本文主要讲解防抖。

如果你在日常开发中,在滚动事件或者窗口resize事件时需要做一个复杂的计算,如果不限制事件处理函数调用的频率,会加重浏览器的负担,造成性能浪费甚至页面卡顿。此时我们可以采用防抖(debounce)和节流(throttle)的方式来减少调用频率,同时又不影响实际效果,本文主要讲解防抖。


所谓防抖,就是事件一直被触发的话,第一次触发立即执行,但是触发间隔小于设置的延迟时间(delay)时,函数不会被调用,只有触发间隔大于等于设置的延迟时间,函数才会被调用。


接下来我们理一下思路:


1. 该函数要有一个参数为事件合理触发后要调用的函数,我们定义为fn;


2. 第二个参数为调用该函数的对象,即函数执行时的this指向,我们定义为context;


3. 第三个参数为调用该函数时要传入的参数,我们定义为数组args;


4: 第四个参数为延迟时间,我们定义为delay;


注:函数内部我们还会给fn定义两个属性,用来接收setTimeout的fn.debounceATimerId和用来表示是否第一次点击的fn.debounceFirst


代码如下:


let debounce = (fn,context,args,delay=500) => {
  // 每次事件触发,如果存在fn.debounceATimerId,清除fn.debounceATimerId,为的是如果触发间隔小于延迟时间,则取消setTimeout
  if(fn.debounceATimerId){
    clearTimeout(fn.debounceATimerId)
  }
  // 判断fn.debounceFirst是否为true
  if(fn.debounceFirst){
    // 说明事件不是第一次被触发
    // 设置fn.debounceATimerId 接收 setTimeout delay 毫秒后调用fn,并绑定this为context,参数为args
    fn.debounceATimerId = setTimeout(() =>{fn.apply(context,args)},delay);
  }else{
    // 说明事件第一次被触发
    // 设置fn.debounceFirst为true
    fn.debounceFirst = true;
    // 调用fn,并绑定this为context,参数为args
    fn.apply(context,args);
  }
};复制代码


如果有错误或者不严谨的地方,请给予指正,十分感谢!

相关文章
|
运维 前端开发 搜索推荐
大象转身-平台架构如何拥抱业务创新
如果你正在负责一个超大复杂型平台(比如电商、支付、物流)的架构师,且面临各种技术负债(比如架构复杂性、团队协同复杂性),同时业务又面临从平台服务,到场景化创新的转型。那么这篇文章也许对你有收获。
112560 25
|
Java 测试技术
Spock单测利器,用了都说好
参考Spock单元测试框架介绍以及在美团优选的实践最近发现了一种写法简洁高效,一个单测方法可以测试多组测试数据,且测试结果一目了然的单测框架Spock。Spock国外的测试框架,其设计灵感来自JUnit、Mockito、Groovy,可以用于Java和Groovy应用的测试。尽管Spock写单测,需要使用groovy语言,但是groovy语言是一种弱类型,写法超级简单,我也是零基础的groovy新
1101 0
Spock单测利器,用了都说好
|
存储 缓存 NoSQL
MySQL索引详解(一文搞懂)
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
49327 17
MySQL索引详解(一文搞懂)
|
存储 JSON JavaScript
跨域问题
跨域问题
215 1
|
9月前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
375 8
|
11月前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
919 0
玩转安卓之配置gradle-8.2.1
|
网络协议 安全 容灾
哪些 DNS 服务器的响应速度快且稳定可靠?
哪些 DNS 服务器的响应速度快且稳定可靠?
16852 4
|
SQL 机器学习/深度学习 算法
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
|
算法 C++
【基础算法】开平方算法 & C++实现
在数学中,因为很多数的开平方都是无理数,所以我们需要借助数值计算的方式来进行近似值的求解。
499 0
【基础算法】开平方算法 & C++实现