1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | const debounce = (fn,delay) => {
    // 介绍防抖函数原理,并实现
    // your code
  }
  const throttle = (fn,delay = 500) => {
    // 介绍节流函数原理,并实现
     // your code
  }
  | 
 
1)防抖函数
防抖函数原理:
在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。
适用场景:
1.按钮提交场景:防止多次提交按钮,只执行最后提交的一次。
2.服务端验证场景:表单验证需要服务端配合,只执行—段连续的输入事件的最后一次,还有搜索联想词功能类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | // 手写简化版实现
  const debounce = (fn,delay) => {
    let timer = null;
    return (...args) => {
      clearTimeout(timer);
      timer = setTimeout(() => {
        fn.apply(this,args);
      },delay)
    }
  }
   | 
 
2)节流函数
节流函数原理:
规定在一个单位时间内,只能触发—次函数。如果这个单位时间内触发多次函数,只有一次生效。防抖是延迟执行,而节流是间隔执行,函数节流即每隔一段时间就执行一次。
适用场景:
1.拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
⒉ 缩放场景:监控浏览器 resize
3.动画场景:避免短时间内多次触发动画引起性能问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | // 手写简化版实现
  // ①定时器实现
  const throttle = (fn,delay = 500) =>{
    let flag = true;
    return (...args) => {
      if(!flag) return;
      flag = false;
      setTimeout(() => {
        fn.apply(this,args);
        flag = true;
      },delay);
    };
  }
  // ②时间戳实现
  const throttle = (fn,delay = 500) => {
    let preTime = Date.now();
    return (...args) => {
      const nowTime = Date.now();
      if(nowTime - preTime >= delay){
            preTime = Date.now();
            fn.apply(this,args);
      }
    }
  }
   |