Closures in JavaScript
Tags: javascript, webdev, beginners, programming
Published: 2022-12-29 07:18:57

Closures are an important concept in JavaScript that allows developers to create functions that have access to variables and functions that are defined outside of their scope. Closures are often used to create private variables and functions, as well as to create functions with a fixed scope that can be passed around and executed in different contexts.

In JavaScript, a closure is created when a function is defined inside of another function. When the inner function is executed, it has access to the variables and functions that are defined in the outer function, even if the outer function has already returned. This is because the inner function retains a reference to the environment in which it was created, which is known as the closure.

<img width="100%" style="width:100%" src="https://media.giphy.com/media/eMsCxr6w35vjfI4zl5/giphy.gif">

To understand how closures work in JavaScript, it's helpful to consider an example. Let's say we have a function called counter that takes a number as an argument and returns a function that increments that number by one each time it is called:

```
function counter(n) {
  return function() {
    return ++n;
  }
}
```

If we call the counter function with the argument 10, it will return a function that increments the number 10 each time it is called. To see how this works, we can create a new variable inc that stores the returned function and then call it a few times:


```
const inc = counter(10);
console.log(inc()); // 11
console.log(inc()); // 12
console.log(inc()); // 13
```

<img width="100%" style="width:100%" src="https://media.giphy.com/media/3o7btPCcdNniyf0ArS/giphy.gif">

As we can see, each time we call the inc function, it increments the number 10 by one. This is possible because the inc function has a reference to the environment in which it was created, which includes the variable n.

In addition to creating private variables and functions, closures can also be used to create functions with a fixed scope. For example, let's say we have a function that takes an array of numbers as an argument and returns a function that calculates the average of those numbers:

```
function average(numbers) {
  let sum = 0;
  for (const number of numbers) {
    sum += number;
  }
  const avg = sum / numbers.length;

  return function() {
    return avg;
  }
}
```

If we call the average function with an array of numbers, it will return a function that calculates the average of those numbers. For example:

```
const avg = average([10, 20, 30]);
console.log(avg()); // 20
```

By returning a function that calculates the average of the numbers, we can use the avg function in different contexts and be sure that it will always return the correct result. This is because the avg function has a fixed scope that includes the variables sum and avg, which are defined in the outer function.

Closures are an important concept in JavaScript that allow developers to create functions with a fixed scope and access to variables and functions that are defined outside of their scope. Whether you're using closures to create private variables and functions or to create functions with a fixed scope, they can be a powerful tool for organizing and optimizing your code.