Understanding the Weird Parts of JavaScript Variables
JavaScript is an incredibly versatile language, but it can sometimes leave developers scratching their heads—especially when it comes to variables. Terms like var, let, and const can seem confusing, but understanding their nuances is crucial for writing clean and efficient code. In this post, we’ll break down these concepts, clarify common pitfalls, and apply them in a practical project.
What Are Variables in JavaScript?
Variables are containers for storing data values. They allow us to work with data dynamically in our programs. In JavaScript, we can declare variables using three keywords:
var: The original way to declare variables.let: Introduced in ES6, providing better scoping rules.const: Also introduced in ES6, for variables that shouldn’t be reassigned.
Let’s dive into each of these and understand their behavior.
1. var: The Old Guard
Variables declared with var have function scope or global scope, and they can be redeclared within the same scope.
Characteristics of var:
- Hoisting: Variables declared with
varare hoisted to the top of their scope but are initialized asundefined. - No Block Scope:
varis not confined to block scope; it leaks out ofiforforblocks.

Pitfall: Using var can lead to unexpected behaviors due to hoisting and lack of block scope. It’s often better to avoid it in modern JavaScript.
2. let: The Modern Replacement
let provides block scope, which means variables declared with let are confined to the block in which they are declared.
Characteristics of let:
- Block Scope: Limited to the block, statement, or expression where it is used.
- Temporal Dead Zone (TDZ): Variables declared with
letcannot be accessed before their declaration.

Tip: Use let when you need a variable whose value may change but is confined to a specific block.
3. const: The Immutable Option
const is used for variables that shouldn’t be reassigned. However, it doesn’t make the value immutable—only the binding is immutable.
Characteristics of const:
- Block Scope: Like
let,constis block-scoped. - Must Be Initialized: You must assign a value when declaring a
constvariable. - Reference Immutability: The binding cannot be changed, but objects or arrays can still be mutated.
Tip: Use const by default unless you need to reassign the variable—in which case, use let.
When to Use var, let, and const
- Use
const: By default, for variables whose value won’t change. - Use
let: For variables whose value may change or need to be reassigned. - Avoid
var: Unless you’re working with legacy code or need function-scoped variables specifically.
Practical Example: Quiz App
Let’s apply what we’ve learned by creating a simple quiz app. This app will use let for mutable state, const for constants, and avoid var altogether.

Tip: It is intentional that we did not include any copy functionalities to our code, the purpose is for you to type and let it sink in, that is the only way you will truly understand these things.
Key Takeaways
varis function-scoped and prone to bugs due to hoisting and lack of block scope.letandconstare block-scoped and safer for modern JavaScript development.- Use
constby default andletwhen reassignment is required.
By mastering these variable types, you’ll write cleaner, more predictable JavaScript code. Ready to tackle closures next? Stay tuned for our next post on mastering closures in JavaScript!
