A closure is a function that remembers variables from its outer scope even after the outer function has finished running.
Closures let functions "remember" things from where they were created.
function outer() {
let message = "Hello"; // Outer variable
function inner() {
console.log(message); // Inner function remembers 'message'
}
return inner;
}
const myFunction = outer();
myFunction(); // "Hello" - still remembers the message!function createCounter() {
let count = 0; // This variable gets "remembered"
return function() {
count = count + 1;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3function createGreeter(greeting) {
return function(name) {
return `${greeting}, ${name}!`;
};
}
const sayHello = createGreeter("Hello");
const sayHi = createGreeter("Hi");
console.log(sayHello("John")); // "Hello, John!"
console.log(sayHi("Sarah")); // "Hi, Sarah!"function createPrivateCounter() {
let privateCount = 0;
return {
increment: function() {
privateCount++;
return privateCount;
},
getCount: function() {
return privateCount;
}
};
}
const counter = createPrivateCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.getCount()); // 2
// privateCount is not accessible from outsidefunction createMultiplier(multiplyBy) {
return function(number) {
return number * multiplyBy;
};
}
const double = createMultiplier(2);
const triple = createMultiplier(3);
console.log(double(5)); // 10
console.log(triple(5)); // 15function createIdGenerator() {
let id = 0;
return function() {
id++;
return id;
};
}
const generateId = createIdGenerator();
console.log(generateId()); // 1
console.log(generateId()); // 2
console.log(generateId()); // 3function outer(x) {
let y = 10; // Gets remembered
function inner(z) {
return x + y + z; // Can access x, y, and z
}
return inner;
}
const myFunc = outer(5); // x=5, y=10 get remembered
console.log(myFunc(3)); // 5 + 10 + 3 = 18function createClosures() {
let value = 0;
const increment = function() {
value++;
return value;
};
const decrement = function() {
value--;
return value;
};
return { increment, decrement };
}
const { increment, decrement } = createClosures();
console.log(increment()); // 1
console.log(increment()); // 2
console.log(decrement()); // 1
// Both functions share the same 'value' variable- Functions that remember their creation environment
- Can access variables from outer scopes
- Keep variables alive after outer function finishes
- Memory: Closures remember variables
- Privacy: Can create private variables
- Persistence: Variables stay alive between function calls
- Flexibility: Can create specialized functions
If a function accesses variables from outside its own scope, it's a closure.
// Counter closure
const counter = createCounter();
counter(); // 1
counter(); // 2
// Greeter closure
const greet = createGreeter("Hello");
greet("John"); // "Hello, John!"
// Multiplier closure
const double = createMultiplier(2);
double(5); // 10- Create functions with "memory"
- Keep variables private
- Build specialized utility functions
- Maintain state between function calls