JS Guide
HomeQuestionsSearchResources
Search

Built for developers preparing for JavaScript, React & TypeScript interviews.

ResourcesQuestionsSupport
HomeQuestionsSearchProgress
HomeQuestionsperformance
Prev
performance
mid
optimization

What is the difference between debouncing and throttling?

debounce
throttle
performance
events
optimization
Quick Answer

Debouncing waits until activity stops before executing (e.g., search after user stops typing). Throttling limits execution to once per interval during continuous activity (e.g., scroll events). Both reduce excessive function calls.

Detailed Explanation

Debouncing:

  • Waits for pause in activity
  • Resets timer on each call
  • Executes once after delay
  • Use for: Search inputs, resize end

Throttling:

  • Executes at regular intervals
  • During continuous activity
  • Maximum once per interval
  • Use for: Scroll, mouse move

Key Difference:

  • Debounce: "Wait until they stop"
  • Throttle: "Do it, but not too often"

Code Examples

Debounce implementation and usage
// Debounce implementation
function debounce(func, wait) {
  let timeoutId;
  
  return function executedFunction(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => func.apply(this, args), wait);
  };
}

// Usage: Search input
const searchInput = document.getElementById('search');

const search = debounce((query) => {
  console.log('Searching for:', query);
  fetch(`/api/search?q=${query}`);
}, 300);

searchInput.addEventListener('input', (e) => {
  search(e.target.value);
});
// User types: h-e-l-l-o
// Only ONE search after user stops (300ms pause)

// React hook version
function useDebounce(value, delay) {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const timer = setTimeout(() => setDebouncedValue(value), delay);
    return () => clearTimeout(timer);
  }, [value, delay]);

  return debouncedValue;
}

// Usage in React
function Search() {
  const [query, setQuery] = useState('');
  const debouncedQuery = useDebounce(query, 300);

  useEffect(() => {
    if (debouncedQuery) {
      fetchResults(debouncedQuery);
    }
  }, [debouncedQuery]);

  return <input value={query} onChange={e => setQuery(e.target.value)} />;
}

Resources

CSS Tricks - Debouncing and Throttling

article

Related Questions

What are common React performance optimization techniques?

mid
react
Previous
What is the difference between SSR, SSG, and CSR?