防抖 && 节流
防抖(debounce):
触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。
使用场景:输入框实时联想搜索
javascript
function debounce(fn, delay) {
let timer;
return function (...args) {
timer && clearInterval(timer)
timer = setTimeout(() => {
fn.call(this, args);
}, delay)
}
}
节流(throttle)
高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率,关键在于加锁。
使用场景:window.onresize、scroll、重复点击
javascript
function throttle(fn, delay) {
let start = 0;
return function (...args) {
let now = Date.now();
if (now - start >= delay) {
fn.apply(this, args);
start = now;
}
}
}