JavaScript let Vs var

In this tutorial, you will learn about the difference between let and var in JavaScript with the help of examples.

In JavaScript, both the keywords var and let are used to declare variables.

The let keyword was introduced in the later version of JavaScript known as ES6(ES2015). And it's the preferred way to declare variables.


JavaScript let Vs var

Here's the overview of the differences between let and var.

let var
let is block-scoped. var is function scoped.
let does not allow to redeclare variables. var allows to redeclare variables.
Hoisting does not occur in let. Hoisting occurs in var.

JavaScript let Vs var in Local Scope

var is function scoped

The variable declared inside a function with var can be used anywhere within a function. For example,

// program to print text
// variable a cannot be used here
function greet() {
    // variable a can be used here
    var a = 'hello';
    console.log(a);
}
// variable a cannot be used here

greet(); // hello

In the above program, the variable a is declared with var. The variable a can be used anywhere inside the function greet.

let is block-scoped

The variable declared with let can only be accessed inside a block of code. For example,

// program to print the text
// variable a cannot be used here
function greet() {
    let a = 'hello';

    // variable b cannot be used here
    if(a == 'hello'){
        // variable b can be used here
        let b = 'world';
        console.log(a + ' ' + b);
    }

     // variable b cannot be used here
    console.log(a + ' ' + b); // error
}
// variable a cannot be used here

greet();

Output

hello world
Uncaught ReferenceError: b is not defined

In the above program, the variable a is declared inside the function and it can be accessed anywhere inside the function (a becomes function scoped).

However the variable b is declared inside the if block statement. b will be block-scoped and can only be accessed inside the if block.

Hence when you try to access b outside of if block, an error occurs (as shown above in the program).

Note: The variables declared inside a function will be function scoped for both var and let.


let doesn't allow to redeclare Variables

1. A variable declared with var can be redeclared again. For example,

var a = 5; // 5
var a = 3; // 3

A variable declared with let cannot be redeclared within the same block or same scope. For example,

let a = 5;
let a = 3; // error 

Output

Uncaught SyntaxError: Identifier 'a' has already been declared

2. Redeclaring a variable with var in a different scope or block changes the value of the outer variable too. For example,

var a = 5;
console.log(a); // 5
{
    var a = 3;
    console.log(a); // 3
}
console.log(a); // 3

Redeclaring a variable with let in a different scope or block treats that variable as a different variable. And the value of a variable outside does not change. For example,

let a = 5;
console.log(a); // 5
{
    let a = 3;
    console.log(a); // 3
}
console.log(a); // 5

3. When a variable declared with var is used in a loop, the value of that variable changes. For example,

var a = 2;
for(var a = 0; a < 3; a++) {
    console.log('hello');
}
console.log(a); // 3

In the above program, the for loop redeclares the variable a. Hence the value of a is changed to 3 at the end.

When a variable declared with let is used in a loop, the value of a variable does not change. For example,

let a = 2;
for(let a = 0; a < 3; a++) {
    console.log('hello');
}
console.log(a); // 2

In the above program, for loop treats variable a as a different variable than the one declared above. And the scope of that variable is only inside the for loop. Hence the value of variable a remains 2 at the end.


let Doesn't Allow Hoisting

The variables declared with var are hoisted to the top of the scope of the program. For example,

console.log(a);
var a; // undefined (not an error)

The keyword let does not allow hoisting. For example,

console.log(a);
let a; // Uncaught ReferenceError: a is not defined

If you want to learn more about hoisting, visit JavaScript Hoisting.


let and var Browser Support

Most of the modern browsers support the use of let. However, some browsers do not fully support let.

To learn more, visit JavaScript let browser support.


Note: In case of global scope, both var and let will behave in the same way. For example,

var a = 5; // 5

The variable a will be global scoped and can be accessed anywhere in the program.

let a = 5; // 5

The variable a will be global scoped and can be accessed anywhere in the program.