乐趣区

小程序中使用防抖函数可以更加简单

一般小程序绑定事件如下
<view class="create-page" bindtouchmove="debounceImageMoveIng" bindtouchend="imageMoveEnd">

而正常绑定事件使用防抖函数时需要初始化防抖函数
jQuery(window).on('resize', \_.debounce(calculateLayout,150));

我们知道防抖函数是一个函数定义一个 timer 属性,然后返回一个闭包函数,当你调整浏览器大小或者滚动页面时,执行当就是防抖函数返回的这个闭包函数,而防止频繁执行就是通过 timer+setTimeout 控制。

function debounce(fn,wait){
    var timer = null;
    return function(){if(timer !== null){clearTimeout(timer);
        }
        timer = setTimeout(fn,wait);
    }
}
    
function handle(){console.log(Math.random());
}
    
window.addEventListener("resize",debounce(handle,1000));

在小程序中如果用 this.timer 代替闭包的 timer 那么就不需要额外的闭包函数,也不需要初始化防抖函数。

  debounceImageMoveIng: function (e) {if(this.timer) {clearTimeout(this.timer)
    }
    this.timer = setTimeout(()=>{this.imageMoveIng(e)
    },10)
  }

错误使用防抖函数的例子

  debounceImageMoveIng: function (e) {
    // 错误:每次触发事件都只是初始化
    debounce(()=>{this.imageMoveIng(e)
    },10)
    // 错误:每次触发事件初始化后 都执行,相当于了每次都延迟执行
    debounce(this.imageMoveIng,10)(e)
  }
退出移动版