The Difference Between var, let and const in JavaScript


Before the ES6 was released, var was the only feature for declaring variables in Javascript. When the ES6 was released, one of the most interesting features was the addition of let and const for variable declarations. In this article we will see the difference between var, let and const.


The var declaration is the oldest of all and was used before the ES6 was released. There are associated issues with var declarations though. That's why new variable declarations were necessary.

Scope of var

The var declarations can be globally or locally scoped. If the var is declared outside a function it is globally scoped. This means that any var variables declared globally are available for use in the whole window. If the var is declared inside a function it is function scoped. This means that it is available and can be accessed only within that function. Let's see a simple example below.

var foo = "foo";

function dummy(){
  var bar = "bar";

In the example above foo is globally scoped because it exists outside a function, while bar is function scoped. This means we cannot access the bar variable outside of our dummy function.

Hoisting of var

In JavaScript, hoisting is a mechanism where variables and function declarations are moved to the top of their scope before the code is executed. This means if we do:

var foo = "foo";

It will be interpreted like this

var foo;
console.log(foo); //foo is undefined
foo = "foo";

As we can see var variables are hoisted to the top of its scope and initialized with a value of undefined.

Problem with var

If we are using var declarations everywhere we can start getting problems and bugs with our code. Let's see an example of var issues below.

var foo = "bar is smaller";
var bar = 5;

if(bar > 3){
  var foo = "bar is bigger";

console.log(foo); //bar is bigger

This is not a problem if you want foo to be redefined, but it becomes a problem when you do not realize that a variable foo has already been defined before. This might cause a lot of bugs in the code. This is why the let and const are necessary for some situations.


The let declaration is the preferred way for variable declaration after the ES6 was released, It is considered as an improvement to the var declarations.

Scope of let

The let declaration is block scoped (block is a piece of code encapsulated with "{}") this means a variable declared in a block with the let is only available for use within that block. Let's see an example about the let.

let foo = "bar is smaller";
let bar = 5;

if(bar > 3){
  let foo = "bar is bigger";
  console.log(foo); //bar is bigger

console.log(foo); //bar is smaller

We can see that using foo outside its block its not updated from the block. This is because both instances of foo are treated as different variables since they have different scopes. If we want to update let like var we must do that inside its scope. Because of this, let is a better choice than var. When using let, you won't mess up if you have used a name for a variable before as a variable exists only within its scope.

Hoisting of let

Same as var, let variable declarations are hoisted on top, the difference is that with var is initialized as undefined, the let is not initialized. So if you try to access it you'll get a Reference Error.


The const declaration is very similar to let and as the name const says they maintain constant values.

Scope of const

Same as let declarations, const declarations are block-scoped and can only be accessed within the block it was declared. The biggest difference is that they cannot be updated or re-declared, this means the value remains the same with the scope. Also every const declaration, therefore, must be initialized at the time of declaration.

const foo = "foo";
foo = "bar";//error : Assignment to constant variable. 

Hoisting of const

The const declarations here are the same as let also. they are hoisted to the top but are not initialized.

If you want to learn more in-depth about scope in Javascript, I highly recommend you to check this book: You Don't Know JS: Scope & Closures


Author: Aleksandar Vasilevski |