Skip to content

How to Fix ReferenceError in JavaScript — Variable Not Defined

DodaTech Updated 2026-06-15 3 min read

In this tutorial, you'll learn about How to Fix ReferenceError in JavaScript. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

The Error

ReferenceError: x is not defined
ReferenceError: Cannot access 'y' before initialization
ReferenceError: process is not defined

A ReferenceError fires when JavaScript tries to access a variable that doesn't exist in the current scope or that exists but is in the temporal dead zone.

What Causes It

1. Typo in Variable Name

const userName = 'Alice';
console.log(usernName); // ReferenceError: usernName is not defined

Fix: Double-check spelling. Use an editor with autocompletion and ESLint to catch typos before runtime.

2. Temporal Dead Zone (let/const)

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

Fix: Move variable declarations before any code that accesses them, or use var (though let/const is preferred — just hoist them mentally).

3. Block Scope Issue

if (true) {
  const secret = 'hidden';
}
console.log(secret); // ReferenceError: secret is not defined

Fix: Declare variables in the scope where they're needed:

let secret;
if (true) {
  secret = 'hidden';
}
console.log(secret); // 'hidden'

4. Missing Script Include

// script.js — uses a function from another file
processData(data); // ReferenceError: processData is not defined

Fix: Ensure all scripts are loaded in the correct order:

<script src="utils.js"></script>  <!-- Must load first -->
<script src="script.js"></script>

5. Variable Declared in Strict Mode or Module

'use strict';
x = 10; // ReferenceError in strict mode (no auto-globals)

Fix: Always declare variables with const, let, or var.

How to Fix It

Step 1: Check the Variable Name

Look for simple typos — the error message tells you exactly which name is undefined:

// Error: ReferenceError: usrName is not defined
const userName = 'Alice';
console.log(usrName); // ← Typo here

Step 2: Check Scope

Is the variable declared in a parent scope? A sibling block?

function outer() {
  const value = 'accessible';
  function inner() {
    console.log(value); // Works — inner can access outer scope
  }
  inner();
}

Step 3: Check Declaration Order

Move const/let declarations above their first use:

// ❌ Bad — TDZ error
function process() {
  return data;
  const data = 'test';
}

// ✅ Good — declare first
function process() {
  const data = 'test';
  return data;
}

Step 4: Check Script Loading Order

For browser code, verify <script> tags are ordered by dependency:

<!-- ❌ Wrong order — library not loaded yet -->
<script src="app.js"></script>
<script src="library.js"></script>

<!-- ✅ Correct order -->
<script src="library.js"></script>
<script src="app.js"></script>

For Node.js, check require paths:

// ❌ Wrong path
const utils = require('./util'); // Directory is 'utils', not 'util'

Prevention

  1. Use const by default — fewer surprises than let or var.
  2. Declare all variables at the top of their scope — avoids TDZ confusion.
  3. Use an editor with TypeScript or JSDoc — catches undefined variables at write time.
  4. Run ESLint with no-undef rule — catches undeclared variables.
  5. Use typeof for safe existence checks in environments (browser vs Node):
if (typeof process !== 'undefined') {
  console.log('<a href="/backend/nodejs/">Node.js</a> environment');
}

Summary

Scenario Fix
Typo Correct the spelling
TDZ Move declaration before usage
Block scope Hoist declaration to parent scope
Missing script Fix load order or add the script
Strict mode Declare with const/let/var

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro