函数的节流和防抖

105 阅读1分钟

函数防抖和节流,都是控制事件触发频率的方法。应用场景有很多,输入框持续输入,将输入内容远程校验、多次触发点击事件、onScroll等等。

节流

节流的意思是让函数有节制地执行,而不是毫无节制的触发一次就执行一次。什么叫有节制呢?就是在一段时间内,只执行一次。

// html 部分
    <style>
    *{padding:0;margin:0;}
    .scroll-box{
        width : 100%;
        height : 500px;
        background:blue;
        overflow : auto;
    }    
    .scroll-item{
        height:1000px;
        width:100%;
    }
    </style>
    <body>
    <div class="scroll-box">
        <div class="scroll-item"></div>
    </div>
    </body>
    
    // js 部分
    let throttle = function (func, delay) {
    let timer = null;
    return function(){
      if (!timer) {
        timer = setTimeout(() => {
          func.apply(this, arguments);
          // 或者直接 func()
          timer = null;
        }, delay);
      }
    };
    };
      
      // 处理函数
      function handle() {
      console.log(arguments)
      console.log(Math.random());
      }
    // 测试用例
    document.getElementsByClassName('scroll-box')[0].addEventListener("scroll", throttle(handle,3000));

防抖

函数防抖,这里的抖动就是执行的意思,而一般的抖动都是持续的,多次的。假设函数持续多次执行,我们希望让它冷静下来再执行。也就是当持续触发事件的时候,函数是完全不执行的,等最后一次触发结束的一段时间之后,再去执行。

 // html 部分同上
   // js 部分
   let debounce = function (fn, wait) {
   let timeout = null;
   return function () {
     if (timeout !== null) clearTimeout(timeout);//如果多次触发将上次记录延迟清除掉
     timeout = setTimeout(() => {
       fn.apply(this, arguments);
       // 或者直接 fn()
       timeout = null;
     }, wait);
   };
   }
    // 处理函数
 function handle() {
   console.log(arguments)
   console.log(Math.random());
 }
 // 测试用例
 document.getElementsByClassName('scroll-box')[0].addEventListener("scroll", debounce(handle, 3000));