Переменная: локальная область действия, глобальная область действия или механизм JavaScript?

Вот что-то интересное, которое я нашел во время обучения в javascript.

код

var foo = "This is a global variable.";

var bar = function() {
    alert(foo);
    foo = "Value has been modified";
}

bar();
alert(foo);

Это дает нормальный ответ, который, по вашему мнению, вы получите, но если я изменю одну строку:

от

foo = "Value has been modified";

в

var foo = "Value has been modified";

Я получаю значение undefined для foo, почему это? Поскольку функция является глобальной областью, почему она не принимает ключевое слово var перед этим?

Edit

Теперь я понимаю, что то, что происходит в var foo на панели функций, будет иметь наибольшее значение из-за ключевого слова var и будет поднято, но оно будет поднято без значение.

Ответ 1

В инструкции var есть две части: фактическое объявление:

var foo //;

... и назначение, которое является необязательным:

= 1234567890;

Если для этого нет назначений, переменная (если она еще не определена) по умолчанию равна undefined.


Часть объявления перемещается в верхнюю часть текущей области (начало функции), но не фактическое присвоение (так что это эквивалентно следующему ):

var foo = "This is a global variable.";

var bar = function() {
    var foo; // undefined
    alert(foo); // yes, it undefined
    foo = "Value has been modified"; // modify local, not global
}

bar();
alert(foo); // the global one

Функции создают свою собственную область - например, возьмите это:

var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined

Ответ 2

Используя var, вы сообщаете движку использовать переменную локальная с именем foo, затеняя глобальную.

Причина, по которой вы получаете undefined в alert, заключается в том, что использование var влияет на всю область действия, а не только с этого момента. Вы могли бы написать:

var foo;
alert(foo);
foo = "Value has been modified";

Ответ 3

Механизм JavaScript проанализирует ваш код и переместит объявления var в начало своей области, но ваша строковая привязка к нему останется там, где была. После синтаксиса, вот как ваш код интерпретируется:

var foo = "This is a global variable.";    

var bar = function() {
    var foo;
    alert(foo);
    foo = "Value has been modified";
}    

bar();
alert(foo);

Поскольку он создает локальную переменную без какого-либо значения в верхней части вашей функции, ваше оповещение будет показывать undefined.