防抖(Debounce)和节流(Throttle)是两种常用的优化前端性能的技术。
防抖:当事件被触发后,延迟一段时间执行回调函数,如果在这段时间内又触发了该事件,则重新计时。适用于频繁触发的事件,如窗口大小调整、输入框输入等,可以减少回调函数的执行次数。
节流:当事件被触发后,每隔一段时间执行一次回调函数。适用于高频率触发的事件,如滚动事件、鼠标移动事件等,可以限制回调函数的执行频率。
以下是防抖和节流的示例代码:
// 防抖函数
function debounce(func, delay) {
let timer;
return function() {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, arguments);
}, delay);
}
}
// 节流函数
function throttle(func, delay) {
let timer;
return function() {
if (!timer) {
timer = setTimeout(() => {
func.apply(this, arguments);
timer = null;
}, delay);
}
}
}
在上面的示例中,我们分别定义了 debounce 和 throttle 函数,它们接受一个回调函数 func 和一个延迟时间 delay。
debounce 函数使用了闭包来保存一个定时器 timer,在每次触发事件时,先清除之前的定时器,然后重新设置一个新的定时器。当定时器触发时,执行回调函数。
throttle 函数也使用了闭包来保存一个定时器 timer,在每次触发事件时,如果定时器不存在,则设置一个新的定时器,并在定时器触发时执行回调函数。当回调函数执行完成后,将定时器置为 null。
通过使用这两个函数,我们可以对特定的事件进行防抖或节流处理,以优化性能并控制回调函数的执行频率。