#Что означает ошибка
Uncaught ReferenceError: myFunction is not defined
Uncaught ReferenceError: x is not defined означает, что код обращается к переменной, функции или библиотеке, которые не объявлены в текущей области видимости. Типичные случаи: опечатка, не подключён скрипт, неправильный порядок загрузки, переменная объявлена внутри блока или модуля.
Откройте консоль (F12): указана строка и имя.
Проверьте, существует ли имя в момент выполнения.
Ошибка означает, что код обращается к имени, которого нет в текущей области видимости: скрипт не загрузился, имя написано с ошибкой либо объявлено позже вызова.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Опечатка в имени или регистре | Имена чувствительны к регистру. | Сверьте написание. |
| Скрипт не подключён или не загрузился | В консоли ошибка 404 для файла. | Проверьте путь в теге script. |
| Порядок подключения | Функция вызвана до загрузки файла. | Подключите скрипты в правильном порядке. |
| Другая область видимости | Переменная объявлена внутри функции или модуля. | Экспортируйте или вынесите переменную. |
#Пошаговое решение
- Прочитайте имя и строку в консолиВ браузере нажмите F12 → «Консоль» и нажмите ссылку на файл/строку в
ReferenceError: NAME is not defined. Запишите точное имяNAMEи воспроизведите ошибку. Ошибка означает, что идентификатор недоступен в этой области видимости в момент исполнения; это может быть опечатка, отсутствие импорта или другой порядок выполнения. При типовой ошибкеCannot access ... before initializationпричина иная: временная мёртвая зонаlet/const, её нельзя исправлять глобальной переменной. - Проверьте подключение скриптаЕсли имя должно объявляться в другом скрипте, откройте вкладку Network → JS и проверьте, что файл загрузился со статусом 200, а не 404/403. В HTML посмотрите
<script src=...>и егоdefer/async:asyncне гарантирует порядок взаимозависимых скриптов. На вкладке Sources убедитесь, что существует нужное определение и оно выполняется до обращения к нему. Если отсутствует файл, исправьте его путь; приtype="module"не рассчитывайте на автоматическую доступность переменных воwindow. - Проверьте область видимости и модулиЕсли код использует ES-модули, откройте файл с определением и проверьте реальный
export, затем сверьте точное соответствие сimportв вызывающем файле, включая регистр имени и относительный путь. Переменная, объявленная внутри функции или блокаif, недоступна снаружи; перенесите объявление в нужную область или передавайте значение аргументом. Не создавайтеwindow.NAMEради сокрытия ошибки, если архитектура проекта использует модули. - Проверьте опечатки и регистрИсправьте написание имени буква в букву: JavaScript различает регистр (
userIdнеuserid); проверьте, не затенена ли переменная другимlet/const. Установите точку останова перед обращением и посмотрите Scope в инструментах разработчика. После правки перезагрузите страницу и проверьте, что больше нетReferenceErrorи функция отрабатывает; если ошибка переехала на другую строку, изучите весь стек вызовов. - Проверьте окружениеДля кода 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.
// вместо вызова функции из 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, чтобы ловить ошибки до запуска.
// Только пример проверки наличия браузерного окруженияif (typeof window !== "undefined") { console.log(window.location.href);}// НЕ присваивайте window.myFunction = myFunction, пока myFunction не объявлена.