Ожидание 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 объявляется без значения в верхней части функции, а затем назначается.

Вот хороший учебник по областям.