JavaScript Closures Explained: A Developer’s Guide
# JavaScript Closures — The Complete Step-by-Step Guide
Closures are one of the most **powerful** and sometimes intimidating concepts in JavaScript.
This handbook breaks them down into **clear, practical examples** so that by the end you can confidently say:
> *"I’m no longer afraid of closures!"*
---
## 📚 Table of Contents
- [Prerequisites](#prerequisites)
- [Project Setup](#project-setup)
- [Create Folder Structure](#create-folder-structure)
- [Create HTML File](#create-html-file)
- [Create Script Files](#create-script-files)
- [Script Tag Management](#script-tag-management)
- [Run the Project](#run-the-project)
- [Functions & Parameters](#functions--parameters)
- [Accessing Variables Without Parameters](#accessing-variables-without-parameters)
- [Scope & Lexical Scoping](#scope--lexical-scoping)
- [What is a Closure?](#what-is-a-closure)
- [Functions as Objects](#functions-as-objects)
- [Parent–Child Function Relationship](#parentchild-function-relationship)
- [Nested Functions](#nested-functions)
- [Creating Private Properties](#creating-private-properties)
- [Closure Mechanics & Decisions](#closure-mechanics--decisions)
- [Closures in Asynchronous Code](#closures-in-asynchronous-code)
- [API Requests with Closures](#api-requests-with-closures)
- [Closures in Loops](#closures-in-loops)
- [var Loop Problem & Fix](#var-loop-problem--fix)
- [Summary & Interview Tips](#summary--interview-tips)
---
## Prerequisites
You should already be comfortable with:
- Basic JavaScript (ES6 syntax)
- Browser DevTools
- Asynchronous concepts (Promises, callbacks)
- Terminal basics
- A text editor such as VS Code (with **Live Server**)
---
## Project Setup
Before diving into closures, we’ll set up a small test project to keep examples organized.
### Create Folder Structuremkdir closure
cd closure
### Create HTML Filetouch index.html
Add:Closure Tutorial
**Why multiple script tags?**
Keeps each example isolated, avoiding mixed console output.
### Create Script Filesmkdir script
cd script
touch example-1.js example-2.js example-3.js example-4.js example-5.js example-6.js example-7.js
### Script Tag Management
Uncomment **only** the `` tag for the file you want to test.
Example:</code></pre><p><script src="./script/example-3.js">
### Run the Project
Start **Live Server** in VS Code → [http://127.0.0.1:5500/closure/index.html](http://127.0.0.1:5500/closure/index.html)
---
## Functions & Parameters
`example-1.js`:function sum(num1, num2) { return num1 + num2;}console.log(sum(2, 3)); // 5
**Key idea:** Passing variables through parameters.
---
## Accessing Variables Without Parameters
You can remove parameters and still access variables from outer scope:
var num1 = 2;var num2 = 3;function sum() { return num1 + num2;}console.log(sum()); // 5
This works because **functions can read from their parent scope**.
---
## Scope & Lexical Scoping
- **Scope:** Where variables are accessible.
- **Lexical Scoping:** Determined by *where* code is written — inner functions access outer variables.
---
## What is a Closure?
A **closure** = `function` + `lexical environment` (surrounding variables it remembers).
It allows a function to keep **references** to outer variables long after the outer scope finishes executing.
---
## Functions as Objects
Functions in JavaScript are **first-class objects** — they can be stored in variables, passed around, and inspected.
console.dir(sum); // shows [[Scopes]] in DevTools
---
## Parent–Child Function Relationship
An inner function automatically inherits variables from the outer function.
---
## Nested Functions
function outer() { let count = 0; function inner() { count++; console.log(count); } return inner;}const increment = outer();increment(); // 1increment(); // 2
Here, `inner` *closes over* `count`.
---
## Creating Private Properties
function bankAccount(initialBalance) { let balance = initialBalance; return { getBalance: () => balance, deposit: (amt) => balance += amt };}const account = bankAccount(100);account.deposit(50);console.log(account.getBalance()); // 150
---
## Closure Mechanics & Decisions
JavaScript includes **only** the outer variables that are actually used inside a function in its closure.
Global variables are **not** included in closures.
---
## Closures in Asynchronous Code
Even with delays, closures remember state:
function asyncExample() { let a = 20; setTimeout(() => console.log(a), 3000);}asyncExample();
---
## API Requests with Closures
function apiFunction(url) { fetch(url).then(res => { console.log(res); console.log(url); // preserved by closure });}apiFunction("https://jsonplaceholder.typicode.com/todos/1");
---
## Closures in Loops
for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1000 * i);}// 0, 1, 2
Using `var` here would print `3` three times — because all callbacks share the same `i`.
---
## var Loop Problem & Fix
**Fix:** Use an IIFE to capture a copy:for (var i = 0; i < 3; i++) { (function(i) { setTimeout(() => console.log(i), 1000 * i); })(i);}
---
## Summary & Interview Tips
**Closure definition:**
> A closure is a function that retains access to variables from its outer scope after that scope has finished executing.
### Key Points:
- Functions retain **references**, not copies, of outer variables.
- Closures can be synchronous or asynchronous.
- Useful for private state, currying, factory functions.
- Beware `var` vs `let` differences inside loops.
---
**Pro Tip for Content Creators:**
If you plan to turn coding tutorials like this into multi-platform educational content, consider using [AiToEarn](https://aitoearn.ai/) — an open-source platform that enables AI-assisted generation, publishing, and monetization across **Douyin, Kwai, WeChat, Bilibili, Facebook, Instagram, LinkedIn, YouTube, Pinterest, X**, and more, all from one workflow.