防抖和节流的使用时期
防抖:每次执行会重置事件
。设置一个时间,在时间内,如果没有再次触发,则执行。如果再次触发,重置这个时间。
节流:减缓触发次数
,在指定的时间间隔内最多执行一次。相当于加大每次移动触发的间隔,如10秒内触发了10000次,通过节流我们可以设置一个时间间隔,让他10秒内触发5次
当我们写一个定时切换模块的时候,需求我们
移动鼠标重置定时器
,但是一直移动鼠标会一直触发,所以我们需要优化,但是防抖无法满足我们的需求,因为如果我在5分钟内一直移动鼠标
就会导致还没有触发重置,仍然会切换模块,所以这种情况我们使用节流,让他减缓触发次数
// 防抖
function debounce(func, wait) {
let timeout;
return function () {
const context = this;
const args = arguments;
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(context, args), wait);
};
}
window.addEventListener('mousemove', debounce(this.graphMove, 1000))
// 节流
function throttle(func, wait) {
let timeout;
let previous = 0;
return function () {
const context = this;
const args = arguments;
const now = Date.now();
if (!previous) previous = now;
const remaining = wait - (now - previous);
if (remaining <= 0) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(() => {
previous = Date.now();
timeout = null;
func.apply(context, args);
}, remaining);
}
};
}
window.addEventListener('mousemove',throttle(this.graphMove, 1000);