概念
函数防抖(debounce)
当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间
函数节流(throttle)
预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期
函数节流(throttle)与 函数防抖(debounce)都是为了限制函数的执行频次,
以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。
常用的场景有:
- window对象的resize、scroll事件
- 拖拽时的mousemove事件
- 文字输入、自动完成的keyup事件
话句话来说这两者的区别就是,是否在动作持续的过程中,重新计算过期时间。
防抖 只会在动作“真正结束”后才触发函数,节流 会在超过预定时候后就会触发函数
源码
函数防抖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function debounce(fn, wait) { var timer = null; return function () { var context = this var args = arguments if (timer) { clearTimeout(timer); timer = null; } timer = setTimeout(function () { fn.apply(context, args) }, wait) } }
var fn = function () { console.log('boom') }
setInterval(debounce(fn,500),1000)
setInterval(debounce(fn,2000),1000)
|
函数节流:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function throttle(fn, gapTime) { let _lastTime = null;
return function () { let _nowTime = + new Date() if (_nowTime - _lastTime > gapTime || !_lastTime) { fn(); _lastTime = _nowTime } } }
let fn = ()=>{ console.log('boom') }
setInterval(throttle(fn,1000),10)
|
参考
- 函数节流与函数防抖
- 轻松理解JS函数节流和函数防抖