防抖(Debounce) & 节流(Throttle)

860 阅读1分钟

防抖 Debounce

debounce触发后wait时间段后执行一次,wait时间段内debounce被触发重新计时wait毫秒

使用场景:input值改变实时调用后端接口

function debounce(fn, wait) {
    let timeout = null;
    return function() {
        if(timeout) clearTimeout(timeout);
        timeout = setTimeout(() => {
            fn.call(this, arguments);
        }, wait);
    };
}

节流 Throttle

使用场景:view改变时需要触发的回调函数,如:resize、onScroll等

  1. 时间戳:throttle被触发立即执行
function throttle(fn, wait) {
    let previous = 0;
    return function() {
        let now = Date.now();
        if(now - previous > wait) {
            fn.call(this, arguments);
            previous = now;
        }
    };
}
  1. 定时器:固定时间段内执行一次,停止触发后再执行一次
function throttle(fn, wait) {
    let timer = null;
    return function() {
        if(timer) return;
        timer = setTimeout(() => {
            fn.call(this, arguments);
            timer = null;
        }, wait);
    };
}