通俗易懂的理解什么是节流和防抖

140 阅读1分钟

关于什么是节流

概念

在连续触发事件n秒钟里,只执行一次函数叫做节流。

一句话概括就是:每隔一定时间,执行一次函数。

例如

当在玩王者荣耀的时候,当英雄的释放技能后都会进入一个冷却时间,当冷却时间结束后,技能方可再次释放

2.webp

代码演示

利用 节流 来处理鼠标在盒子内滑动显示数字不断自加操作

const box = document.querySelector('.box')
    let i = 0
    function mouseMove() {
      box.innerHTML = ++i
    }
    
    // 节流函数
    function throttle(fn, t) {
      // 起始时间
      let old = 0
      return function () {
        // 得到当前时间
        let new = Date.now()
        // 判断如果大于等于500 采取调用函数
        if (now - starTime >= t) {
          // 调用函数
          fn()
          // 起始时间 - 现在的时间 写在调用函数的下面
          starTime = now
        }
      }
    }

    box.addEventListener('mousemove', throttle(mouseMove, 500))

核心思路 :利用时间相减,当移动后的时间 - 刚开始移动的时间 >= 500ms 去执行 mouseMove函数

关于什么是防抖

概念

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

一句话概括就是:中间打断,重新计算时间

例如

在王者荣耀的时候,英雄在回城的时候会有一个进度条,中间打断,进度条会重新执行

3.webp

代码演示

const box = document.querySelector('.box')
        let i = 0
        function mouseMove() {
            box.innerHTML = ++i
        }

        // 防抖函数
        function debounce(fn, t) {
            let timeId
            return function () {
                // 如果有定时器就清除
                if (timeId) clearTimeout(timeId)
                // 开启定时器
                timeId = setTimeout(() => {
                    fn()
                }, t)
            }
        }

        box.addEventListener('mousemove', debounce(mouseMove, 500))

核心思路 利用定时器实现,当鼠标滑过,判断有没有定时器,没有就清除,以最后一次滑动为准开启定时器