节流和防抖

一些用户频繁触发的事件操作,对于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;
        }
    }
}