手写防抖debounce和节流throttle

240 阅读1分钟

防抖和节流可以防止某一事件频繁触发,比如input输入后根据输入内容发送查询请求等。

函数防抖(debounce)

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

function debounce(fun,time){
    let timer
    return function(...args){
        clearTimeout(timer)
        timer=setTimeout(()=>{
          fun.apply(this,args)
        },time)
    }
}

注意
return的function的参数用...剩余参数存储成数组,不然fun.apply的时候会出错

image.png

函数节流(throttle)

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

function throttle(fun,time){
  let t1=0 //初始时间
  return function(...args){
    let t2=new Date() //当前时间
    if(t2-t1>time){
      fun.apply(this,args)
      t1=t2
    }
  }
}

2.0版本

function throttle(fn, wait) {
    let timer = null;
    return function(...args) {
        // 如果没有开启定时器,开启一个
        if (!timer) {
            timer = setTimeout(function () {
                fn.apply(this,args)
                // 执行完fn后将定时器timer清空
                timer = null;
            }, wait); 
        }
    }
}

参考文章

juejin.cn/post/684490…

juejin.cn/post/701650…