防抖与节流是什么?如何实现?

本文介绍了防抖和节流两种技术,旨在减少事件处理程序的执行频率,从而提高应用程序性能。通过具体实例展示了这两种技术的实现方法及其应用场景。

**防抖与节流是什么?如何实现?**

目录

♡ ‧₊˚  定义  ‧₊˚ ♡

 ♡ ‧₊˚  实现  ‧₊˚ ♡

防抖

 节流

 ♡ ‧₊˚  应用  ‧₊˚ ♡


♡ ‧₊˚  定义  ‧₊˚ ♡

防抖(debounce):当我们持续触发一个事件时,事件处理程序不会执行,只有当我们在设置的时间间隔里没有触发事件时,事件处理程序才会执行,若在这个时间间隔里被重复触发则重新开始计算。

节流(throttle):无论事件触发得多么频繁,在规定的时间间隔内只执行一次事件处理程序。

目的:都是为了降低回调执行频率。节省计算资源

 ♡ ‧₊˚  实现  ‧₊˚ ♡

防抖

代码实现如下:


    
  1. <body>
  2. <input type="text" id="shuru">
  3. <button onclick="btnClick()">此处防抖 </button>
  4. <script>
  5. // 防抖
  6. // 获取事件
  7. var shuru = document. getElementById( 'shuru')
  8. // 创建一个定时器
  9. var timeID = null
  10. // 绑定事件
  11. shuru. oninput = function( ){
  12. // 每当用户点击/输入时就将前一个定时器删除
  13. clearTimeout(timeID)
  14. // 然后创建一个新的定时器
  15. // 如果用户在这个时间间隔内在此操作的话
  16. // 函数将不会被执行
  17. timeID = setTimeout( () => {
  18. console. log( `你输入的值是${this.value}`);
  19. }, 1000)
  20. }
  21. // 执行后我们发现:当我们在输入框持续输入内容时控制台
  22. // 不会打印东西,当我们在设置的时间间隔一秒内没有进行输入操作的话
  23. // 控制台会将我们输入的值打印出来
  24. </script>
  25. </body>

若不加入防抖,则我们每次在输入框里输入一个字符,控制台都会打印依次“你输入的值是…” ,而加入了防抖之后,若我每次在输入框中输入三个字符便停顿一次,那么在我们设置的这个时间间隔一秒之后,这个函数才会被执行一次,相应的语句被打印一次。

 

 节流

代码实现如下:


    
  1. <body>
  2. <input type="text" id="shuru">
  3. <button onclick="btnClick()">此处节流 </button>
  4. <script>
  5. var lastTime = null
  6. function btnClick( ){
  7. // 获取当前时间
  8. var currentTime = Date. now()
  9. // 从上一次到现在,还剩下多少多余时间
  10. if(currentTime - lastTime >= 3000){
  11. console. log( '被点击了');
  12. // 将当前时间赋值给lastTime继续记录时间间隔
  13. lastTime = currentTime
  14. }
  15. }
  16. </script>
  17. </body>

无论我们点击得多么频繁,语句也只会三秒再打印一次。 

 

 

 ♡ ‧₊˚  应用  ‧₊˚ ♡

防抖在连续的事件,只需触发一次回调的场景有:

  • 搜索框搜索输入。只需用户最后一次输入完,再发送请求
  • 手机号、邮箱验证输入检测
  • 窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

节流在间隔一段时间执行一次回调的场景有:

  • 滚动加载,加载更多或滚到底部监听
  • 搜索框,搜索联想功能

### JavaScript防抖节流的定义 在 JavaScript 编程中,防抖(Debounce)是指当某个事件被触发后,在设定的时间间隔内不再有新的触发,则执行相应的操作;如果在这段时间内再次触发该事件,则重新计时。这种方式可以有效减少高频事件触发带来的性能开销[^1]。 而节流(Throttle),则是指规定在一个单位时间内,只能执行一次函数。如果这段时间内多次触发同一事件,则只会响应第一次或最后一次,其余忽略不计。这种方法同样能够降低因频繁调用造成的资源消耗[^2]。 ### 应用场景实例分析 对于页面 `resize` 事件而言,由于浏览器窗口大小调整过程中会持续不断地发出此信号,因此适合采用防抖机制来确保只针对最终状态作出反应,从而提高效率并节省计算成本[^5]。 另外,在搜索引擎自动补全功能里,每当用户键入新字符时都会发送 HTTP 请求获取匹配项列表。此时应用防抖策略可以在一定程度上缓解服务器压力,因为只有当输入稳定下来之后才会发起查询请求[^4]。 至于滚动监听或是鼠标移动这类交互行为,则更倾向于运用节流技术加以控制。比如每隔固定周期检查一次当前视口位置变化情况,进而决定是否加载更多内容或者更新某些视觉效果等[^3]。 ```javascript // 防抖函数示例代码 export function debounce(fn, delay) { let timer; return function(...args){ const context = this; clearTimeout(timer); timer = setTimeout(() => fn.apply(context, args), delay); } } ``` ```javascript // 节流函数基于时间戳的方式实现 function throttleByTimestamp(func, wait) { let previous = 0; return function (...args) { const now = new Date().getTime(); if (now - previous > wait) { func.apply(this, args); previous = now; } }; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值