Skip to main content

Command Palette

Search for a command to run...

Scope vs Closure in JavaScript Finally Explained

Published
•3 min read•View as Markdown
A

Web Dev / Living in Germany / happly married <3

Today I want to write about something that confused me when I first learned JavaScript. The topic is scope and closure.

I have heard many times that a lot of developers mix these two up. This topic is considered important and people often say it comes up in job interviews. So let me explain it in a simple and clean way.


What Is Scope

Scope answers only one question:

Is this code allowed to access this variable

Nothing more.

Scope is about visibility. It defines where a variable exists and from where it can be accessed. JavaScript decides this purely based on where the variable is declared.

Example.

function test() {
  let x = 1
  console.log(x)
}

console.log(x)

Step 1 Where x is created

The variable x is created here.

let x = 1

This line is inside the function test.

Step 2 What JavaScript understands

JavaScript registers this internally.

This variable belongs to the function test.
It exists only inside that function.

Outside of it JavaScript does not know x.

Step 3 Why the second console log fails

console.log(x)

This line is outside of the function test.

For JavaScript this is like asking for something that was never defined. That is why an error is thrown.

That is scope.

Scope simply means
In which area does a variable exist


What Scope Really Says

Scope only decides from where access is allowed.

Example.

function outer() {
  let x = 1

  function inner() {
    console.log(x)
  }
}

The function inner can access x.

Why

Because x is defined in an outer scope. JavaScript allows inner scopes to access variables from outer scopes.

That rule is scope. End of story.


What Is Closure

Closure answers a different question:

Does a variable stay alive even after the code where it was created has finished

Closure is not about permission. It is about lifetime.

A closure means that a function remembers variables from its surrounding scope, even after that surrounding code has already finished executing.

There is no special syntax.
No extra keywords.
No framework requirement.


Closure Without Buzzwords

A closure simply means this:

A function remembers variables even though the surrounding code is already done.

Example.

function outer() {
  let name = "Alina"

  function inner() {
    console.log(name)
  }

  return inner
}

const fn = outer()
fn()

Why does this work

The function inner remembers the variable name even though outer has already finished executing.

That memory is the closure.

React uses closures a lot, but closures exist in plain JavaScript without any framework.


Minimal Closure Example

function outer() {
  let x = 1

  function inner() {
    console.log(x)
  }

  return inner
}

This is a closure because

inner uses x
x is not defined inside inner
x does not disappear

Closure is just the name for this behavior. It is not an extra feature added on top of functions.


The Most Important Point

Curly braces define scope in the code.
Closure decides how long a variable lives.

Scope says
From here you are not allowed to access this variable

Closure says
This variable must stay alive because a function still needs it


The Rule Explained Precisely

A variable can only be accessed where it is in scope.

This rule always applies.
There are no exceptions.

Closure never breaks this rule.


Why Scope and Closure Are Often Confused

Because two different questions are mixed together.

Where access is allowed
How long a variable exists

Scope answers the first question.
Closure answers the second.


The One Clear Sentence

A variable lives as long as a function still needs it.

Scope decides where a variable can be accessed.
Closure decides how long it stays alive.

Nothing more, nothing less.