js函数防抖和节流的区别
函数防抖:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。例如游戏角色放技能被打断了,然后重新释放技能,重新计算释放时间。
函数节流:高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。就相当于游戏角色有霸体释放技能无法被打断。3秒一个技能,不管中间发生了什么。
防抖函数
1 2 3 4 5 6 7 8 9 10 11
| function debounce(fn, delay) { var timer = null; return function() { clearTimeout(timer); var that = this, args = arguments; timer = setTimeout(function() { fn.apply(that, args) }, delay) } }
|
一般用于input或者srcoll事件上。输入框搜索防止输入过快向后端发很多个请求,就是限制多长时间才能执行一次。重复操作会重新计算时间。
节流函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function throttle(fn, delay) { var timer = null, flag = false; return function() { if (flag) { return } flag = true var that = this, args = arguments; timer = setTimeout(function() { clearTimeout(timer); flag = false fn.apply(that, args) }, delay) } }
|
一般用于mousemove或者resize事件上,避免触发N次事件,限制多少毫秒内只能执行一次,提高性能。
demo
https://jsbin.com/budazewure/edit?html,console,output