ReferenceError: нельзя получить доступ к лексическому объявлению 'X' до инициализации
Исключение JavaScript "can't access lexical declaration 'X' before initialization" возникает, когда к лексической переменной обращаются до её инициализации. Это происходит в любом контексте (глобальном, модульном, функциональном или блочном), когда к переменным let или const обращаются до того, как будет выполнено место их объявления.
Сообщение
ReferenceError: Cannot access 'X' before initialization (V8-based) ReferenceError: can't access lexical declaration 'X' before initialization (Firefox) ReferenceError: Cannot access uninitialized variable. (Safari)
Тип ошибки
Что пошло не так?
К лексической переменной был выполнен доступ до её инициализации. Это происходит в любом контексте (глобальном, модульном, функциональном или блочном), когда к переменным, объявленным с помощью let или const, обращаются до того, как будет выполнено место их объявления.
Обратите внимание, что важен порядок выполнения обращения и объявления переменной, а не порядок, в котором операторы появляются в коде. Для получения дополнительной информации см. описание Временной мёртвой зоны.
Эта проблема не возникает для переменных, объявленных с использованием var, поскольку они инициализируются значением по умолчанию undefined, когда они поднимаются (hoisted).
Эта ошибка также может возникнуть в циклических импортах, когда модуль использует переменную, зависящую от оценки самого модуля.
Примеры
Недопустимые случаи
В этом случае доступ к переменной foo осуществляется до её объявления. В этот момент `foo` не была инициализирована значением, поэтому обращение к переменной вызывает ошибку ссылки (ReferenceError).
function test() {
// Accessing the 'const' variable foo before it's declared
console.log(foo); // ReferenceError: foo is not initialized
const foo = 33; // 'foo' is declared and initialized here using the 'const' keyword
}
test();
В этом примере доступ к импортированной переменной a осуществляется, но она не инициализирована, поскольку оценка a.js блокируется оценкой текущего модуля b.js.
// -- a.js (entry module) --
import { b } from "./b.js";
export const a = 2;
// -- b.js --
import { a } from "./a.js";
console.log(a); // ReferenceError: Cannot access 'a' before initialization
export const b = 1;
Допустимые случаи
В следующем примере мы корректно объявляем переменную, используя ключевое слово const, прежде чем получить к ней доступ.
function test() {
// Declaring variable foo
const foo = 33;
console.log(foo); // 33
}
test();
В этом примере доступ к импортированной переменной a осуществляется асинхронно, поэтому оба модуля оцениваются до того, как произойдет доступ к a.
// -- a.js (entry module) --
import { b } from "./b.js";
export const a = 2;
// -- b.js --
import { a } from "./a.js";
setTimeout(() => {
console.log(a); // 2
}, 10);
export const b = 1;
Смотрите также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cant_access_lexical_declaration_before_init