β 1. What is a Closure?
A closure is created when a function:
- Accesses variables from an outer scope, even after that scope has finished executing.
π‘ In simple terms:
A function remembers the variables around it, even if itβs run later.
π 2. Basic Closure Example
jsCopyEditfunction outer() {
const name = "Alice";
function inner() {
console.log("Hello, " + name); // β
Has access to `name`
}
return inner;
}
const greet = outer(); // outer() runs and returns `inner`
greet(); // Hello, Alice
Even though outer()
has finished, inner()
still has access to name
. Thatβs a closure.
π 3. Closures Keep Private Data
jsCopyEditfunction createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
β
count
is private β only the returned function can access it.
π 4. Closures in Loops (Classic Mistake)
Without closure:
jsCopyEditfor (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// Output: 3, 3, 3 (not 0, 1, 2)
β
With closure using let
(block scope):
jsCopyEditfor (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// Output: 0, 1, 2
π 5. Real-World Use: Encapsulation
jsCopyEditfunction bankAccount(initialBalance) {
let balance = initialBalance;
return {
deposit(amount) {
balance += amount;
},
withdraw(amount) {
balance -= amount;
},
getBalance() {
return balance;
}
};
}
const myAccount = bankAccount(100);
myAccount.deposit(50);
console.log(myAccount.getBalance()); // 150
β
balance
is not accessible from outside β only through methods.
π 6. Closures in Event Listeners
jsCopyEditfunction setupButton(label) {
let count = 0;
return function clickHandler() {
count++;
console.log(`${label} clicked ${count} times`);
};
}
const saveHandler = setupButton("Save");
document.getElementById("saveBtn").addEventListener("click", saveHandler);
π§ Summary Table
Feature | Description |
---|---|
Closure | Inner function accesses outer function variables |
Data Privacy | Variables remain hidden from outside scope |
Persistent Memory | Data sticks around after outer function runs |
Common Use Cases | Counters, modules, callbacks, event handlers |
π§ͺ Practice Challenges
- Write a
secretHolder(secret)
function that returnsgetSecret()
andsetSecret(newSecret)
. - Create a
makeMultiplier(factor)
that returns a function to multiply any number by that factor.
π Bonus: Visualizing Closure
jsCopyEditfunction outer() {
let message = "I'm inside outer";
return function inner() {
console.log(message);
};
}
const fn = outer(); // outer() returns inner
fn(); // logs: I'm inside outer
Even though outer()
is done, inner()
remembers message
.
Would you like this as:
- π A printable PDF?
- π» A live JSFiddle with interactive closure examples?
- π§ A mini quiz to test your understanding?