JS 防抖与节流

120 阅读2分钟

一、防抖(Debounce)

定义

防抖是指在事件被触发后的一段时间内,只有当事件不再被触发时,才执行一次函数。如果在这段时间内再次触发事件,则重新计时。

特点

  • 延迟执行:只有在事件停止触发一段时间后,才会执行函数。
  • 适合场景:输入框搜索、窗口调整大小、按钮点击等需要等待用户操作完成后再执行的场景。

实现原理

通过设置一个定时器,在每次事件触发时清除之前的定时器并重新设置新的定时器。如果定时器到期且没有新事件触发,则执行函数。

代码示例

function debounce(fn, delay) {
    let timer; // 定时器
    return function (...args) {
        if (timer) clearTimeout(timer); // 清除之前的定时器
        timer = setTimeout(() => {
            fn.apply(this, args); // 执行函数
        }, delay);
    };
}

// 使用示例
const handleResize = debounce(() => {
    console.log('窗口大小已调整');
}, 300);

window.addEventListener('resize', handleResize);

二、节流(Throttle)

定义

节流是指在一定时间间隔内,只允许函数执行一次。无论事件触发多少次,函数只会按照设定的时间间隔执行。

特点

  • 固定频率执行:保证函数在一定时间内最多执行一次。
  • 适合场景:滚动事件、鼠标移动事件、连续点击按钮等需要控制执行频率的场景。

实现原理

通过设置一个标志位或定时器,在第一次触发时立即执行函数,并在设定的时间间隔内阻止后续触发,直到时间间隔结束。

代码示例

function throttle(fn, interval) { 
let lastTime = 0; // 上次执行时间 
return function (...args) {
const nowTime = new Date().getTime(); // 当前时间 
if (nowTime - lastTime >= interval) { // 检查是否超过时间间隔 
lastTime = nowTime; fn.apply(this, args); // 执行函数 } }; } 
// 使用示例
const handleScroll = throttle(() => { console.log('页面正在滚动'); }, 500);
window.addEventListener('scroll', handleScroll);