简单的聊聊节流和防抖

作者: 小鳄鱼的大哥哦 | 来源:发表于2019-01-30 14:55 被阅读3次

    防抖函数(debounce)和节流函数(throttle)为了防止函数被连续调用而被发明出来。
    说说他们的异同之处,这里以我的话(我觉得)来解释一下。

    他们的区别动画

    防抖函数(debounce)

    函数在某个时间段内被连续触发,在最后一次触发后再执行

    场景:一个搜索框,需要触发input事件,来实时的请求服务端的数据。某个用户想搜索NIKE买一波鞋子,如果不做处理的话,那么浏览器会发起四次请求N,NI,NIK,NIKE。这在某种情况下(需要限制的情况)就造成了资源浪费。理想状态下,等用户输入完成NIKE之后,再去向服务端发起请求。为了防止这样的连续请求,防抖函数(debounce)就很必要了。在用户停止输入后的1s后再去请求数据就比较合适了。

    针对以上场景简述一下原理:
    有点绕如果input事件一直触发,那么Ajax就一直不触发,直到input事件1s内不触发,Ajax才触发。

    function debounce(fun, delay) {
      var timer;
      return function() {
        // 如果一直触发input事件,就一直清除之前的定时器
        clearTimeout(timer);
        // 清除之后再定义一个新的定时器,准备执行的方法
        timer = setTimeout(() = >{
          // 把this指向对应的input方便操作,然后传参
          fun.apply(this, arguments)
        },
        delay)
      }
    }
    
    document.querySelector('input').oninput = debounce(function(event) {
      // Ajax(event.target.value)
    },1000)
    
    节流函数(throttle)

    函数在某个时间段内被连续触发,只执行一次

    场景:一个搜索按钮,某个用户为了好玩在2S内点击了100次,如果不做处理的话,会连续多次向服务器发起请求,服务器不堪重负了。那么如果我们在这里使用节流函数,让点击的事件1s内只触发1次

    针对以上场景简述一下原理:
    当click事件执行一次之后,需要等到第2s才能执行下一次,在这期间的click事件无效

    function throttle(fun, threshhold = 1000) {
      var timer, start = Date.now();
      return function() {
        var now = Date.now();
        // 如果一直触发click事件,就一直清除之前的定时器
        clearTimeout(timer);
        // 当前时间 - 之前执行时的时间  执行间隔时间是够超过规定的时间
        if (now - start >= threshhold) {
          fun.apply(this, arguments);
          start = now;
        } else {
          timer = setTimeout(() = >{
            fun.apply(this, arguments);
          },threshhold)
        }
      }
    }
    
    document.querySelector('button').onclick = throttle(function(event) {
      // Ajax()
    },2000)
    

    如果对这两种函数的区别还有困惑的话,再仔细琢磨一下好了
    他们的区别动画

    防抖函数(debounce)和节流函数(throttle)的都简单实现了,lodash对这这两种函数有更加复杂的实现
    lodash的debounce实现
    lodash的throttle实现

    相关文章

      网友评论

        本文标题:简单的聊聊节流和防抖

        本文链接:https://www.haomeiwen.com/subject/emzqsqtx.html