防抖和节流

防抖:触发高频事件后n秒内函数只执行一次,如果n秒内高频事件再次触发,则重新计算时间

思路: 每次触发事件时都取消之前的延时调用方法

function debounce(fun,wait){
    let timer;
    return (...args)=>{
        if (timer){
            clearTimeout(timer);
        }
        timer = setTimeout(()=>{
            fun(...args);
        },wait)
    }
}
window.onresize = debounce(()=>{
    console.log(1);
},1000);

 

 

 

 

节流:高频事件n秒内触发多次,只执行其中的一次,所以 节流会稀释函数的执行频率
思路:每次触发事件时都判断当前是否有等待执行的延时函数

//利用时间间隔实现
function throttle1(fun,wait){
    let time1 = 0;
    return (...args)=>{
           const time2 = Date.now()
                const timeInterval = time2 - time1;
         if ( timeInterval < wait){
             return 
         }else {
            time1 = time2;
                        fun(...args);
        }
    }
}
window.onresize = throttle1(()=>{
    console.log(1);
},1000);
//页面在频繁resize的时候,控制台会每隔1秒打印一次

//利用定时器实现
function throttle2(fun,wait){
    let timer;
    return (...args)=>{
        if (timer){
            return
        }else {
            timer = setTimeout(()=>{
                timer = null;
                fun(...args);
            },wait);
        }
    }
}
window.onresize = throttle2(()=>{
    console.log(1);
},1000);
//页面在频繁resize的时候,控制台会每隔1秒打印一次
            

 

结合应用场景  (https://www.cnblogs.com/ympjsc/p/11813691.html)

  防抖(debounce)

    search搜索联想,用户在不断输入值时,用防抖来节约请求资源。

    window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

  节流(throttle)

    鼠标不断点击触发,mousedown(单位时间内只触发一次)

    监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断

详细内容解析:https://github.com/mqyqingfeng/Blog/issues/22

 

posted @ 2020-01-13 14:25  红苹果学园  阅读(171)  评论(0编辑  收藏  举报