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