性能优化-节流防抖

94 阅读1分钟

节流

指连续触发事件,但是在 n 秒内只执行一次函数

例如:英雄联盟的技能

举例:鼠标在盒子上移动,里面的数字每500ms就会变化+1,鼠标停止,数字也停止变化

<style>
  .box {
    width: 500px;
    height: 500px;
    background-color: #ccc;
    color: #fff;
    text-align: center;
    font-size: 100px;
  }
</style>

<body>
  <div class="box"></div>

  <script>
    const box = document.querySelector('.box')
    let i = 1  // 让这个变量++
    // 鼠标移动函数
    function mouseMove() {
      box.innerHTML = ++i
      // 如果里面存在大量操作 dom 的情况,可能会卡顿
    }

    // 节流函数 throttle 
    function throttle(fn, t) {
      // 起始时间
      let startTime = 0
      return function () {
        // 得到当前的时间
        let now = Date.now()
        // 判断如果大于等于 500 采取调用函数
        if (now - startTime >= t) {
          // 调用函数
          fn()
          // 起始的时间 = 现在的时间   写在调用函数的下面 
          startTime = now
        }
      }
    }
    box.addEventListener('mousemove', throttle(mouseMove, 500))
  </script>
</body>

防抖(debounce)

指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间

例如:英雄联盟的回城

举例:鼠标在盒子上移动,鼠标停止之后,500ms后里面的数字就会变化+1

<style>
  .box {
    width: 500px;
    height: 500px;
    background-color: #ccc;
    color: #fff;
    text-align: center;
    font-size: 100px;
  }
</style>

<div class="box"></div>

<script>
   const box = document.querySelector('.box')
  let i = 1  // 让这个变量++
  // 鼠标移动函数
  function mouseMove () {
    box.innerHTML = ++i
    // 如果里面存在大量操作 dom 的情况,可能会卡顿
  }
  // 防抖函数
  function debounce (fn, t) {
    let timeId
    return function () {
      // 如果有定时器就清除
      if (timeId) clearTimeout(timeId)
      // 开启定时器 200
      timeId = setTimeout(function () {
        fn()
      }, t)
    }
  }
  // box.addEventListener('mousemove', mouseMove)
  box.addEventListener('mousemove', debounce(mouseMove, 200))
</script>