针对一些会频繁触发的事件如scroll、resize,如果正常绑定事件处理函数的话,有可能在很短的时间内多次连续触发事件,十分影响性能。
因此针对这类事件要进行防抖动或者节流处理
函数节流是指一定时间内js方法只跑一次。比如人的眨眼睛,就是一定时间内眨一次。这是函数节流最形象的解释。
函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。
// 防抖
function debounce (func, delay = 200) {
let timer
return function (...args) {
return new Promise((resolve, reject) => {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
resolve(func.apply(this, args))
}, delay)
})
}
}
// 节流 节流其实和防抖内部逻辑基本一致固定时间内调用一次
function throttle(fn, cycle) {
let start = Date.now();
let now;
let timer;
return function () {
now = Date.now();// 增加了一个内部调用的当前时间
clearTimeout(timer);
if (now - start >= cycle) {
fn.apply(this, arguments);
start = now;
} else {
timer = setTimeout(() => {
fn.apply(this, arguments);
}, cycle);
}
}
}