前端防抖,节流函数

177 阅读1分钟
  • 防抖函数
function debounce(fn, dely,immediate = false) {
    let timer = null;
    let isInvoked = false;
    let _debounce = function(...args){//这里不使用箭头函数
        if (timer) {
            clearTimeout(timer);
        }
        if (immediate && !isInvoked) {
            fn.apply(this, args);
            isInvoked = true;
            return;
        }

       timer = setTimeout(() => {
              fn.apply(this, args);
              isInvoked = false;//这里记得置为false,因为用户再次输入时,立即执行
            }, dely);
    }
    _debounce.cancel = function () {
        if (timer) {
            clearTimeout(timer);
            timer = null;
            isInvoked = false;
        }
    }
    return _debounce
}
  • 节流函数
function throttle(fn, interval,immediate=true) {
    let startTime = 0;
    let t = null;
    return function _throttle(...args){
        let nowTime = new Date().getTime();
        if (!immediate && startTime ===0) {
            startTime = nowTime;
        }
        if (t) {
            clearTimeout(t);
        }
        let waitTime = interval - (nowTime - startTime);
        if (waitTime <= 0) {
            fn.apply(this,args);
            startTime = nowTime;
        } else {
        t = setTimeout(() => {
                fn.apply(this, args);
            },interval)
        }
    }
}