防抖(停止后的最后一次),节流(控制频率)

46 阅读2分钟

防抖(Debouncing)和节流(Throttling)是两种用于控制函数执行频率的技术,它们在性能优化和事件处理中非常有用,尤其是在处理诸如窗口调整大小、滚动、连续按键等频繁触发的事件时。尽管它们的目的相似,但实现机制和使用场景有所不同。

防抖(Debouncing)

  • 目的:确保函数在指定的时间间隔结束后才执行一次,不管在这个间隔内触发了多少次事件。
  • 适用场景:适用于那些不需要立即响应,但需要在一系列快速操作结束后才执行一次的场景。例如,搜索框输入、窗口调整大小结束后执行布局调整等。
  • 工作原理:在事件触发后,开始计时,如果在指定的时间间隔内再次触发事件,则重置计时器。只有当最后一次事件触发后指定的时间间隔内没有再次触发事件时,函数才会执行。
function debounce(func, wait) { 
  let timeout; 
  return function() { 
   const context = this; 
   const args = arguments; 
   clearTimeout(timeout); 
   timeout = setTimeout(function() { 
    func.apply(context, args); 
    }, wait); 
   }; 
 } 

节流(Throttling)

  • 目的:确保函数在指定的时间间隔内最多只执行一次,不管在这个间隔内触发了多少次事件。
  • 适用场景:适用于那些需要持续响应,但不希望响应过于频繁的场景。例如,滚动事件、连续按键、实时搜索建议等。
  • 工作原理:在事件触发后,记录这次触发的时间,并在指定的时间间隔内忽略后续的所有触发。只有当时间间隔过去后,才会允许下一次事件触发函数。
function  Throttling(func, wait) { 
  let isThrottling = false; 
  return function() { 
   const context = this; 
   const args = arguments; 
   if(!isThrottling) {
   func.apply(context,args)
   isThrottling = true
    setTimeout(function() { 
    isThrottling = false 
    }, wait); 
   }
   timeout = setTimeout(function() { 
    func.apply(context, args); 
    }, wait); 
   }; 
 } 

区别

  1. 执行时机:防抖是延迟执行,直到停止触发事件一段时间后才执行一次;节流是保证在指定的时间间隔内至少执行一次。
  2. 触发频率:防抖可以认为是“合并”了多次触发,最终只执行一次;节流则是限制了触发频率,使得在时间间隔内多次触发只响应一次。
  3. 适用情况:防抖适用于最后一次操作最重要,而之前的操作可以忽略的情况;节流适用于需要持续响应,但不希望响应过于密集的情况。

理解这两种技术的区别对于选择合适的优化策略至关重要。