Spec-Zone.ru › JavaScript

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)

Тип ошибки

ReferenceError

Что пошло не так?

К лексической переменной был выполнен доступ до её инициализации. Это происходит в любом контексте (глобальном, модульном, функциональном или блочном), когда к переменным, объявленным с помощью 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;

Смотрите также

  • let
  • const
  • var
  • class

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API