节流和防抖的区别以及应用场景的理解

简介: 节流和防抖的区别、相同点和不同点、以及应用场景的理解

节流和防抖

  • 节流和防抖两者有什么区别?
  • 节流和防抖分别用于什么场景?

节流(throttle)和防抖(debounce)是两种常用的浏览器事件处理方法。

相同点:

  1. 都是为了减少事件触发频率,优化性能。

不同点:

  1. 节流是指在一段时间内最多触发一次事件,节流算法会在特定的时间间隔内判断是否触发事件;
  2. 防抖是指在一段时间内只要有事件触发,就重新计算时间,直到这段时间内没有事件触发,才真正的执行事件;
  3. 节流适用于持续的触发,防抖适用于短时间内的大量触发。

防抖(debounce)

  防抖是一种浏览器事件处理方式,通俗地说,它是在短时间内大量触发事件时,只在最后一次事件触发结束后才真正的执行事件的过程。

通俗的说:防抖,防止抖动“你先抖动着,啥时候停了,再执行下一步”

在这里插入图片描述

举个例子,当用户快速输入搜索关键字时,浏览器每隔 500ms才会执行事件处理函数。这意味着,当用户快速输入的过程中,浏览器会不断重新计算执行事件的时间,直到 500ms内用户停止输入,才真正的执行事件处理函数。

这样做的好处是,防止大量不必要的事件触发,对性能有很好的优化作用。

代码实现(code)

function debounce(fn, delay = 200) {
    let timer = 0
    
    return function () {
        if (timer) clearTimeout(timer)
        
        timer = setTimeout (() => {
            fn.apply(this,arguments) // 透传this 和参数
            timer = 0
        },delay)
    }
}

案例测试(test)

监测输入框,用户快速输入内容过程中,防抖函数的处理效果。

防抖之前:

<body>
  搜索:<input id="input1"/>
  <script>
    function debounce(fn, delay = 200) {
    let timer = 0
    
    return function () {
        if (timer) clearTimeout(timer)
        
        timer = setTimeout (() => {
            fn.apply(this,arguments) // 透传this 和参数
            timer = 0
        },delay)
    }
}

const input1 = document.getElementById('input1')

input1.addEventListener('keyup',(e) => {
  console.log(e.target.value)
})
  </script>
</body> 

效果:

在这里插入图片描述


防抖之后:

<body>
  搜索:<input id="input1"/>
  <script>
    function debounce(fn, delay = 200) {
    let timer = 0
    
    return function () {
        if (timer) clearTimeout(timer)
        
        timer = setTimeout (() => {
            fn.apply(this,arguments) // 透传this 和参数
            timer = 0
        },delay)
    }
}

const input1 = document.getElementById('input1')

input1.addEventListener('keyup',debounce((e) => {
  console.log(e.target.value)
},300))
  </script>
</body>

效果:

在这里插入图片描述


对比结果:防抖过滤了许多不必要的事件触发,只在用户输入结束300ms后打印了输入框的结果,减少了浏览器的性能消耗。


节流(throttle)

  节流是一种浏览器事件处理方式,通俗地说,它是限制事件在特定时间内最多触发一次的过程。

  节流,节省交互沟通,流,不一定指流量

通俗的讲:“别急,一个一个来,按时间节奏来,插队者无效”

在这里插入图片描述

举个例子,当用户持续滚动鼠标滚轮时,浏览器每隔 100ms触发一次事件处理函数。这意味着,不管用户滚动的速度如何,在每 100ms的时间内最多只会触发一次事件处理函数。

这样做的好处是,防止事件过于频繁的触发,对性能有很好的优化作用。

代码实现(code)

function throttle(fn, delay = 100) {
    let timer = 0 
    return function () {
        if (timer) return
        
        timer = setTimeout(()=> {

            fn.apply(this,arguments) // 透传this 和参数
            timer = 0
        },delay)
    }
}

案例测试(test)

监测拖拽工程中,元素的位置信息,节流函数处理的效果。

节流之前:

<body>

  <div id="drag" draggable="true" style="width: 100px ;height: 50px; background-color: brown; padding: 10px;">
    可拖拽
  </div>

  <script>
    function throttle (fn, delay = 100) {
      let timer = 0
      return function () {
        if (timer) return

        timer = setTimeout(() => {

          fn.apply(this, arguments) // 透传this 和参数
          timer = 0
        }, delay)
      }
    }

    const div1 = document.getElementById('drag')

    div1.addEventListener('drag',(e) => {
      console.log('拖拽的位置:',e.pageX,e.pageY)
    })
  </script>
</body>

效果:

在这里插入图片描述


节流之后:

<body>

  <div id="drag" draggable="true" style="width: 100px ;height: 50px; background-color: brown; padding: 10px;">
    可拖拽
  </div>

  <script>
    function throttle (fn, delay = 100) {
      let timer = 0
      return function () {
        if (timer) return

        timer = setTimeout(() => {

          fn.apply(this, arguments) // 透传this 和参数
          timer = 0
        }, delay)
      }
    }

    const div1 = document.getElementById('drag')
    
    div1.addEventListener('drag',throttle((e) => {
      console.log('拖拽的位置:',e.pageX,e.pageY)
    },300))
      
  </script>
</body>

效果:

在这里插入图片描述


对比结果:节流防止了频繁的事件触发,只在用户拖拽的过程中,每隔300ms打印了元素的位置信息,减少了浏览器的性能消耗。


总结

  • 节流:限制执行频率,有节奏的执行
  • 防抖:限制执行次数,多次密集触发只执行一次
  • 节流关注“过程”,防抖关注“结果”
  • 实际工作还是使用 lodash 工具库较好
相关文章
|
6月前
|
前端开发 JavaScript Java
面试官:什么是防抖和节流?如何实现?应用场景?
面试官:什么是防抖和节流?如何实现?应用场景?
113 0
|
3天前
|
前端开发
防抖和节流的区别,实现和用处。
防抖和节流是优化高频事件处理的两种技术。防抖确保在一系列连续事件后仅执行最后一次操作,如搜索输入完成后再发送请求;节流则保证在设定时间内仅执行一次操作,适用于滚动加载等场景。两者通过限制回调函数的执行频率,有效提升前端性能。示例代码展示了如何实现这两种技术。
|
1月前
|
前端开发 JavaScript UED
什么是防抖和节流?有什么区别?如何实现?
防抖和节流是前端优化技术,用于限制函数的执行频率。防抖是在一段时间内只执行一次函数,常用于搜索输入、窗口调整等场景;节流是在固定时间间隔内执行函数,适用于滚动事件、鼠标移动等。实现方式通常使用定时器。
|
5月前
|
UED
防抖和节流,应用场景
防抖和节流,应用场景
|
监控 前端开发
前端经典面试题 | 理解 节流 和 防抖(后附手写节流\防抖)
前端经典面试题 | 理解 节流 和 防抖(后附手写节流\防抖)
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
面试官:防抖和节流的区别是啥?实现一个防抖和节流函数(一)
|
UED
防抖和节流怎么做
防抖和节流都是为了控制代码执行频率,提高性能和用户体验。
37 0
|
前端开发
什么是防抖和节流?有什么区别?
什么是防抖和节流?有什么区别?
78 0
|
JavaScript 前端开发
什么是防抖和节流?如何实现防抖和节流?
防抖(debounce)和节流(throttle)是 JavaScript 中常用的两种性能优化方法。