防抖和节流是什么
本质上是优化高频率执行代码的一种手段
如:浏览器的resize.scroll.keypress.mousemove等事件在触发时.会不断的调用绑定在事件上的回调函数.极大的浪费资源.降低前端性能.
为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用throttle(防抖)和debounce(节流)的方式来减少函数调用.
-
总结 :防抖,节流就是用来减少函数的调用.
定义
- 节流:n秒内只运行一次.若在n秒内重复触发,只有第一次生效. 以游戏为例.你放一次技能是有冷却时间的.只有当时间到了你才可以重新放技能.这个就叫做节流.
- 防抖:n秒后在执行该事件.诺在n秒内被重复触发,则重新计时. 打个比方.在万moba游戏的时候我们都要B键回城.这个时候我们多次按下B键那么,进度条就会重新开始计时.这就是防抖.
区别
相同点:
-
都可以通过使用计
setTimeout来实现 -
目的都是降低回调执行频率.节省计算资源 不同点:
-
函数防抖,在一段连续操作结束后,处理回调.利用
clearTimeout和setTimeout实现.函数节流,在一段连续操作中,每一段时间执行一次,频率较高的事件中来使用提高性能 -
函数防抖关注一定时间连续触发的事件,只在最后执行一次,而函数节流一段时间内只执行一次 应用场景 防抖在连续的事件,只需触发一次回调的场景有:
-
搜索框搜索输入。只需用户最后一次输入完,再发送请求
-
手机号、邮箱验证输入检测
-
窗口大小
resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
节流在间隔一段时间执行一次回调的场景有:
- 滚动加载,加载更多或滚到底部监听
- 搜索框,搜索联想功能