Script Valley
JavaScript: The Complete Language
Functions and ScopeLesson 2.3

Closures in JavaScript explained with real examples

closure definition, persistent scope, factory functions, private variables, closure in loops, practical use cases, memory implications

What Is a Closure

A closure is a function that retains access to variables from its outer scope even after that outer function has returned. This happens automatically in JavaScript — every function closes over its environment.

Basic Closure

function makeCounter() {
  let count = 0; // lives in the closure

  return function() {
    count += 1;
    return count;
  };
}

const counter = makeCounter();
counter(); // 1
counter(); // 2
counter(); // 3

// count is inaccessible from outside — private

Factory Function Pattern

Closures power the factory pattern — a function that produces configured functions.

function multiplier(factor) {
  return (n) => n * factor; // closes over factor
}

const double = multiplier(2);
const triple = multiplier(3);

double(5); // 10
triple(5); // 15

Common Pitfall: Closures in Loops

// Bug with var
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // prints 3, 3, 3
}

// Fix with let
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // prints 0, 1, 2
}

let creates a new binding per iteration; var shares one. This is a real-world reason to prefer let.

Up next

Default parameters, rest parameters, and the spread operator

Sign in to track progress