Чи видно змінну?
Який буде результат цього коду?
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
) іноді називають “мертвою зоною”.