вернуться к уроку

Видна ли переменная?

важность: 4

Что выведет данный код?

let x = 1;

function func() {
  console.log(x); // ?

  let x = 2;
}

func();

P.S. В этой задаче есть подвох. Решение не очевидно.

Ответ: ошибка.

Попробуйте запустить этот код:

let x = 1;

function func() {
  console.log(x); // ReferenceError: Cannot access 'x' before initialization
  let x = 2;
}

func();

В этом примере мы можем наблюдать характерную разницу между «несуществующей» и «неинициализированной» («uninitialized») переменной.

Как вы могли прочитать в статье Область видимости переменных, замыкание, переменная находится в «неинициализированном» («uninitialized») состоянии с момента входа в блок кода (или функцию). И остается неинициализированной до соответствующего оператора let.

Другими словами, переменная технически существует, но не может быть использована до let.

Приведенный выше код демонстрирует это.

function func() {
  // локальная переменная x известна движку с самого начала выполнения функции,
  // но она неинициализированна ("uninitialized") до let ("мёртвая зона")
  // следовательно, ошибка

  console.log(x); // ReferenceError: Cannot access 'x' before initialization

  let x = 2;
}

Эту зону временной непригодности переменной (от начала блока кода до let) иногда называют «мёртвой зоной».