Closure
A closure is a function that retains access to its outer scope even after the outer function has finished executing.
Basic Example
function outer() {
const message = 'Hello'
function inner() {
console.log(message) // accesses outer variable
}
return inner
}
const sayHello = outer()
sayHello() // 'Hello' (outer() has already returned!)
Counter with Closure
function makeCounter() {
let count = 0
return {
increment() { count++ },
decrement() { count-- },
getCount() { return count }
}
}
const counter = makeCounter()
counter.increment()
counter.increment()
counter.increment()
counter.decrement()
console.log(counter.getCount()) // 2
Currying
function multiply(a) {
return function(b) {
return a * b
}
}
const double = multiply(2)
const triple = multiply(3)
double(5) // 10
triple(5) // 15
Practical Use: Private Variables
function createPerson(name) {
let _age = 0 // private
return {
getName: () => name,
getAge: () => _age,
birthday: () => { _age++ }
}
}
const alice = createPerson('Alice')
alice.birthday()
alice.birthday()
console.log(alice.getAge()) // 2