一些用户频繁触发的事件操作,对于dom操作,资源加载等消耗性能的处理可能会导致页面卡顿,这时就需要用到函数节流(throttle)和函数防抖(debounce)
函数防抖
事件被触发n秒之后再执行,如果在这个n秒之内被再次触发,就重新计时
使用场景:
- 做输入框自动补全提示(实时搜索),需要监听用户的输入行为,根据输入内容去请求后端接口,如果不做函数防抖的话,每次触发keyup就要请求一次,非常消耗性能
- 拖拽
实现函数防抖:用setTimeout
function debounce(fn, delay){
    var timer;
    return function(e){
        var that =  this;
        clearTimeout(timer);
        timer = setTimeout(function(){
            fn.call(that, e)
        }, delay)
    }
}
function fn(args){
    console.log(args)
}
document.getElementById('debounce').addEventListener("click",function(e){
    debounce(click, 500)(e)
})
函数节流
预定一个函数只有在大于等于执行周期时才执行,周期内调用不执行,不管函数触发的多频繁都会保证一个周期执行一次
使用场景:
- 窗口resize
- 页面滚动scroll
实现函数节流:
function throttle(fn, delay){
    let prev = 0;
    return function(args){
        let that = this;
        let now = Date.now();
        if(now - prev >= delay){
            fn.call(that, args);
            prev = now;
        }
    }
}
