назад до уроку

Чи видно змінну?

важливість: 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();

У цьому прикладі ми можемо спостерігати особливу різницю між “неіснуючою” та “неініціалізованою” змінною.

Як ви могли прочитати в статті Область видимості змінної, замикання, змінна перебуває у “неініціалізованому” стані з моменту, коли виконання входить в кодовий блок (чи у функцію). І вона залишається неініціалізованою до відповідного let.

Інакше кажучи, змінна технічно існує, але не може бути використана раніше let.

Наведений нижче код це демонструє.

function func() {
  // локальна змінна `x` відома рушію з початку функції,
  // але вона "неініціалізова" (непридатна) до let ("мертва зона")
  // звідси помилка

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

  let x = 2;
}

Цю зону тимчасової непридатності змінної (від початку блоку коду до let) іноді називають “мертвою зоною”.