首页 > 技术文章 > 防抖和节流

coderLsq 2021-04-01 14:26 原文

防抖和节流是JS用来处理在一定时间内重复出现一个操作的时候采取的策略。

/**
   * 防抖函数:在一定时间内多次执行相同的操作,在每次操作后都会重新执行;
   * 设计思路:
   * 1.防抖函数会在执行的时候清楚计时器的ID,并且重新执行至此这个操作;
   * 2.我们就必须使用闭包延长作用域链,让下次的函数的执行时也获取到上次的的计时器的ID。
   * */
  function debounce(fun, delay) {
    let timer;
    return function(args) {
      clearTimeout(timer)
      timer = setTimeout(function () {
        fun(args);
      }, delay);
    };
  }
  const inputFun = function(value) {
    console.log(value);
  };
  const debounceInput = debounce(inputFun, 1000)
  document.getElementById("in").addEventListener("keyup", function (e) {
    debounceInput(e.target.value);
  });

节流函数:

/**
   * 节流函数是指在一定时间内只会执行一次代码;
   * 设计思路:
   * 1.首先我们设计一个节流阀,在当timer为false的话就能执行计时器的方法
   * 2.为timer赋值,并在计时器内部将timer修改为false
   * 3.使用闭包将timer的作用域延长
   * */
  
  function throttle(fun, wait) {
    let timer;
    return function () {
      if (!timer) {
        timer = setTimeout(function () {
          timer = false;
          fun();
        }, wait);
      }
    };
  }

  const btn = document.getElementById("btn");
  function btnClick() {
    console.log("这个btn被点击了");
  }
  const throttleBtn = throttle(btnClick, 1000);
  btn.addEventListener("click", function () {
    throttleBtn()
  })

(ps:并且在这里出现了一个小插曲,我在书写防抖函数的时候为了方便就没有命名变量,都是直接函数式编程,结果并不能起到防抖函数的作用,据我分析是因为没有分开写,导致每次都会重新执行新的计时器方法,timer也就会不一样,所以并没有起到作用)

推荐阅读