节流

节流相当于游戏里的冷却时间,执行一次后,n秒内不能执行第二次

  1. function throttle(fn, delay){
  2. let canUse = true
  3. return function(){
  4. if(canUse){
  5. fn.apply(this, arguments)
  6. canUse = false
  7. setTimeout(()=>canUse = true, delay)
  8. }
  9. }
  10. }
  11. const throttled = throttle(()=>console.log('hi'))
  12. throttled()
  13. throttled() // 不会执行

防抖

对于频繁触发的事件,n秒后才执行,如果上一次触发的事件还未执行,这次又触发了,则以这次的时间为准,n秒后执行

  1. function debounce(fn, delay){
  2. let timerId = null
  3. return function(){
  4. const context = this
  5. if(timerId){window.clearTimeout(timerId)}
  6. timerId = setTimeout(()=>{
  7. fn.apply(context, arguments)
  8. timerId = null
  9. }, delay)
  10. }
  11. }
  12. const debounced = debounce(()=>console.log('hi'))
  13. debounced() // 不会执行
  14. debounced()

函数节流和函数防抖都是优化高频率执行js代码的一种手段,提升用户体验,减少资源浪费。