以下场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃:
window
对象的resize
、scroll
事件拖拽时的
mousemove
事件射击游戏中的
mousedown
、keydown
事件文字输入、自动完成的
keyup
事件
所以为了解决这些问题我们就可以引入函数节流(Throttle
) & 函数防抖(Debounce
)的概念,同时也是闭包的一个用途
函数节流(Throttle
)
函数节流旨在固定函数的执行速率,在一个事件周期内只可以被触发一次。
1 | function throttle(fn, delay){ |
函数防抖(Debounce
)
Debounce
其实是从机械开关和继电器的“去弹跳”衍生而来。基本思路是讲多个信号合并为一个信号
JavaScript中
Debounce
函数所做的事情是强制一个函数再某个连续的时间段内只执行一次,哪怕他本会被调用多次
1 | function debounce(fn, threshhold){ |
举个实践中的例子:通过用户的输入实时向服务器发送ajax请求获取数据
1 | $(selector).on('keyup', debounce(function(e){ |