Dana's dev blog

Debounce Function in JavaScript

Published on
Published on
/2 mins read/---

Debounce Function in JavaScript

A debounce function delays the execution of a function until after a specified time has passed since it was last invoked.

Usage

import { debounce } from './debounce'
 
// Debounce a search function
const debouncedSearch = debounce((query) => {
  console.log('Searching for:', query)
  // Perform search API call
}, 300)
 
// Use in an input handler
input.addEventListener('input', (e) => {
  debouncedSearch(e.target.value)
})

Implementation

function debounce(func, wait, immediate = false) {
  let timeout
  
  return function executedFunction(...args) {
    const later = () => {
      timeout = null
      if (!immediate) func(...args)
    }
    
    const callNow = immediate && !timeout
    
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
    
    if (callNow) func(...args)
  }
}

Advanced Usage with TypeScript

function debounce<T extends (...args: any[]) => any>(
  func: T,
  wait: number,
  immediate = false
): (...args: Parameters<T>) => void {
  let timeout: NodeJS.Timeout | null = null
  
  return function executedFunction(...args: Parameters<T>) {
    const later = () => {
      timeout = null
      if (!immediate) func(...args)
    }
    
    const callNow = immediate && !timeout
    
    if (timeout) clearTimeout(timeout)
    timeout = setTimeout(later, wait)
    
    if (callNow) func(...args)
  }
}

Use Cases

  • Search input fields
  • Window resize handlers
  • API call optimization
  • Button click prevention
  • Scroll event handlers