惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
Vercel News
Vercel News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
The Cloudflare Blog
宝玉的分享
宝玉的分享
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Decoding Hoisting in JS
Annapoorani Kadhiravan · 2026-06-14 · via DEV Community

One of the most confusing concepts for JavaScript beginners is Hoisting. Many developers coming from languages like Java, C, or Python often wonder:

  • How can a function be called before it is declared?
  • Why does JavaScript print undefined instead of throwing an error?
  • Why do let and const behave differently from var?

To answer these questions, we need to understand how JavaScript executes code behind the scenes.


What is Hoisting?

Hoisting is JavaScript's behavior of allocating memory for variables and functions before executing the code.

In simple words:

JavaScript scans the entire program first, creates memory for variables and functions, and then starts executing the code line by line.

Because of this, some variables and functions can be accessed before they appear in the source code.


Does JavaScript Actually Move Code?

No.

Nothing physically moves to the top.

Hoisting is simply a conceptual way to explain JavaScript's internal execution process.


JavaScript Execution Phases

JavaScript executes code in two phases:

1. Memory Creation Phase

During this phase:

  • Variables declared using var are initialized with undefined.
  • Function declarations are stored completely in memory.
  • Variables declared using let and const are created but remain inaccessible.

2. Execution Phase

After memory allocation, JavaScript executes statements one by one.


Variable Hoisting with var

Consider:

console.log(x);

var x = 10;

Output

undefined

Many beginners expect:

10

but JavaScript internally behaves as:

var x;

console.log(x);

x = 10;

During memory creation:

x → undefined

During execution:

  1. Print undefined
  2. Assign 10 to x

Why Does It Print Undefined?

Because only the declaration:

var x;

is hoisted.

The assignment:

x = 10;

remains in its original place.


Variable Hoisting with let

console.log(age);

let age = 25;

Output

ReferenceError:
Cannot access 'age' before initialization


Variable Hoisting with const

console.log(pi);

const pi = 3.14;

Output

ReferenceError


What is Temporal Dead Zone (TDZ)?

Variables declared with let and const are hoisted but remain inside a region called the Temporal Dead Zone.

The TDZ starts from the beginning of the scope and ends when the variable is initialized.

Example:

console.log(a);

let a = 10;

Here:

TDZ begins
↓
console.log(a)
↓
ReferenceError
↓
let a = 10
↓
TDZ ends


Function Hoisting

Functions declared using function declarations are completely hoisted.

Example:

greet();

function greet()
{
    console.log("Hello");
}

Output

Hello

Internally:

function greet()
{
    console.log("Hello");
}

greet();


Why Are Functions Fully Hoisted?

JavaScript stores the entire function in memory during the memory creation phase.

Therefore, the function becomes available even before its declaration appears in the code.


Function Expression Hoisting

Consider:

greet();

var greet = function()
{
    console.log("Hello");
};

Output

TypeError: greet is not a function

Internally:

var greet;

greet();

greet = function()
{
    console.log("Hello");
};

At the time of function call:

greet = undefined

Thus:

undefined()

causes an error.


Arrow Function Hoisting

hello();

const hello = () => {
    console.log("Hi");
};

Output

ReferenceError

Since const variables remain inside the Temporal Dead Zone, the function cannot be accessed before initialization.


Hoisting Comparison Table

Declaration Type Hoisted Initial Value
var Yes undefined
let Yes TDZ
const Yes TDZ
Function Declaration Yes Entire Function
Function Expression Variable only undefined
Arrow Function Variable only TDZ

Hoisting vs Undefined

Many beginners confuse these two terms.

Hoisting

The process of allocating memory before execution.

Undefined

The default value assigned to variables declared using var.

Example:

console.log(num);

var num = 100;

Output:

undefined

because internally:

var num;

console.log(num);

num = 100;


Why Does JavaScript Use Hoisting?

JavaScript separates:

  1. Memory allocation
  2. Code execution

This design provides flexibility and supports features like recursion and function reuse.


Advantages of Hoisting

1. Allows Function Calls Before Declaration

greet();

function greet()
{
    console.log("Hello");
}

Output:

Hello


2. Supports Recursion

function factorial(n)
{
    if(n === 1)
        return 1;

    return n * factorial(n - 1);
}

Because the function already exists in memory, it can call itself.


3. Improves Code Organization

Example:

main();

function main()
{
    greet();
}

function greet()
{
    console.log("Welcome");
}

Functions can be organized logically without worrying about order.


Should We Rely on Hoisting?

Generally, No.

Although this works:

greet();

function greet()
{
    console.log("Hello");
}

it is better to write:

function greet()
{
    console.log("Hello");
}

greet();

This improves:

  • Readability
  • Maintainability
  • Debugging

Common Interview Questions

Is let hoisted?

Yes.

But it remains inside the Temporal Dead Zone.


Is const hoisted?

Yes.

Like let, it stays in the Temporal Dead Zone.


Are functions hoisted?

Function declarations are completely hoisted.


Are arrow functions hoisted?

No.

Only the variable declaration is hoisted.


Why does var print undefined?

Because var variables are initialized with undefined during memory creation.


Difference Between Hoisting and Undefined

Hoisting Undefined
Memory allocation process Default value assigned to var variables
Happens before execution Seen during execution
Applies to variables and functions Applies only to variables

Tips

✔ Declare variables before using them.

✔ Prefer let and const over var.

✔ Do not intentionally depend on hoisting.

✔ Write function declarations before function calls for better readability.

✔ Use meaningful variable names.


Summary

  • Hoisting is JavaScript's memory allocation behavior.
  • Variables declared with var are initialized with undefined.
  • let and const are hoisted but remain inside the Temporal Dead Zone.
  • Function declarations are fully hoisted.
  • Function expressions and arrow functions are not completely hoisted.
  • Hoisting improves flexibility, but relying on it is not recommended.

Reference

https://www.programiz.com/javascript/hoisting
https://www.w3schools.com/js/js_hoisting.asp
https://www.geeksforgeeks.org/javascript/javascript-hoisting/
https://medium.com/@javvadirupasri8/decoding-javascript-hoisting-a-must-know-concept-for-interviews-c4e23438e93e