1.3 Variables in JavaScript: var, let, and const

let and const has provide JavaScript developers with more control over variable scope and mutability, reducing the likelihood of bugs.

Variables in JavaScript: var, let, and const

In JavaScript, variables are fundamental building blocks that store data values. Over the years, the way we declare variables has evolved, offering more flexibility and control over how data is managed in our programs. This evolution has introduced var, let, and const, each with its own set of behaviors and use cases. Understanding the differences between them is crucial for writing clear, efficient, and predictable JavaScript code. Here we will delve into these variable declarations, highlighting their scope, hoisting behavior, and mutability.

var: The Old Guard

Introduced in the earliest versions of JavaScript, var is the most globally understood declaration keyword. It allows you to declare a variable, optionally initialize it, and later reassign it as needed. However, var comes with limitations that can lead to bugs, especially related to its scope and hoisting behavior.

Scope

var is function-scoped, meaning that when it is declared within a function, it is only accessible within that function. However, if declared outside of a function, it becomes globally scoped. This global scoping can lead to unintended consequences, especially in a language that heavily utilizes functions.

Hoisting

Variables declared with var are hoisted to the top of their scope. This means that they can be used before they are declared, but only their declaration is hoisted, not their initialization.

console.log(x); // undefined
var x = 5;

In the example above, x is hoisted, so it doesn't throw a ReferenceError, but it outputs undefined because its initialization with the value 5 occurs after it's used.

let: Block Scope Introduction

ES6 (ECMAScript 2015) introduced let as a part of its goal to improve the language. let addresses many issues that developers faced with var, particularly by introducing block scoping.

Scope

Unlike var, let is block-scoped. A block is any code surrounded by {}, including blocks used for loops and conditionals. This means variables declared with let can only be accessed within the block they were defined.

if (true) {
    let y = 5;
}
console.log(y); // ReferenceError: y is not defined

Hoisting

Variables declared with let are also hoisted to the top of their scope. However, they are not initialized with a value. Accessing a let variable before its declaration results in a ReferenceError.

console.log(z); // ReferenceError: Cannot access 'z' before initialization
let z = 5;

const: Immutable Declarations

const is similar to let in that it is block-scoped and hoisted in the same manner. The critical difference is that const is used to declare variables meant to remain constant through their lifetime. Once a variable is assigned with const, it cannot be reassigned.

Immutability

It's important to note that const does not make the variable's value immutable, just the variable's binding to that value. For example, if the variable holds an object, the object's properties can still be modified.

const person = { name: "John" };
person.name = "Doe"; // This is allowed
person = { name: "Jane" }; // TypeError: Assignment to constant variable.

Use Cases

Use const by default for all of your variables to ensure immutability. If you know the variable will change, use let. Avoid var to prevent scope and hoisting related bugs.


The introduction of let and const has provided JavaScript developers with more control over variable scope and mutability, reducing the likelihood of bugs associated with global variables and unintended reassignments. By understanding the differences and appropriate use cases for var, let, and const, developers can write more predictable and maintainable JavaScript code. As a best practice, default to using const for variables that won't be reassigned, and let for those that will, steering clear of var to avoid its pitfalls.

Support us ❤️

Buy Us A Coffee