Throttling and Debouncing in JavaScript and React

Throttling and Debouncing in JavaScript and React

Sep 5, 2023·

3 min read

In the world of front-end development, you often encounter situations where you need to optimize user interactions, especially those involving event listeners like scroll, resize, and input. This is where throttling and debouncing come into play. In this comprehensive guide, we'll explore what throttling and debouncing are, why they're essential, and how to implement them in JavaScript and React.

Understanding Throttling and Debouncing

Throttling and debouncing are techniques used to control the frequency of a function's execution based on specific conditions. They are beneficial for improving performance and avoiding performance bottlenecks in your applications.


Throttling limits the number of times a function can be called in a given timeframe. For instance, if you have a scroll event listener that triggers some heavy computations, throttling ensures the event listener fires only once every n milliseconds, regardless of how many times the event occurs within that period.


Debouncing is different from throttling in that it postpones the execution of a function until a specific amount of time passes since the last time the function was invoked. It's like saying, "Execute this function only if there's a pause of n milliseconds in between."

Why Throttling and Debouncing Matter

Consider scenarios where you want to handle user input, such as filtering a list as a user types in a search box or executing an AJAX request while a user scrolls through an infinite-scrolling page. Without throttling or debouncing, these events can fire rapidly, leading to performance issues and excessive resource consumption.

Implementing Throttling and Debouncing

JavaScript Implementation


function throttle(func, delay = 1000) {
      let inThrottle = false;
      return (...args) => {
        if (inThrottle) return;
        inThrottle = true;
        setTimeout(() => {
              inThrottle = false;
        }, delay);

const throttledFn = throttle(() => {
  // Your code to execute
}, 1000);

window.addEventListener('scroll', throttledFn);


function debounce(func, delay) {
  let timeout;
  return (...args) => {
    timeout = setTimeout(() => func.apply(context, args), delay);

const debouncedFn = debounce(() => {
  // Your code to execute
}, 1000);

window.addEventListener('input', debouncedFn);

React Implementation

Now, let's see how to use throttling and debouncing in a React component.

import React, { useState } from 'react';

function App() {
  const [inputValue, setInputValue] = useState('');

  // Throttle the input handler
  const throttledInputHandler = throttle((value) => {
    // Your code to execute
  }, 1000);

  // Debounce the input handler
  const debouncedInputHandler = debounce((value) => {
    // Your code to execute
  }, 1000);

  const handleInputChange = (e) => {
    const { value } =;

    // Call the throttled or debounced function
    // or


  return (
        placeholder="Type something..."

export default App;

In this React component, we've implemented both throttling and debouncing for the input field. Depending on your use case, you can choose which one suits your needs better.


Throttling and debouncing are invaluable techniques in JavaScript and React development. They help you control the frequency of function execution, ultimately leading to better performance and a smoother user experience. By understanding when and how to use throttling and debouncing, you can optimize your applications and ensure they run efficiently, even in situations with heavy user interactions

Did you find this article valuable?

Support sivalaxman by becoming a sponsor. Any amount is appreciated!