Глиф Учебники

Ошибка ReferenceError: … is not defined

Справочник · JavaScript · 2 минуты чтения

Ошибка значит: в коде использовано имя, которого движок не знает. В начале сообщения стоит само имя:

Текст
Uncaught ReferenceError: totl is not defined

Найдите в коде строку, которую указывает консоль (номер строки справа от сообщения). Причина зависит от того, какое имя в сообщении.

Найдите свой случай

Имя из вашего кодаопечатка или переменная из другого блока

Опечатка или регистр

totl вместо total, Console вместо console, number("5") вместо Number("5"). Большие и маленькие буквы в именах различаются. Сравните написание с объявлением: поиск по файлу (Ctrl+F) быстро покажет, как имя написано в других местах.

Переменная объявлена в другом блоке

let и const видны только в своём блоке и функции. Снаружи их нет:

JavaScript
function makeGreeting() {
  const greeting = "Привет";
  return greeting;
}

makeGreeting();

try {
  console.log(greeting);
} catch (err) {
  console.log(err.name + ": " + err.message);
}
Вывод
ReferenceError: greeting is not defined

Значение из функции получают через return: const text = makeGreeting();. Если переменная нужна в нескольких функциях, объявите её снаружи, выше их.

Дальше — для всех случаев

Имя библиотеки ($, jQuery, Chart)скрипты подключены не в том порядке

$ is not defined, jQuery is not defined, Chart is not defined — код использует библиотеку, которая ещё не загружена. Библиотеку подключают раньше своего скрипта:

HTML
<script src="libs/chart.js" defer></script>
<script src="script.js" defer></script>

Скрипты с defer выполняются по порядку тегов. С async порядок не гарантирован — для зависимых скриптов он не подходит. Если библиотека не загрузилась вовсе (неверный путь), в консоли выше будет ошибка 404.

Дальше — для всех случаев

document, window или alertкод для браузера запущен в Node.js

document is not defined, window is not defined, alert is not defined в терминале — эти объекты есть только в браузере. Код, который работает со страницей, запускают на странице, а не командой node. Подробнее — в уроке Первая программа: где запускать JavaScript.

Дальше — для всех случаев

requireв браузере и в модулях его нет

  • require is not defined в браузере — require есть только в Node.js. В браузере файлы подключают тегами <script> или через import в модулях (<script type="module">).
  • require is not defined in ES module scope в Node.js — файл считается модулем: у него расширение .mjs или в package.json есть "type": "module". В модуле вместо require пишут import: import fs from "node:fs";.

Не «чините» ошибку, объявляя переменную наугад (let total; в начале файла): ошибка пропадёт, но значение останется undefined, и проблема всплывёт в другом месте. Найдите, где значение должно было появиться.

Если ошибка Cannot access … before initialization

let и const нельзя трогать до строки объявления — ошибка будет другая, но похожая: Cannot access 'x' before initialization. Перенесите объявление выше. Подробно — в справке Чем отличаются var, let и const.