关于节流防抖的理解

本文深入探讨了JavaScript中两种重要的性能优化技术——防抖(debounce)和节流(throttle)。通过实例代码解析了它们的工作原理,展示了在输入提示、图片加载和文本保存等场景的应用。防抖确保在最后一次事件后执行一次函数,而节流则保证在规定时间间隔内执行一次。理解并正确使用这两种技术可以显著提升网页应用的性能。
摘要由CSDN通过智能技术生成

本文仅简单记录自己观点

节流防抖面试被问了无数遍,这次简单记录下

 防抖(debounce)

防抖也就是说,一个事件在一定的时间内再次触发,则重新计时,只有再次超过一定时间,才会执行下一次

应用场景:

1.input表单输入时,提示文本的出现(如果用户输入时超过一定时间,则发送http请求,去获取关键词的提示信息)

2.获取加载后的图片宽度,防止多次加载图片一直调整dom结构

3.文本保存的实时保存

源码实现

  <button id="btn">防抖请求</button>
  <script>
    let btn = document.querySelector('#btn')
    function debounce(func, time = 2000) { //需要执行的方法和执行时间
      let timer = null
      return function(...args) {
        if(timer) {
          clearTimeout(timer) //如果存在该计时器则清除
          timer = null //释放内存
        }
        timer = setTimeout(() => { //从新计时
          func.apply(this, args) //执行函数并且传入参数
          timer = null  //执行后释放内存
        }, time)
      }
    }
    let logdebounce = debounce((params) => { //要执行函数
      console.log('防抖操作'); 
      console.log(params); //20
    })
    btn.addEventListener('click', () => {
      logdebounce(20)
    })
  </script>

其实就是不断给timer赋值给新的计时器,但是之前的time内的计时器要清除掉。

节流(throttle)

节流也就是说,在规定的事件内,事件只触发一次

应用场景

1.玩游戏时,频繁点击攻击,但是也是一秒攻击一次

2.老版服务器间隔固定的时间发送一次更新请求

源码实现

<button id="btn">节流请求</button>
  <script>
    let btn = document.querySelector('#btn')
    function throttle(func, time = 2000) {
      let timer = null 
      return function(...args) {
        if(!timer) {     //只有timer为null的时候才会开启
          timer = setTimeout(() => { //相当于关闭阀门
            func.apply(this, args)
            timer = null   //释放内存
          }, time)         
        }
      }
    }
    let logthrottle = throttle(() => {
      console.log('节流函数')
    })
    btn.addEventListener('click', () => {
      logthrottle()
    })
  </script>

其实就相当于有一个阀门,开始进入时,开启计时器,关闭阀门,到达规定时间打开阀门,重新接受请求(当然你可以赋给阀门true,打开时用false,情况不唯一)

最后说一下区别

区别

函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值