js工具函数-防抖&节流

296 阅读1分钟

应用场景:当一个事件被频繁的触发的时候(比如resize/keyup/keydown方法等),浏览器的压力是很大的,况且用户也不需要那么快的数据,例如用户点击键盘事件进行联想搜索的时候,我就不需要频繁的发送ajax到后台,我可以等一等,等到用户输入的差不多了,我再发请求,或者固定频率发请求

防抖函数和节流函数的区别

防抖函数当用户不断触发事件的时候他会一直等待,而节流函数是按照规定的时间触发事件

  • 防抖函数
/**
 * 功能:防抖函数
 * 参数:
 *    fn:事件触发的回调函数
 *    interval:事件触发的延迟时间
 *    flag:真 ==> 第一次事件触发的时候立即触发
 *    flag:假 ==> 全部延迟触发事件
 * 返回值:无
 * 
 * 在vue中的调用实例(methods的方法中)
 * keyup:debounce(function(name){
 *    console.log(name)
 * },500,false),
 */
function debounce(fn, interval, flag) {
  let timer = null;
  return function (...args) {
    clearInterval(timer);
    if (flag) {
      let callNow = !timer
      timer = setTimeout(() => {
        timer = null;
        fn.call(this);
      }, interval)
      if (callNow) {
        fn.apply(this, args);
      }
    } else {
      timer = setTimeout(() => {
        fn.apply(this, args);
      }, interval)
    }
  }
};
  • 节流函数
/**
 * 功能:节流函数
 * 参数:
 *    fn:事件触发的回调函数
 *    interval:事件触发的延迟时间
 * 返回值:无
 * 
 * 调用实例:
 * 在vue中的调用实例(methods的方法中)
 * keyup:throttle(function(name){
 *    console.log(name)
 * },500),
 */
function throttle(fn, interval) {
  let perviousTime = 0;
  return function () {
    let nowTime = Date.now();
    if (nowTime - perviousTime > interval) {
      fn.call(this);
      perviousTime = nowTime;
    }
  }
};