- A closure is a function that “remembers” the variables from its outer scope, even after the outer function has finished running.
function outer() {
const name = 'Alice';
function inner() {
console.log(name);
}
return inner;
}
const greet = outer();
greet();
1. Data Privacy (private variables)
- Use closures to keep variables hidden from the outside scope.
function counter() {
let count = 0;
return function () {
count++;
return count;
};
}
const increment = counter();
increment();
increment();
2. Function Factories
- Return a function pre-configured with a specific value.
function multiplyBy(x) {
return function (y) {
return x * y;
};
}
const double = multiplyBy(2);
double(5);
3. Event Handlers in Loops (using `let` or closures)
let
is block-scoped, so it creates a fresh variable each iteration.
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
var
is function-scoped, so it does not preserve the loop value in closures.
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
Fix It with an IIFE (Immediately Invoked Function Expression)
- Wrap each iteration in a closure using an IIFE to capture
i
.
for (var i = 0; i < 3; i++) {
(function(i) {
setTimeout(() => {
console.log(i);
}, 1000);
})(i);
}