防抖和节流目的是为了减少事件触发的频次,假设允许事件执行的间隔为 t;
防抖:事件多次触发,如果 t 时间内没有再次触发,事件执行;
节流:事件触发执行后,t 事件内不会再次执行;
防抖的实现
let debounce = function(fn, delay = 500) {
if (typeof fn !== "function") {
throw new TypeError("Expected a function");
}
let timer = null;
return (...arg) => {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
fn.call(arg);
}, delay);
};
};
节流的实现
let throttle = function(fn, delay = 400) {
if (typeof fn !== "function") {
throw new TypeError("Expected a function");
}
let flag = true;
return function(...args) {
if (!flag) return;
flag = false;
setTimeout(() => {
fn(...args);
flag = true;
}, delay);
};
};