防抖
触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发, 则重新计算时间。
function debounce(fn, timing) {
let timer;
return function() {
clearTimeout(timer);
timer = setTimeout(() => {
fn();
}, timing);
}
}
节流
高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行效率。
function throttle(fn, timing) {
let trigger;
return function() {
if (trigger) return;
trigger = true;
fn();
setTimeout(() => {
trigger = false;
}, timing);
}
}
口诀: 就是 DTTV (Debounce Timer Throttle Variable - 防抖靠定时器控制,节流靠 变量控制)
通俗说:(拿定时器打比方)
代码从上往下执行,不停调用同一个方法时,方法中有个定时器。
防抖 — 定时器未执行完时,进入定时器前先清除定时器再重新开启定时器继续执行。
节流 — 定时器未执行完时,进入定时器前先判断是否执行完,如未执行完直接return不执行。