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: