1、防抖(debounce)

指在时间n内,函数被触发多次,但是只执行一次,执行最新的触发。也就是在时间n内,碰到新的触发,就清除之前的,重新计时。

最简单的实现

function debounce(func, wait) {var timeout;return function () {clearTimeout(timeout)timeout = setTimeout(func, wait);}
}

修改this指向的

function debounce(func, wait) {var timeout;return function () {var context = this;clearTimeout(timeout)timeout = setTimeout(function(){func.apply(context)}, wait);}
}

2、节流(throttle)

当持续触发某个事件时,会有规律的每隔时间n就执行一次函数。

最简单的实现

function throttle(func, wait) {var context, args;var previous = 0;return function() {var now = +new Date();context = this;args = arguments;if (now - previous > wait) {func.apply(context, args);previous = now;}// 时间没到,啥都不干}
}

3、区别

对新触发执行的时间点不一样

上面的示例均为延迟防抖和延迟节流,特点在于执行时间点在周期最后。相对应的有前缘debounce和前缘throttle,这个执行时间点是立即执行的,对应上图中的1节点,之后的触发还是按照上图来,debounce的第二次执行会在停止触发之后的1s执行,throttle会在1s之后看有没有新的触发。

上文中代码来自于:

JavaScript专题之跟着 underscore 学防抖
JavaScript专题之跟着 underscore 学节流

4、lodash的使用


这句话我看了半天,大概理解是这样,当有触发时,会先执行一次leading的func, 后面如果又有n次触发,就又执行一次func,n的取值可以是n >= 1

5、防抖还是节流

以一个输入框为例,来测试lodash防抖和节流的区别:

快速在输入框内输入123,函数wait时间设置为1000,并保证输入在1s内完成。

_.debounce leading trailing 结果 分析
1 true false 打印了1 只有开始执行,无法获得最终输入的数据,
默认 false true 输入完成1s后, 打印了123 在输入间隔时间小于1s的情况下,打印不会执行,直到你停止输入1s后,才打印
3 true true 打印1; 1s后打印123 开始执行一次,停止输入后1s后执行1次
4 false false 啥都不干!
_.throttle leading trailing 结果 分析
1 true false 打印了1 同debounce
2 false true 1s后, 打印了123 从输入开始的1s后,打印1次,不同于debounce的停止输入后的1s打印
默认 true true 打印1; 1s后打印123 开始执行一次,1s后再执行1次
4 false false 同debounce

总结
throttle和debounce最大的区别在于最后打印的时间不一样。
所以,选择防抖还是节流,主要取决于具体的需求。

  1. 输入框需求,我肯定是想要在我输入完成之后再进行请求,而不是在我输入过程中,每隔1s就发一下请求,所以我会选择防抖,并设置wait为100或者200, 选择第2种配置。

  2. 对于按钮,我会设置wait为1000,使用第1种配置。这种防抖和节流函数从结果来看没有区别。

其他场景就看你需要什么样的效果了。

6、公用组件使用防抖和节流

比如我写了一个公用组件he-input,监听@input事件,并对调用debounce处理该事件,时间间隔为1000。

// he-input.vue 组件<el-input v-model="value" @input="inputChange"></el-input>methods: {inputChange: _.debounce(function (v) {console.log(v)},1000,{leading: false,trailing: true,})
}

如果一个页面只有1个he-input,那没有问题。

当一个页面有两个甚至多个he-input的时候,就会有问题。

上面的时间间隔是1s,那么当我在1s内改变两个输入框的值,但结果只触发了一次打印,
主要原因是两个组件用了同一个debounce函数,两个组件在1s内先后触发,debounce只执行了最后一个触发,之前的都被忽略

因此,在公共组件内用防抖和节流要注意将其写在created或者mounted里面,让每一个实例都有其各自的函数。

created() {this.inputChange =  _.debounce(function (v) {console.log(v)},1000,{leading: false,trailing: true,})
}

一张图搞清楚防抖和节流的区别相关推荐

  1. 一张图搞懂Spring bean的完整生命周期

    转载自 一张图搞懂Spring bean的完整生命周期 一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任 ...

  2. 一张图搞清楚Java异常机制

    转载自 一张图搞清楚Java异常机制 下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承 ...

  3. android 视网膜黄斑检查 amsler,自测黄斑病变 | 一张图搞定

    原标题:自测黄斑病变 | 一张图搞定 关注 很多人提到黄斑都唯恐避之不及,但你知道吗?人体也有一个重要的"黄斑"部位是必须保护的那就是眼底黄斑区,它跟我们的视觉是密切相关的. 如果 ...

  4. java 原型图_一张图搞懂原型、原型对象、原型链

    基本概念 在javascript中,函数可以有属性. 每个函数都有一个特殊的属性叫作原型(prototype) 每个对象拥有一个原型对象 [[Prototype]] / __proto__ / Obj ...

  5. 【一张图搞定关机程序】让你的代码有趣起来!送兄弟送闺蜜,快乐原来如此简单!(赋全过程和结果,超详细解说)

    从这里开始让你的代码有趣起来 事情是这样的 关机程序 实现关机指令 代码实现 如何把程序送出去 故事后续 快乐传递 事情是这样的 你也许不会想到,简单的几行的代码居然可以带来如此多的快乐,那么事情究竟 ...

  6. Math:利用学生计算器计算一大堆的平均数和方差思维图文教程(一张图搞定!)

    Math:利用学生计算器计算一大堆的平均数和方差思维图文教程(一张图搞定!) 目录 利用学生计算器计算一大堆的平均数和方差教程 利用学生计算器计算一大堆的平均数和方差教程 我们的学生计算器其实有很多功 ...

  7. 5张图搞懂Java深浅拷贝

    微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...

  8. 4张图搞懂Salesforce的认证体系(附新手考证攻略)

    Salesforce认证计划概述 最近这一两年,Salesforce的Trailhead和认证太热门了,小伙伴们前赴后继地刷Badge拿认证,可以考的认证也随着产品家族的增加而增加,从十几年前的几个认 ...

  9. 两张图搞定IJK源码

    IJK源码两张图就可以搞定,一张是IJK从播放到停止的代码流程图,一张是IJK的线程模型图

最新文章

  1. C语言实现,设计一个将所有奇数移动到偶数之前的算法
  2. eclipse修改文件代码不起作用,输出时还是老的,估计是缓存问题
  3. 这50位青年科学家,腾讯每人给300万
  4. 嵌入式编程与c语言有何区别,有的嵌入式设备也提供C++编译器,那还有理由坚持使用C语言吗?...
  5. aix服务器端口配置文件,aix配置(IP,子网掩码,DNS)网络接口的三种方式
  6. boost::core模块实现np地址
  7. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  8. win10 mysql 主从复制_win10 使用Docker配置mysql主从复制
  9. 幻想乡三连A:五颜六色的幻想乡
  10. python 混淆矩阵_新手常见的5个Python错误
  11. Python开源微博工具:Twitter
  12. 初识 Proxysql
  13. 应用机器学习(五):支持向量机
  14. uploadify php 重命名,Uploadify_THINKPHP配置说明
  15. Off World Live 插件:广播UE4内部的音频信号到NDI
  16. mysql查询编辑器_navicat怎么进入查询编辑器
  17. stm32---步进电机驱动器接口电路,共阴
  18. Android手机上剪藏笔记到Obsidian
  19. html简单实现自动轮播代码怎么写,HTML图片轮播代码怎么写?
  20. c语言操作符的自我总结hhhhhhhhh

热门文章

  1. 三星galaxyS9定制Rom入门教程
  2. c语言课程设计分组,《程序设计课程设计》分组课程设计作业要求
  3. 电子计算器的RoHS检测
  4. [git] summary
  5. web初探-JavaScript-JavaScript 对象
  6. 聚焦技术,2022巨杉荣获国内外多家权威机构认可
  7. 深入理解spring中的AOP原理——实现MethodInterceptor接口,自已动手写一个AOP
  8. OCR图片转文字软件神器出炉,PDF转换成文字软件,简体转繁体,繁体转简体一键导出,手写的也可以试一试
  9. 黑客之道-解码Facebook的DevOps之路
  10. 计算机在网站设计中的应用,计算机网站设计在教学辅助管理中的应用