JavaScript has three ways to declare variables, var, const, and let. Sometimes, that leaves people confused. You’ll see many places where const and let are preferred, but other use var. What’s the difference between one and the other, and which one should you use?

It’s a matter of opinion, but I recommend that you use const as your first option, and use let only when you know you’ll have to reassign (i.e. change the value of) the variable at some point. And don’t use var at all.

The idea is that using const prevents you from reassigning variables by mistake. If you accidentally change the value of a variable that shouldn’t be changed, you’ll get the error immediately and you can fix it. However, if you use let or var, it would fail silently.

The only circumstance where I’d use var would be if I were working in a very old environment that doesn’t support either const or let. Otherwise, I avoid using var altogether.

Why you shouldn’t use var

Variables created with the var keyword are “function-scoped”. It means that if you declare that variable inside a function, it will be available within that function. And if you declare a variable outside a function, it will be a global variable (i.e. it will be available everywhere.)

Also, a variable created with var can be redeclared. It means that you can create the same variable again in the same scope.

Let’s see an example of how it works:

// Create a global variable
var multiplyBy = 2;

function createLuckyNumber() {
    
    // Create a variable inside a function.
    // The variable "multiplyBy" can be accessed here
    // because it's global
    var luckyNumber = 4927.52 * multiplyBy;
    return `Your lucky number is ${luckyNumber}`;
}
createLuckyNumber(); // Returns "Your lucky number is 9855.04"

// Redeclare the local variable.
var multiplyBy = 1;

createLuckyNumber(); // Returns "Your lucky number is 4926.52"

// This will throw an error, "luckyNumber"
// can't be accessed outside the function
// where it was created.
console.log(luckyNumber);

However, this causes some problems especially for developers coming from other languages. In many other languages, variables are “block-scoped”, if they’re declared inside a block, they can be accessed from that block only. But, what’s a block?

A block is basically any group of statements inside curly brackets {}.

When you declare a block-scoped variable inside a function, it can be accessed from inside that function. If you declare it inside a loop (for or while), it’s available inside that loop. And if you declare inside an if...else statement, it can be accessed from that part of the statement.

If you’re used to block-scoped variables and start to code in JavaScript, you could find many problems and create bugs using var and its function-scoped variables.

Besides that, a good practice regarding variables is that they should be available only where they’re needed, but that isn’t always possible if you declare variables using var.

That led to the creation of two new ways to declare variables, const and let.

Block scoping in JavaScript with const and let

The keywords const and let create block-scoped variables and they fix the function-scoped problem that var has. Let’s see the differences between those and var:


// These global variables can be accessed
// from anywhwere
var globalVar = "globalVar";
const globalConst = "globalConst";
let globalLet = "globalLet";

function doSomething(someParameter) {
    // The three variables can be accessed
    // from anywhere in the function.
    var fooVar = "fooVar";
    const fooConst = "fooConst";
    let fooLet = "fooLet";

    if (someParameter) {
        
        // This variable can be accessed
        // from anywhere in the function.
        var barVar = "barVar";

        // These two variables can be
        // accessed only from this block of
        // the "if" statement. 
        const barConst = "barConst";
        let barLet = "barLet";
    }

    console.log(barVar); // Outputs "barVar"

    console.log(barConst); // ❌ Throws Error
    console.log(barLet); // ❌ Throws Error
}

There’s a difference between const and let, though. If you declare a variable using const, you can’t reassign that variable using the = operator.

let firstName = "Daniel";
const lastName = "Teixeira";

firstName = "Sofia"; // It works
lastName = "Sampaio"; // ❌ Throws Error

It’s worth pointing out that if you declare an object or an array (arrays are objects in JS) using const, you still can mutate it. It means that you can add, remove or modify properties or elements of that object.

const names = ["Daniel", "Sofia"];

// It's a "const", you can't reassign the variable
names = ["Marianna", "Lucas"]; // ❌ Throws Error

// But you can mutate it
names[2] = "Marianna";
names[3] = "Lucas";

console.log(names); // Prints ["Daniel", "Sofia", "Marianna", "Lucas"]