防抖(debounce)
什么是防抖?
- 一个函数被触发
n
秒后,才执行此函数 - 如果
n
秒内再次触发此函数,那么重新以再次触发的时间开始重新延迟 n 秒后执行此函数
这样的函数 执行行为 叫做函数防抖。
应用场景
监听设备窗口大小发生改变,只有停止改变后的
200ms
执行handleResize
方法window.addEventListener("resize", debounce(handleResize, 200));
监听表单填写,表达内容改变都去请求服务端数据,在每次表单执行输入停止的
500ms
后,才发起请求input.addEventListener("change", debounce(handleRequest, 500));
代码实现
function debounce(event, delay) {
let timer = null;
return function (...args) {
// ...args用来接受fun原有的参数,比如事件就是event对象
clearTimeout(timer); // 利用clearTimeout的特性,处理delay内,再此触发函数不做处理
timer = setTimeout(() => {
event.apply(this, args);
}, delay);
};
}
节流(throttle)
什么是节流?
- 单位时间内多次触发函数,函数只进行一次执行
- 如果在这个单位时间内,多余的触发,全部不做处理。使函数按照规定的速率执行
这样的函数 执行行为 叫做函数节流。
应用场景
滚动事件,持续滚动,间隔
200ms
执行dom.addEventListener("scroll", throttle(handleScroll, 200));
鼠标滑动事件,一秒钟大概可以执行
60
次。使用节流函数优化,200ms
执行一次。如果不做节流处理,可想而知浏览器压力有多大dom.addEventListener("mousemove", throttle(handleMove, 200));
代码实现
function throttle(fun, delay) {
let prev = Date.now();
return function (...args) {
// ...args用来接受fun原有的参数,比如事件就是event对象
let now = Date.now();
if (now - prev >= delay) {
fun.apply(this, args);
prev = Date.now();
}
};
}