什么是函数节流和函数防抖?
国际惯例听起来高大上的名词一般都是常见的问题,哈哈
通俗的来讲就是当需要进行一个连续操作的动作时,我们不希望代码连续的跑这个任务,因为人根本就区分不出来,但是计算机可以执行,虽然可以执行但我们并不需要这样我们只需要它的结果,那这个任务就是在浪费计算机的性能,这怎么能行!所以我们要解决!
想象每天上班大厦底下的电梯。把电梯完成一次运送,类比为一次函数的执行和响应。假设电梯有两种运行策略 throttle 和 debounce ,超时设定为15秒,不考虑容量限制。
举个栗子:
throttle
策略的电梯。保证如果电梯第一个人进来后,15秒后准时运送一次,不等待。如果没有人,则待机。debounce
策略的电梯。如果电梯里有人进来,等待15秒。如果又人进来,15秒等待重新计时,直到15秒超时,开始运送。
throttle 应用场景
函数节流有哪些应用场景?
哪些时候我们需要间隔一定时间触发回调来控制函数调用频率?
- DOM 元素的拖拽功能实现(mousemove)
- 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
- 计算鼠标移动的距离(mousemove)
- Canvas 模拟画板功能(mousemove)
- 搜索联想(keyup)
- 监听滚动事件判断是否到页面底部自动加载更多(给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次);
debounce 应用场景
函数去抖有哪些应用场景?
哪些时候对于连续的事件响应我们只需要执行一次回调?
- resize/scroll 触发统计事件
- 文本输入的验证
解决之道
其实
throttle
和debounce
是差不多的,只是大家在具体使用的时候拓展出来的
发现大多数人对于这部分内容都会提到《JavaScript高级程序设计》里面的一段:
且不论这段代码具体是throttle
还是debounce
,我们只关心它的思路;
一个简版:
|
|
underscore 的实现
而 underscore 库里面已经收录了这两个方法,并加以具体改进:
|
|
参考资料
JavaScript 函数节流和函数去抖应用场景辨析
浅谈 Underscore.js 中 .throttle 和 .debounce 的差异
浅谈javascript的函数节流
Underscore 中 关于throttle和debounce
jQuery throttle / debounce: Sometimes, less is more!