防抖与节流

141 阅读1分钟

防抖

用在搜索输入时, 函数防抖在执行目标方法时,会等待一段时间。当又执行相同方法时,若前一个定时任务未执行完,则 clear 掉定时任务,重新定时。

代码实现

function debounce(fn,delay){
     let timer = null;
     return function(){
         if(timer){
             clearTimeout(timer);  //说明当前正在计时,并且触发了相同的事件,所以需要取消当前计时,重新开始计时
         }
         timer = setTimeout(()=>{
             fn();
         },delay) //说明当前没有计时,开始计时
     }
 }

节流

用在连续点击div时, 是为了限制函数一段时间内只能执行一次,在延时的时间内,方法若被触发,则直接退出方法。

代码实现

function throttle(fn,delay){
    let valid = true;
    return function(){
        if(!valid){
            //休息事件,暂不做操作
            return false;
        }
        //执行函数并且在间隔期内把状态设置为无效
        valid = false;
        setTimeout(()=>{
            fn();
            valid = true;
        },delay)
    }
}