By
welkin
Updated:
什么是防抖和节流
举个例子,比如在进行百度搜索时,是等待用户时输入完成之后,才会在搜索框下显示,搜索内容,而不是当输入未完成的状态下进行搜索(这样会消耗大量的服务器资源)。
函数防抖
规定函数至少间隔多久执行
- 函数执行过一次后,在规定时间内不能再执行,否则推迟函数执行
- 下一次函数调用时,将清楚上一次定时器,并且使用setTimeout 重新计时
利用时间间隔,当事件触发的时间间隔很短的时候,就认为用户操作还处于未完成状态,推迟事件处理程序的执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <input type="text" id="input"> <script> function debounce(func, wait) { let timeout; return function() { clearTimeout(timeout); timeout = setTimeout(func, wait); }; } function realFunc(){ console.log("Success"); }
const input = document.getElementById('input'); input.addEventListener('keydown',debounce(realFunc,500)); </script>
|
函数节流
规定函数在某时间段内最多执行一次
- 函数在规定时间内最多执行一次
- 下一次函数调用将清楚上一次的定时器
- 若函数执行的时间间隔 <= 规定时间间隔,则使用setTimeout 在规定时间后再执行
- 若函数执行时间间隔 > 规定时间间隔,则执行函数,并重新定时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <script> function throttle(func,interval){ let timeout; let startTime = new Date(); return function (){ clearTimeout(timeout); let curTime = new Date(); if(curTime - startTime <= interval){ timeout = setTimeout(()=>{ func(); },interval) } else { startTime = curTime; func() } } } function realFunc(){ console.log('success') } window.addEventListener('scroll',throttle(realFunc,100)); </script>
|
函数防抖和函数节流的对比
不管是函数节流还是函数防抖,减少的都是事件处理程序的调用频率,而不是时间的调用频率
何时使用函数防抖,何时使用函数节流?
- 当我们只需要处理最后一次触发事件时,用函数防抖。(例如:窗口大小变化,并不需要计算中间变化的过程,只需要窗口大小改变完成后的值)
- 当事件触发过于频繁,我们需要限制事件处理程序的调用频率时,用函数节流
传递事件对象
当我们使用节流函数或者防抖函数封装事件处理程序时,需要注意两个问题:
参考文献
参考文献