js的防抖和节流

198 阅读2分钟

概念

函数防抖(debounce): 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。就是无论事件执行了多少次 都只会在最后一次等待多久执行一次

函数节流(throttle): 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。在固定的事件中只做一件事

函数节流(throttle) 与 函数防抖(debounce) 都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

为什么要防抖和节流

滚动事件的应用很频繁:图片懒加载、下滑自动加载数据、侧边浮动导航栏等。 在绑定scroll、resize事件时,但它发生的时候,它被触发的频率非常高,间隔很近。在日常开发的页面中,事件中涉及到的大量的位置计算、DOM操作、元素重绘等等这些都无法在下一个scroll事件出发前完成的情况下,浏览器会卡帧。

函数防抖(debounce)

D[G(GYF`%R{K]0BLB@81FVI.png

函数节流(throttle)

7Q03Q4XPBTPA%`6IPNQK0T2.png

总结

函数防抖:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。
函数节流:原理是判断是否达到一定的时间来触发事件。某个时间段内只能触发一次函数。
区别:防抖只会在最后一次事件后执行触发函数,节流不管事件多么的频繁,都会保证在规定时间段内触发事件函数。