简单介绍一下我对节流和防抖的理解

1,154 阅读2分钟

函数节流和函数防抖

作者有话说

第一次在众多大佬的掘金上写一篇文章,以前端小白的身份谈谈我对函数防抖和节流的看法,听说字节面试题有这类问题,赶紧上号学一会,文章比较简单,不足之处求大佬指正。

表情包1.jpg

函数防抖(debounce)

指触发事件后在规定时间内函数只能执行一次,如果在规定时间内又触发了事件,则会重新计算函数执行时间。通俗的说,当用户连续点击去请求某个事件时,用户一直在规定时间内连续触发该事件,将不执行此事件,用户超过该规定时间则执行该事件。

举个粒子

function debounce(fn, delay) {
    //fn是将要执行的函数,delay就是我们规定的那个时间限制
    let timer = null
    //timer为定时器,利用闭包来保存timer防止其被销毁
    return function () {
        let arg = arguments
    //调用这个函数一次就清除上一次的定时器
       clearTimeout(timer)
     //打开这次的定时器
       timer = setTimeout(() => {
            fn.apply(this.arg);
        }, delay);
    }
}

函数节流(throttle)

这个就比较好理解了,让触发时间在规定的时间内只触发一次,

直接上粒子

function throttle(fn,delay = 1000) {
    //fn是将要执行的函数,delay就是我们规定的那个时间限制
    let prev = null
    //定义一个闭包保证不在函数执行结束后销毁
    return function () { 
        let arg = arguments
        //定义一个现在的时间并得到它
        let now = Date.now()
       //如果时间间隔大于等于设置的时间(delay)的话
         if(now-prev >= delay) {
             fn.apply(this,args);
       //将现在的时间设置成上一次的执行时间
             prev = Date.now()
         }
    }
}

总结

  • 函数防抖和函数节流都是为了避免服务器资源浪费而产生的,两者的目的都是防止某一时间频繁触发,但是他们的原理却大不相同。
  • 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。