Variable declaration: var, const, let
In JavaScript, there are three keywords available to declare a variable, and each has its differences. Those are var
, let
and const
.
Short explanation
Variables declared with const
keyword can't be reassigned, while let
and var
can.
I recommend always declaring your variables with const
by default, but with let
if it is a variable that you need to mutate or reassign later.
Scope | Reassignable | Mutable | Temporal Dead Zone | |
---|---|---|---|---|
const | Block | No | Yes | Yes |
let | Block | Yes | Yes | Yes |
var | Function | Yes | Yes | No |
Sample code
Detailed explanation
The scope of a variable roughly means "where is this variable available in the code".
var
var
declared variables are function scoped, meaning that when a variable is created in a function, everything in that function can access that variable. Besides, a function scoped variable created in a function can't be accessed outside this function.
I recommend you to picture it as if an X scoped variable meant that this variable was a property of X.
Still focusing on the variable scope, here is a more subtle example:
Besides, var declared variables are moved to the top of the scope at execution. This is what we call var hoisting.
This portion of code:
is understood at execution like:
let
var
and let
are about the same, but let
declared variables
- are block scoped
- are not accessible before they are assigned
- can't be re-declared in the same scope
Let's see the impact of block-scoping taking our previous example:
Now, what it means for let (and const) variables for not being accessible before being assigned:
By contrast with var variables, if you try to read or write on a let or const variable before they are assigned an error will be raised. This phenomenon is often called Temporal dead zone or TDZ.
Note: Technically, let and const variables declarations are being hoisted too, but not their assignation. Since they're made so that they can't be used before assignation, it intuitively feels like there is no hoisting, but there is. Find out more on this very detailed explanation here if you want to know more.
In addition, you can't re-declare a let variable:
const
const
declared variables behave like let variables, but also they can't be reassigned.
To sum it up, const variables:
- are block scoped
- are not accessible before being assigned
- can't be re-declared in the same scope
- can't be reassigned
But there is a subtlety : const
variables are not immutable ! Concretely, it means that object and array const
declared variables can be mutated.
For objects:
For arrays: