美文网首页JavaScript 进阶营
节流函数和函数去抖

节流函数和函数去抖

作者: pengji | 来源:发表于2017-12-06 23:50 被阅读0次

    被问到一个完全陌生的名词,于是来记录一下。争取以后不忘:)


    节流函数

    目的: 目的就是为了节流函数,从而优化性能。举例:1.连续的dom事件会占用过多的cpu和内存,如ie下的onresize事件,调整浏览器大小时,如果调用了过多的dom事件,就会导致浏览器崩溃;2.常用的搜索框事件。

    原理:通过延时来使某段代码不会在短时间内反复执行。
    函数节流的基本模式:

    var processor = {
      timeoutId: null,
      //实际要执行的代码
      performProcessing: function() {},
      // 初始化处理的方法
      process: function() {
        clearTimeout(this.timeoutId);
        var that = this;
        timeoutId = setTimeout(function() {
          this.performProcessing();
        }, 100)
      }
    }
    
    processor.process();
    

    参考 Link1,中的例子尤为精妙,醍醐灌顶。这里就不多赘述了。

    但是参考 link 2中
    link1 中的 节流函数其实是 debounce,也就是函数去抖,而真正的函数节流 throttle 其实是在一个时间间隔内 不允许发生(相同), 只能在间隔外发生。这和debounce 的重新设置延时是不一样的。

    debounce 如果用手指一直按住一个弹簧,它将不会弹起直到你松手为止。也就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。

    /**
    * 空闲控制 返回函数连续调用时,空闲时间必须大于或等于 idle,action 才会执行
    * @param idle   {number}    空闲时间,单位毫秒
    * @param action {function}  请求关联函数,实际应用需要调用的函数
    * @return {function}    返回客户调用函数
    */
    debounce(idle,action)
    
    var debounce = function(idle, action){
      var last
      return function(){
        var ctx = this, args = arguments
        clearTimeout(last)
        last = setTimeout(function(){
            action.apply(ctx, args)
        }, idle)
      }
    }
    

    throttle 如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出。也就是会说预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。

    /**
    * 频率控制 返回函数连续调用时,action 执行频率限定为 次 / delay
    * @param delay  {number}    延迟时间,单位毫秒
    * @param action {function}  请求关联函数,实际应用需要调用的函数
    * @return {function}    返回客户调用函数
    */
    throttle(delay,action)
    
    var throttle = function(delay, action){
      var last = 0return function(){
        var curr = +new Date()
        if (curr - last > delay){
          action.apply(this, arguments)
          last = curr 
        }
      }
    }
    

    link2中还有 在underscore 中的解析,同样精妙。

    小问题,居然会有这么多名堂。这篇纯属复制粘贴,请移步link12 了解更多

    参考资料:link1 link2

    相关文章

      网友评论

        本文标题:节流函数和函数去抖

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