- 防抖,当一次事件发生后,事件处理器要等一定阈值的时间,如果这段时间过去后 再也没有 事件发生,就处理最后一次发生的事件。假设还差 0.01 秒就到达指定时间,这时又来了一个事件,那么之前的等待作废,需要重新再等待指定时间
function debounce(fn, wait=50, immediate=false) { let timer; return function() { if(immediate) { fn.apply(this, arguments) } if(timer) clearTimeout(timer) timer = setTimeout(() => { fn.apply(this, arguments) }, wait) }}// 例子:滚动防抖function fn() { console.log('do something')}var _fn = debounce(fn, 1000);window.addEventListener('scroll', _fn);window.removeEventListener('scroll',_fn);
- 节流,事件在一个管道中传输,加上这个节流阀以后,事件的流速就会减慢。实际上这个函数的作用就是如此,它可以将一个函数的调用频率限制在一定阈值内,例如 1s,那么 1s 内这个函数一定不会被调用两次
function throttle(fn, wait=50) { let prev = new Date().getTime(); return function() { const now = new Date().getTime(); if (now - prev > wait) { prev = now; fn.apply(this, arguments); } }}
- 通过参数切换防抖和节流
const throttle = function(fn, delay=50, isDebounce=false) { let timer; let prev = new Date().getTime(); return function(...args) { if(isDebounce) { if(timer) clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, delay) } else { const now = new Date().getTime(); if(now - prev > delay) { prev = now; fn.apply(this, args); } } }}