Ожидание undefined в Javascript
Я видел код Javascript, и я наткнулся на что-то вроде этого:
function() {
if(true) {
var a = 5;
}
alert(a);
}
Я был уверен, что это выведет undefined, но это не так? Может кто-нибудь сказать мне, почему?
Ответы
Ответ 1
JavaScript имеет область видимости уровня, а не область уровня блока.
Оператор var
поднимается, поэтому ваш код эквивалентен:
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
Если у JavaScript была область уровня блока, то она все равно не выведет undefined
. Поскольку a
не был объявлен в выражении alert
, вы вызывали бы ошибку ссылки.
Ответ 2
Причина, по которой это работает, является результатом того, что называется подъемом. Подъем перемещает объявление переменной в верхнюю часть области. Таким образом, ваша функция действительно выглядит так:
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
"Поскольку объявления переменных (и декларации в целом) обрабатываются до того, как выполняется какой-либо код, объявление переменной в любом месте кода эквивалентно объявлению ее вверху. Это также означает, что переменная может оказаться перед использованием Это поведение называется" подъем ", поскольку, как представляется, объявление переменной перемещается в начало функции или глобального кода". - var MDN
Ответ 3
Переменные определения переносятся в начало функции (перемещение переменной); нет переменных уровня блока.
Компилятор изменит ваш код на
function() {
var a;
if(true) {
a = 5;
}
alert(a);
}
Ответ 4
JS не имеет блочных областей только функции\глобальных областей.
В вашем случае var объявляется без значения в верхней части функции, а затем назначается.
Вот хороший учебник по областям.