使用场景:

一:函数防抖:

实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法

例如: 

  <body>
    <button>点我防抖</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null; //创建一个标记用来存放定时器的返回值
      button.onclick = function () {
        if (timeout) clearTimeout(timeout);//每当用户输入的时候把前一个setTimeout清理掉
        timeout = setTimeout(()=> {  //创建一个新的 setTimeout
          console.log("防抖");
        }, 1000);
      };
    </script>
  </body>

效果:

防抖和节流-LMLPHP

为了方便使用,把他封装成防抖函数:

  <body>
    <button>点我防抖</button>
    <script>
      let button = document.querySelector("button");
      button.onclick = debounce(function () {  //点击事件触发防抖函数
        console.log(this);
      }, 1000);
      封装的防抖函数:
      function debounce(fn, delay) {
        let timeout = null;
        return function () {      //真正的事件处理函数,this:事件的触发者
          if (timeout) clearTimeout(timeout);
          timeout = setTimeout(() => {
            fn.call(this);       //改变this指向
          }, delay);
        };
      }
    </script>
  </body>

效果:

防抖和节流-LMLPHP

 二:函数节流:

 实现思路:

例如: 

  <body>
    <button>点我</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null;
      button.onclick = function () {
        if (timeout) return;
        timeout = setTimeout(function () {
          console.log("节流");
          timeout = null;
        }, 1000);
      };
    </script>
  </body>

 效果(不管点多快都是一秒输出一次):

防抖和节流-LMLPHP

 为了方便使用,把他封装成防抖函数:

<body>
    <button>点我节流</button>
    <script>
      let button = document.querySelector("button");
      let timeout = null;
      //点击事件触发节流函数
      button.onclick = throttle(function () {
        console.log("节流");
      }, 1000);
      //封装公共节流函数:
      function throttle(fn, delay) {
        return function () {
          //真正的事件处理函数 this:事件的触发者
          if (timeout) return;
          timeout = setTimeout(()=> {
            fn.call(this);
            timeout = null; //置空,让事件再次触发时,重新创建一个定时器
          }, delay);
        };
      }
    </script>
  </body>
12-06 22:06