函数去抖debounce和函数节流throttle的应用
开始以为只有节流函数,原来还有去抖函数啊。两个概念第一次听的话肯定比较容易混淆,接下来就来研究一下它们吧。 # 函数去抖debounce 在一段时间内执行该动作,在单位时间内重新调用该动作,会重新计算时间。
我的理解就是,只要触发的够快,函数就追不上我,哈哈哈。
当我停下来的时候,函数会触发最后一次。所以其中肯定有一个定时器哈,下面展示一下简单实现的代码。
1 | function debounce(fn, delay) { |
函数节流throttle
将倾斜而出的水流,一点一点的流出,这就是节流。放在函数触发中,就是本来快速l连续触发的事件以单位时间为间隔来触发。简单实现的源码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28function throttle(fn, threshhold) {
var last = null;
var timer = null;
threshhold || (threshhold = 200);
return function () {
var context = this;
var args = arguments;
var now = +new Date(); // Date.now();
if(last && ((now < last + threshhold)) {
// 判断时间间隔,以及是否第一次触发
clearTimeout(timer);
timer = setTimeout(function() {
last = now;
console.log('throttle被触发了');
fn.apply(context, args);
}, threshhold)
} else {
last = now;
console.log('throttle被触发了');
fn.apply(context, args);
}
}
}
$('.btn-click-throttle').on('click', throttle(function() {
console.log('200ms一次')
}, 200))
使用的场景
throttle函数节流
- Dom元素的拖拽实现(mousemove)
- 射击游戏的mousedown/keydown事件(单位时间只能发射一颗子弹)
- 计算鼠标移动的距离(mousemove)
- Canvas模拟画板功能
- 搜索联想(keyup)
- 监听滚动事件是否到底部自动加载更多( 监听滚动事件判断是否到页面底部自动加载更多:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次)
debounce应用场景
- 每次resize/scroll触发统计
- 文本输入的验证(连续输入文字后发送ajax进行验证,验证一次就好)
参考
- 本文标题:函数去抖debounce和函数节流throttle的应用
- 本文作者:hddhyq
- 本文链接:https://hddhyq.github.io/2018/07/08/函数去抖debounce和函数节流throttle的应用/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!