防抖和节流

80 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天juejin.cn/post/712312…

在进行窗口的resize、scroll事件,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体坛非常糟糕,此时我们可以次啊用debounce(防抖和)throttle(节流)的方式来减少调用频率,同时又不影响实际效果。

防抖

函数防抖:当持续触发事件时,一定时间段内内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时.

防抖.png

节流

前端开发过程中,有一些事件或者函数,会被频繁地触发(短时间按内多次触发),最常见的例如,onresize,scroll,.mousemove,mousehover等,这些事件的触发频率很高,不做限制的话,有可能一秒之内执行几十次、几百次,如果在这些函数内部执行了其他函数,尤其是执行了操作DOM的函数(浏览器操作DOM是很耗费性能的),那不仅会造成计算机资源的浪费,还会降低程序运行速度,甚至造成浏览器卡死、崩溃。这种问题显然是致命的。除此之外,重复的ajx调用不仅可能会造成请求数据的混乱,还会造成网络拥塞,占用服务器带宽,增加服务器压力,显然这个问题也是需要解决的。

节流.png

总结:

函数防抖:将几次操作合并为一次后进行操作,原理是维护一个定时器,规定在delay时间后触发函数,但是在delay时间内再次触发函数的话,就会取消之前的定时器而重新设置,这样一来,只有最后一次能触发。

函数节流:使得一定时间内只触发一次函数,原理是通过判断是否到达一定时间来触发函数。

区别:函数节流不管事件触发多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才出发一次函数。比如在页面的无线加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次ajax请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景就适合用节流技术来实现