彻底搞懂Javascript函数防抖与节流

为什么会有函数防抖与节流这个概念

  • JavaScript是事件驱动的,大量的操作会触发事件,加入到事件队列中处理。
  • 而对于某些频繁的事件处理会造成性能的损耗,我们就可以通过防抖和节流来限制事件频繁的发生;
  • 防抖和节流函数目前已经是前端实际开发中两个非常重要的函数,也是面试经常被问到的面试题。
  • 但是很多前端开发者面对这两个功能,有点摸不着头脑 

引用一个经典的例子

        我们知道目前的一种说法是当 1 秒内连续播放 24 张以上的图片时,在人眼的视觉中就会形成一个连贯的动画,所以在电影的播放(以前是,现在不知道)中基本是以每秒 24 张的速度播放的,为什么不 100 张或更多是因为 24 张就可以满足人类视觉需求的时候,100 张就会显得很浪费资源。再举个栗子,假设电梯一次只能载一人的话,10 个人要上楼的话电梯就得走 10 次,是一种浪费资源的行为;而实际生活正显然不是这样的,当电梯里有人准备上楼的时候如果外面又有人按电梯的话,电梯会再次打开直到满载位置,从电梯的角度来说,这时一种节约资源的行为(相对于一次只能载一个人)。 —— 引自大板栗函数节流与函数防抖

哪些场景需要防抖与节流

  • 浏览器scroll或者界面resize时候会频繁触发事件,在某些场景可能需要
  • 页面中有个grid表格数据,当我们下拉的时候调用Api获取更多的数据,此时就需要节流
  • input输入框值去请求数据的时候,就需要防抖
  • 一些keyup、keydown和keypress事件可能也需要

这种耗费性能的事情,很可能造成浏览器的卡顿,甚至崩溃,所以我们可以使用防抖与节流来处理

函数防抖(Debounce)

实质:设置一个定时器,当触发了事件之后,就销毁这个定时器,重新开启一个定时器,当没有触发事件后,到达指定的时间,就执行这个定时器。

举个例子:按下一个弹簧,每次按下去一点点,只有你松手的时候弹簧才会弹起,弹起只会操作一次,但是往下按操作了很多次

方法实现:(模拟界面滚动实现)

//界面
<body style="background: seagreen;height: 1800px;">
    <div>
      <h2>我是一个防抖函数</h2>
      <br />
      <br />
    </div>
</body>

//实现
 var timer=null
  //防抖
  window.onscroll = function(){
      clearInterval(timer)
      timer = setTimeout(()=>{
        console.log(new Date().toLocaleDateString())
      },300)
    }

解释:定义一个定时器,设置一个界面滚动事件,我们知道每次界面滚动都会触发一个滚动事件,所以我们需要使用一个定时器来做防抖,只有滚动过了0.3s才执行

 

函数节流(Throttle)

 实质:无论我们触发了多少次事件,在我们规定的时间内只触发一次。防抖有一个问题,那就是如果事件一直在触发,那么执行函数永远都得不到执行,此时我们可以用节流来解决

throttle:事件触发后执行函数执行期间内事件再次触发,执行函数将不会执行,等规定时间之后事件触发,执行函数方可再次执行。

方法实现:(模拟界面滚动实现)

//界面
<body style="background: seagreen;height: 1800px;">
    <div>
      <h2>我是一个防抖函数</h2>
      <br />
      <br />
    </div>
</body>

 //实现
 //节流
  var control = true
  window.onscroll = function () {
    if (!control) {
      return
    }
    control = false
    timer = setTimeout(() => {
      control = true
      console.log(new Date().toLocaleDateString())
      clearTimeout(timer)//清除
    }, 5000)
  }

解释:定义一个定时器,在触发一次事件后,在定时器的规定时间内不能在触发该事件,等到定时器执行了之后,该事件又可以再次被执行

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值