What is a Closure?
A closure is a function that "remembers" its lexical scope even when the function is executed outside that scope. In simpler terms: a closure gives you access to an outer function's scope from an inner function.
💡 Key insight
Every function in JavaScript is a closure. Functions remember the variables from where they were created, not where they're called.
Basic Closure Example
function outer() {
let message = "Hello from outer!";
function inner() {
console.log(message); // inner remembers 'message'
}
return inner;
}
let fn = outer();
fn(); // "Hello from outer!"
Practical Use Cases
- Data privacy — create private variables
- Function factories — create customized functions
- Event handlers — preserve state in callbacks
Private Variables with Closures
function createCounter() {
let count = 0; // private variable
return {
increment: function() { count++; },
decrement: function() { count--; },
getCount: function() { return count; }
};
}
let counter = createCounter();
counter.increment();
counter.increment();
console.log(counter.getCount()); // 2
// counter.count is not accessible
Common Mistakes
- Creating closures in loops without capturing values correctly (using
letfixes this) - Memory leaks from closures holding references to large objects
- Assuming closures copy values (they reference them)
Quick Quiz
1. What is a closure?
2. Which is a use case for closures?
3. What does a function factory do?
Summary
- A closure is a function that remembers its lexical scope
- Every function in JavaScript creates a closure
- Closures enable data privacy and function factories
- Use closures to create private variables
- Be careful with closures in loops (use
let)
