跳到主要内容

防抖函数和节流函数

· 阅读需 2 分钟

防抖函数

防抖函数:延时一段时间执行某个事件,当在这段时间内又被触发时,则重新计时

使用场景:按钮防重复提交、输入搜索(连续触发,重新计时)

function debounce(fn, delay = 500) {
// 缓存一个定时器对象
let timer;

// 使用闭包,使得timer存在内存中,可以保留数据,不然每执行一次都会创建一个新的timer,依旧会执行N次的fn
return function (...args) {
// 当触发时定时器对象存在,则清除重新计时
clearTimeout(timer);

timer = setTimeout(() => {
fn.call(this, ...args); // 执行特定操作
}, delay); //重新开始定时器
};
}
在线 DEMO

    在这个案例中你可以发现,不管你输入的有多么快,永远都是停顿后的半秒钟更新一次搜索结果

    节流函数

    节流函数:当持续触发事件的时候,一段时间内只做一件事

    使用场景:DOM 拖拽、改变浏览器宽度重新渲染(持续触发,跳跃执行)

    function throttle(fn, wait = 500) {
    // 缓存一个定时器对象
    let timer;

    // 使用闭包,使得timer存在内存中,可以保留数据,不然每执行一次都会创建一个新的timer,依旧会执行N次的fn
    return function (...args) {
    // 当前存在定时任务,不创建新的定时任务,等待已有定时任务执行
    if (timer) return;

    timer = setTimeout(() => {
    fn.call(this, args);
    timer = null; // 将定时器置空
    }, wait);
    };
    }