一个使用场景:
某些浏览器事件可能会在短时间内高频触发,比如:整窗口大小或滚动页面。
如果给窗口滚动事件添加一个事件监听器,然后用户不停地快速滚动页面,那你的事件可能在短短数秒之内被触发数千次。这会导致非常严重的性能问题。
所以如果功能涉及滚动事件,窗口调整事件,或者键盘事件鼠标事件等,你可能需要警觉起来,是否有必要使用 debouncing 或者 throttling 来提高页面速度与性能。

Debouncing(防抖动)

概念

debouncing(防抖动)是解决上述问题的一个方案,它的做法是 限制下次函数调用之前必须等待的时间间隔,也就是说:强制一个函数在某个连续时间段内只执行一次,哪怕它本来会被调用多次。正确实现 debouncing 的方法是:将若干个函数调用合并为一次,只有在空闲时间大于或等于给定值的时候,才执行调用方法。

实现

简单的实现一个 debounce 方法,接收两个参数,一个是需要防抖动的函数 fn,另一个是延迟时间delay

funciton debouncing(fn, delay) {let timer; //定时器return function() { // 保存函数调用时的上下文和参数,传递给 fnconst context = this;const args = arguments;clearTimeout(timer);timer = setTimeout(function(){fn.apply(context, args);}, delay);}
}

debounce 的使用方法如下:

$(document).on('keyup', debounce(function(e) {// 代码
}, 250))

Throttling(节流阀)

概念

throttling(节流阀)则是另一种解决问题的方案,它的做法是固定一段时间内函数调用的频率,它与 debouncing 最大的不同之处在于,throttling 会保证至少调用一次。

实现

debounce 类似,接收两个参数,一个是需要截流的函数 fn, 另一个是函数执行间隔阈值 threshhold

function throttle(fn, threshhold) {let timer; //定时器let last; //记录上次时间threshhold || (threshhold = 250); //默认间隔为250ms    return function() {// 保存函数调用时的上下文和参数,传递给 fnvar context = this;var args = arguments;let now = +new Date();// 如果上次调用距本次调用的时间间隔不够,则不执行 fn,并重新计时if(last && now < last + threshhold){clearTimeout(timer);// 保证在当前时间区间结束后,再执行一次 fntimer = setTimeout({last = now;fn.apply(context, args);}, threshhold);                } else {  //如果时间间隔够了,则立刻执行 fnlast = now;fn.apply(context, args);}
}

throttle使用方法如下:

$(document).on('mouvemove', throttle(function(e) {// 代码
}, 250))

总结

debouncing 和 throttling 的区别还是很明显的:前者把一段时间的多次调用合并成一次,后者把一段时间的多次调用减少为数次。下图的展示十分便于理解。

相关文章:
实例解析防抖动(Debouncing)和节流阀(Throttling)

debouncing 与 throttling相关推荐

  1. javascript面试_在编码面试中需要注意的3个JavaScript问题

    javascript面试 JavaScript is the official language of all modern web browsers. As such, JavaScript que ...

  2. 浅析Debounce 与 Throttle的区别

    文章目录 概述 Debounce 瞬时响应or延迟响应 举例与注意事项 Throttle 定义 用法举例 参考文章 这两天在学习前端知识,在Vue的官方教程中看到了这两个概念,查阅相关资料后,做以下整 ...

  3. JS防抖(Debouncing)和节流(Throttling)

    scroll 事件本身会触发页面的重新渲染,同时 scroll 事件的 handler 又会被高频度的触发, 因此事件的 handler 内部不应该有复杂操作,例如 DOM 操作就不应该放在事件处理中 ...

  4. 什么是节流(throttling)和防抖(debouncing)?

    可以使用节流(throttling)或者防抖(debouncing)来控制调用接口的频率. 节流指的是在一段时间内只允许函数执行一次,比如每隔 1 秒钟调用一次接口.可以使用 setTimeout 和 ...

  5. 防抖(Debouncing)和节流(Throttling)

    这里非自己总结,忘了在哪看到的仅作为笔记记录 防抖 可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数. /* 封装函数debounce, 实现防抖 */function deb ...

  6. 什么是函数防抖动(Debouncing)

    有一些浏览器事件可以在很短的时间内快速启动多次,例如调整窗口大小或向下滚动页面. 例如,如果将事件侦听器绑定到窗口滚动事件上,并且用户继续非常快速地向下滚动页面,你的事件可能会在3秒的范围内被触发数千 ...

  7. RESTful之限流Throttling

    可以对接口访问的频次进行限制,以减轻服务器压力.[如防止爬虫软件] 使用 可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES进行全 ...

  8. 云计算设计模式(二十三)——Throttling节流模式

    云计算设计模式(二十三)--Throttling节流模式 控制由应用程序使用,一个单独的租户或整个服务的一个实例的资源的消耗.这样的模式能够同意系统继续执行并满足服务水平协议.即使当添加需求的资源放置 ...

  9. cpu进程调度---RT Throttling【转】

    转自:http://book.2cto.com/201302/16291.html RT Throttling是对分配给实时进程的CPU时间进行限制的功能.使用实时调度策略的进程由于bug等出现不可控 ...

最新文章

  1. hdu 3062 基础的2sat
  2. 详解C++代码反汇编后的堆栈寄存器EBP和ESP
  3. 2020 ICPC NAC
  4. 冒号和他的学生们(连载18)——系统语言
  5. Jquery Uploadify插件+Servlet解决FTP多文件上传
  6. 行内元素 块级元素之间的嵌套
  7. mysql 主从 binlog_mysql 主从 binlog
  8. Windbg Configuration
  9. Comet OJ Contest 4
  10. 浪潮财务软件遇到问题
  11. 第四章 实验三IBM MQ测试高可用,使用连接工厂(多地址连接方式)
  12. android可拖动的控件,Android拖动控件的实现,自定义可拖动的LinearLayout
  13. 临床试验中的样本量估算---理论篇
  14. 工具变量两阶段最小二乘
  15. k8s笔记20--基于 K8S 的 cicd 概述
  16. python投票问题,程序列出在python中获得多数投票的候选人
  17. Wine的安装和配置(实现中文输入法和中文的复制粘贴)(转)
  18. ps cc下载地址及破解教程
  19. root密码破解方法
  20. 题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n

热门文章

  1. 猫小胖服务器位置,最终幻想14新增猫小胖大区拆分陆行鸟大区-最终幻想14国服大区调整计划公布!-Appfound...
  2. 古筝d调变降e调怎么办_干货|古筝转调变调方法详解!
  3. OrCAD Capture CIS 16.6 - 为元器件添加属性
  4. Unity_回合制战斗系统_01
  5. 1000句英语经典口语(4)
  6. Vue+OpenLayers学习系列(九)Vue+OpenLayers小案例(长度测量、面积测量、坐标定位、坐标获取)
  7. Retina、非Retina、点、像素、iPhone分辨率
  8. 静态页面笔记包括 html和css
  9. 微信小程序提现到零钱
  10. 谷歌中国追求中国式生存