🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsAmazon Prime Big Deal Days: October 6 to October 7, 2026(15.09.2026 um 11:36 Uhr)
🪟 Windows TippsSpotify(15.09.2026 um 11:30 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)
🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsAmazon Prime Big Deal Days: October 6 to October 7, 2026(15.09.2026 um 11:36 Uhr)
🪟 Windows TippsSpotify(15.09.2026 um 11:30 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)

🔧 Programmierung 🕛 vor 2 Monaten 4 Min Lesezeit
0

# Understanding JavaScript Closures Through Call Stack, Heap Memory & `[[Scopes]]`

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht

Closures aren't magic—they're simply JavaScript's way of keeping data alive when a function still needs it.




Every JavaScript developer has heard statements like:




  • "A closure is a function that remembers variables from its outer scope."

  • "The inner function closes over variables."

  • "Closures preserve the lexical environment."



But...




  • How does a function actually remember variables?

  • Where are those variables stored after the outer function finishes?

  • Why doesn't JavaScript delete them?



Let's go beyond the textbook definition and see what actually happens inside the JavaScript engine.









The Two Main Players Inside the JavaScript Engine



Whenever a function executes, two important memory areas are involved:




  • Call Stack

  • Heap Memory



Understanding closures is really about understanding where JavaScript stores variables and why some of them survive after a function finishes executing.









1. What Happens in a Normal Function?



Consider a simple function:




CODE
function greet() {
let name = "JavaScript";
console.log(name);
}

greet();






When greet() executes:




  1. An Execution Context is created.

  2. Local variables (name) belong to that execution.

  3. The execution context is pushed onto the Call Stack.




CODE
Call Stack

┌─────────────────────────┐
│ Execution Context │
│ name = "JavaScript" │
└─────────────────────────┘






After the function finishes:




  • The execution context is popped off the stack.

  • No code references name anymore.

  • It becomes eligible for Garbage Collection.



Everything is cleaned up.









2. What Changes When a Closure Is Created?



Now look at this example:




CODE
function outerFunction() {

let count = 0;

function innerFunction() {
count++;
console.log(count);
}

return innerFunction;
}

const counter = outerFunction();

counter();
counter();
counter();






Output




CODE
1
2
3






But wait...



outerFunction() already finished executing.



Its execution context has been removed from the Call Stack.



So why is count still available?



That's where closures come in.









Behind the Scenes



When JavaScript notices that innerFunction uses count, it understands:




"This variable will still be needed after outerFunction() returns."




Instead of letting count disappear with the execution context, the engine keeps it alive.



Three important things happen behind the scenes.









Step A — Captured Variables Are Kept in Heap Memory



The variables that are captured by an inner function are stored inside an internal object called the Lexical Environment (often called the Closure Context).



Conceptually, you can think of it like this:




CODE
Heap Memory

Lexical Environment

{
count: 0
}






Unlike the Call Stack, heap memory isn't destroyed when the function returns.



This allows the captured variables to stay alive.




Note: Engines don't literally "move" variables from the stack to the heap. Instead, captured variables are stored in a heap-allocated lexical environment so they can outlive the function call.










Step B — The Secret Link ([[Scopes]])



Every function internally carries a hidden reference called:




CODE
[[Scopes]]






This hidden reference points to the lexical environment containing the variables it needs.



Conceptually:




CODE
counter


[[Scopes]]


Lexical Environment
{
count: 0
}






Even after outerFunction() has finished, the returned function still knows exactly where count lives.









Step C — The Scope Chain



Later, when you execute:




CODE
counter();






JavaScript performs variable lookup in this order:




  1. Check the function's local scope.

  2. If not found, follow [[Scopes]].

  3. Search the lexical environment.

  4. Continue upward until the variable is found.



This lookup process is called the Scope Chain.









Visualizing the Entire Process






Before outerFunction() Returns






CODE
Call Stack

┌────────────────────────────┐
│ outerFunction() │
│ count = 0 │
│ innerFunction() │
└────────────────────────────┘












After Returning






CODE
Call Stack

┌──────────────────────┐
│ Global Execution │
└──────────────────────┘


Heap Memory

┌────────────────────────┐
│ Lexical Environment │
│ count = 0 │
└────────────────────────┘



[[Scopes]]



innerFunction






The execution context is gone.



The variable survives because the returned function still references it.









A Simple Analogy



Imagine:





  • outerFunction() is a hotel room.


  • count is an important document.

  • Before checking out, you place the document in a secure locker (Heap Memory).

  • You hand the locker key ([[Scopes]]) to your child (innerFunction).



Even after the hotel room is empty, your child still has the key and can access the document whenever needed.



That's exactly how closures work.









Why Are Closures Useful?






1. Data Privacy



Closures let you create private variables.




CODE
function createCounter() {

let count = 0;

return {
increment() {
count++;
},

getCount() {
return count;
}
};
}






Nobody outside can directly modify count.









2. Maintaining State



Closures allow functions to remember information between calls.




CODE
const counter = outerFunction();

counter();
counter();
counter();






The value of count persists without using global variables.









Key Takeaways



✔ A closure is created when an inner function uses variables from its outer scope.



✔ JavaScript keeps those captured variables alive inside a heap-allocated lexical environment.



✔ The returned function stores a hidden reference called [[Scopes]] to that environment.



✔ As long as the function exists, the captured variables cannot be garbage collected.



✔ Variable lookup through these linked environments is called the Scope Chain.









Final Thought



Closures aren't magic.



They're simply the JavaScript engine preserving the variables that are still needed.



Once you understand the relationship between the Call Stack, Heap Memory, Lexical Environment, and the hidden [[Scopes]] reference, closures become one of the most elegant and powerful features of JavaScript.

Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
1 Quelle
The Gemini desktop app is now available for Windows
1 Quelle
Burn Out, Or Fade Away
1 Quelle
Windows 11 KB5129195 is out after Microsoft confirms major issues with the September 2026 update, but it won’t fix AMD GPU errors
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten # Understanding JavaScript Closures Through Call Stack, Heap Memory & `[[Scopes]]`

Thematisch verwandte Begriffe: Understanding, JavaScript, Closures, Through · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...