Переменная: локальная область действия, глобальная область действия или механизм 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
.