- A closure is a function that โremembersโ variables from its outer scope
- It retains access even after the outer function finishes
- Enables powerful patterns like private data or dynamic functions
function outer() {
const name = 'Alice';
function inner() {
console.log(name);
}
return inner;
}
const greet = outer();
greet();
- Keep variables private inside closures
- Great for encapsulation
- Avoids polluting global scope
function counter() {
let count = 0;
return function () {
count++;
return count;
};
}
const increment = counter();
increment();
increment();
- Create functions preset with values
- Makes reusable logic cleaner
- Uses closure to โrememberโ a value
function multiplyBy(x) {
return function (y) {
return x * y;
};
}
const double = multiplyBy(2);
double(5);
let
creates a new block scope each loop iteration
- Works perfectly with closures
- Avoids unexpected results
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
var
is function-scoped โ no block scope
- All closures share the same
i
value
- Leads to incorrect results in async code
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
- IIFE = Immediately Invoked Function Expression
- Captures current
i
value in each iteration
- Safe way to use
var
with closures
for (var i = 0; i < 3; i++) {
(function(i) {
setTimeout(() => {
console.log(i);
}, 1000);
})(i);
}