Видна ли переменная?
важность: 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
) иногда называют «мёртвой зоной».