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. 数字万用表测量二极管、三极管
  2. LeetCode Merge k Sorted Lists(有序单链表数组的合并)
  3. openssl与cryptoAPI交互AES加密解密
  4. android 监听手机开机
  5. win64环境下的一些配置
  6. kafka内部消费偏移
  7. springmvc返回值、数据写到页面、表单提交、ajax、重定向
  8. [Java] 蓝桥杯ALGO-120 算法训练 学做菜
  9. java高性能反射框架_终于有人把性能优化讲清楚了!阿里架构师推荐的Java性能权威指南可太强了...
  10. CentOS 常用命令及快捷键整理[转载]
  11. 转发给上海的朋友们!程序员写了一款抢菜插件!这个抢菜插件让上海很多朋友成功抢了一个月的菜!感谢!...
  12. python中tolist()命令
  13. 关于AE中出现 “对 COM 组件的调用返回了错误 HRESULT E_FAIL” 错误
  14. 也许下一个倾家荡产的就是你
  15. 小知识:移动硬盘打不开是什么原因造成的?
  16. css实现3D动画效果——正方体变六边形
  17. 七大常见排序,你究竟懂几个?(下)
  18. Pythonic写法
  19. 资料员培训建筑八大员培训建筑工程施工资料管理中存在的问题
  20. 干货深挖!从写简历,到面试、谈薪酬的那些技巧和防坑指南

热门文章

  1. 【C++音视频】mediasoup-demo部署
  2. 手把手教你使用新浪api(java)
  3. 怎么提取照片中的文字?
  4. windows系统bat批处理 笔记本开wifi 笔记本查看wifi密码
  5. Sweep and Prune - new BroadPhase
  6. 吸取ps以外的颜色_我从黑,白,红以外的颜色中学到了什么
  7. 我就骂你了,我tm还想打你呢
  8. JavaScript脚本编辑器
  9. springboot日志打印
  10. 想自学Java的速来!一文搞懂JVM架构和运行时数据区,满满干货指导