防抖函数

2021-02-27  本文已影响0人  susu一口酥
/**
* 防抖函数
* @param fn   需要执行的函数
* @param wait   等待的时间
* @param immediate   是否立即执行
*/
const debounce = function(fn,wait,immediate){
    // 定义定时器和返回结果
    let timeout,result;
    //延迟执行方法
    const delay = function(fn,wait,...args){
        return setTimeout(()=>{
            return fn.apply(null,args);
        },wait);
    }
    //定时执行的方法
    const later = function(context,args){
        timeout = null;
        if(args) result = fn.apply(context,args);
    }

    // 防抖执行方法
    const debounced = function(args){
        // 如果有计时器,清除
        if(timeout) clearTimeout(timeout);
        // 如果立即执行
        if(immediate){
            // 获取是否立即执行函数
            let callNow = !timeout;
            timeout = setTimeout(later,wait);
            if(callNow) fn.apply(this,args);
        }
        else{
            timeout = delay(later,wait,this,args);
        }
    }

    // 取消函数
    debounced.cancel = function(){
        clearTimeout(timeout);
        timeout = null;
    }

    return debounced;
}
上一篇 下一篇

猜你喜欢

热点阅读