JavaScript WindowsLinux

Ошибка ReferenceError в JavaScript — переменная или функция is not defined

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Ошибка означает, что код обращается к имени, которого нет в текущей области видимости: скрипт не загрузился, имя написано с ошибкой либо объявлено позже вызова. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Библиотеки и порядок
  5. Область видимости
  6. Окружение и сборка

#Что означает ошибка

Сообщение
Uncaught ReferenceError: myFunction is not defined

Uncaught ReferenceError: x is not defined означает, что код обращается к переменной, функции или библиотеке, которые не объявлены в текущей области видимости. Типичные случаи: опечатка, не подключён скрипт, неправильный порядок загрузки, переменная объявлена внутри блока или модуля.

Откройте консоль (F12): указана строка и имя.

Проверьте, существует ли имя в момент выполнения.

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

#Причины и решения

Возможная причинаКак узнатьЧто делать
Опечатка в имени или регистреИмена чувствительны к регистру.Сверьте написание.
Скрипт не подключён или не загрузилсяВ консоли ошибка 404 для файла.Проверьте путь в теге script.
Порядок подключенияФункция вызвана до загрузки файла.Подключите скрипты в правильном порядке.
Другая область видимостиПеременная объявлена внутри функции или модуля.Экспортируйте или вынесите переменную.

#Пошаговое решение

  1. Прочитайте имя и строку в консолиВ браузере нажмите F12 → «Консоль» и нажмите ссылку на файл/строку в ReferenceError: NAME is not defined. Запишите точное имя NAME и воспроизведите ошибку. Ошибка означает, что идентификатор недоступен в этой области видимости в момент исполнения; это может быть опечатка, отсутствие импорта или другой порядок выполнения. При типовой ошибке Cannot access ... before initialization причина иная: временная мёртвая зона let/const, её нельзя исправлять глобальной переменной.
  2. Проверьте подключение скриптаЕсли имя должно объявляться в другом скрипте, откройте вкладку Network → JS и проверьте, что файл загрузился со статусом 200, а не 404/403. В HTML посмотрите <script src=...> и его defer/async: async не гарантирует порядок взаимозависимых скриптов. На вкладке Sources убедитесь, что существует нужное определение и оно выполняется до обращения к нему. Если отсутствует файл, исправьте его путь; при type="module" не рассчитывайте на автоматическую доступность переменных во window.
  3. Проверьте область видимости и модулиЕсли код использует ES-модули, откройте файл с определением и проверьте реальный export, затем сверьте точное соответствие с import в вызывающем файле, включая регистр имени и относительный путь. Переменная, объявленная внутри функции или блока if, недоступна снаружи; перенесите объявление в нужную область или передавайте значение аргументом. Не создавайте window.NAME ради сокрытия ошибки, если архитектура проекта использует модули.
  4. Проверьте опечатки и регистрИсправьте написание имени буква в букву: JavaScript различает регистр (userId не userid); проверьте, не затенена ли переменная другим let/const. Установите точку останова перед обращением и посмотрите Scope в инструментах разработчика. После правки перезагрузите страницу и проверьте, что больше нет ReferenceError и функция отрабатывает; если ошибка переехала на другую строку, изучите весь стек вызовов.
  5. Проверьте окружениеДля кода Node.js и серверного рендеринга отдельно проверьте среду: window и document доступны в браузере, но не в обычном Node-процессе; require не определён в ES-модуле. Вызов typeof window !== "undefined" может служить проверкой среды, но код, нуждающийся в DOM, всё равно должен выполняться только на клиенте после появления элементов. Если проблема возникает при сборке или на сервере, смотрите журнал Node и место выполнения, а не только консоль браузера.

#Библиотеки и порядок

$ is not defined — jQuery не загружен или подключён после вашего кода; React is not defined — нет импорта (в старых конфигурациях); axios is not defined — нет подключения файла через тег script (атрибут src) или строки import. В Network проверьте, что файл загрузился без 404 и блокировщика рекламы. Подключайте библиотеки до своего кода или используйте defer и DOMContentLoaded.

#Область видимости

Переменные let/const недоступны вне блока {}; функции в модулях (type="module") не попадают в глобальную область, поэтому вызов такой функции из HTML-атрибута onclick падает с ReferenceError: назначайте обработчики через addEventListener или window.fn = fn. Переменная объявлена после использования (const не поднимается так, как var). Проверьте регистр: myVar ≠ myvar.

app.js
Первый вариант предпочтительнее: обработчик живёт в скрипте, а не в разметке, и не зависит от области видимости модуля.
// вместо вызова функции из HTML-атрибута onclick
document.querySelector('#save').addEventListener('click', saveForm);

// запасной вариант для старой разметки
window.saveForm = saveForm;

#Окружение и сборка

В Node.js window, document, localStorage не определены — это браузерные объекты (при SSR в Next.js оборачивайте в typeof window !== "undefined"). require is not defined — вы в ESM или в браузере. process is not defined — в браузере нужно настраивать сборщик (define). Включите ESLint с правилом no-undef, чтобы ловить ошибки до запуска.

ТекстКоманда
Отключено создание несуществующей глобальной функции, которое само вызывает ReferenceError.
// Только пример проверки наличия браузерного окружения
if (typeof window !== "undefined") {
console.log(window.location.href);
}
// НЕ присваивайте window.myFunction = myFunction, пока myFunction не объявлена.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.