Understanding let, var, and const in JavaScript

JavaScript, as one of the most widely used programming languages, has various ways to declare variables. Over time, JavaScript introduced three primary ways to declare variables: var, let, and const. While they may seem similar at first glance, each has unique characteristics that make it suitable for different scenarios.

1. var - The Old School Way

var has been around since the early days of JavaScript, but it has certain limitations and quirks that led to the introduction of let and const.

Key Features of var:

  • Function-scoped: Variables declared with var are scoped to the nearest function, not the block in which they are declared. If var is declared outside of a function, it has global scope.
  • Hoisting: Variables declared with var are hoisted to the top of their scope, meaning they can be referenced before they are declared. However, the variable will be undefined until the declaration line is executed.
  • Re-declaration: In the same scope, var allows you to re-declare a variable without any errors.

Example:

function exampleVar() {
  console.log(x); // undefined due to hoisting
  var x = 10;
  console.log(x); // 10
}

exampleVar();

Limitations:

  • Due to function-level scoping and hoisting behavior, var can introduce bugs in your code that are difficult to track.
  • You can accidentally re-declare a variable in the same scope, leading to unintended consequences.

When to Use var:

In modern JavaScript development, var is generally not recommended. It is best used only in legacy codebases or when maintaining older JavaScript code.

2. let - The Block Scoped Variable

Introduced in ECMAScript 6 (ES6), let addresses some of the issues with var by providing block-level scoping.

Key Features of let:

  • Block-scoped: let is scoped to the nearest enclosing block, which can be a function, loop, or condition.
  • Hoisting: Like var, let is hoisted to the top of the block, but it is not initialized until the declaration is encountered, which avoids accessing the variable before its declaration (i.e., it is in a "temporal dead zone" until initialized).
  • No Re-declaration: You cannot re-declare a variable declared with let in the same block scope, which helps prevent accidental errors.

 Example:

function exampleLet() {
  // console.log(y); // Error: Cannot access 'y' before initialization
  let y = 20;
  console.log(y); // 20
}

exampleLet();

Advantages:

  • Better scoping: let makes it easier to manage variable scopes and avoid issues with unintended global variables.
  • Prevents accidental re-declaration within the same block.

When to Use let:

let should be your preferred choice when you need to declare variables whose values may change over time (such as counters, flags, or loop variables) and when you need block-level scoping.

3. const - The Constant Variable

const was also introduced in ES6 and is used to declare variables whose values are not meant to be re-assigned after initialization.

Key Features of const:

  • Block-scoped: Like let, const is block-scoped.
  • Immutable Reference: A variable declared with const cannot be re-assigned. This means the reference to the value is constant, but the value itself may still be mutable if it's an object or an array.
  • Hoisting: const behaves similarly to let in terms of hoisting (it is in a "temporal dead zone" until initialized).

 Example:

const z = 30;
console.log(z); // 30

// Attempting to re-assign will throw an error
// z = 40; // Error: Assignment to constant variable

Example with Objects:

const person = { name: "John", age: 25 };
person.age = 26; // This is allowed since we're mutating the object's content

console.log(person); // { name: "John", age: 26 }

// However, re-assigning the entire object will cause an error
// person = { name: "Jane", age: 30 }; // Error: Assignment to constant variable

Advantages:

  • Prevents re-assignment: If the value shouldn’t change after initialization, const is the best choice.
  • Encourages immutability: Using const helps reduce side effects by preventing accidental changes to variables.

When to Use const:

Use const when you know the value of the variable will not need to change. It's the best choice for configuration values, function expressions, and object references that shouldn’t be reassigned.

Summary of Differences:
 

Feature var let const
Scope Function-scoped Block-scoped Block-scoped
Hoisting Hoisted (undefined) Hoisted (temporal dead zone) Hoisted (temporal dead zone)
Re-declaration Allowed in the same scope Not allowed in the same scope Not allowed in the same scope
Re-assignment Allowed Allowed Not allowed (for reassignment of value)
Usage Legacy code, global vars Loop counters, temporary variables Constants, immutable references

 

Best Practices

  • Use const by default for all variables that won’t need to be re-assigned.
  • Use let for variables that will change or for loop counters.
  • Avoid using var unless maintaining legacy code or working with specific scenarios where function-scoping is needed.

By understanding the differences between let, var, and const, and using them appropriately, you can write cleaner, more maintainable JavaScript code.

 

This article aims to help developers navigate through variable declaration options in JavaScript and choose the best one based on their use case.

Up Next
    Ebook Download
    View all
    Learn
    View all