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