Таким образом, я играю вокруг с JavaScript и столкнулся с тем, что я думаю, чтобы быть причудой. Может кто-либо для объяснения следующего? (я включал предупрежденные значения как комментарии),
Почему является первое предупреждение (сообщение) в нечто () возвратом неопределенного и не снаружи?
var msg = 'outside';
function foo() {
alert(msg); // undefined
var msg = 'inside';
alert(msg); // inside
}
foo();
alert(msg); // outside
Рассмотрение их обоих хорошо работает:
var msg = 'outside';
function foo() {
alert(msg); // outside
}
alert(msg); // outside
и:
var msg = 'outside';
function foo() {
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
Что происходит в вашем первом примере, так это то, что объявление и инициализация msg разделяются с объявлением, которое поднимается в верх закрытия.
var msg; //declaration
msg = "inside" //initialization
Следовательно, написанный вами код - это то же самое, что и
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
Второй пример не тот. В вашем втором примере вы не объявили локальную переменную msg, поэтому предупреждение (msg) относится к глобальному сообщению. Вот некоторые дополнительные материалы для чтения: Hoisting
из http://www.irt.org/script/1321.htm :
Если мы объявляем, но не инициализируем переменную с ключевым словом
var
внутри функции он должен быть локальным в области видимости, ноundefined
во всей функции до точки, в которой он [инициализирован] ...
, это будет работать для вас:
var msg = 'outside';
function foo() {
alert(window.msg); // outside
var msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
foo();
alert(msg); // still "outside"
var
не является объявлением. Это заблуждение, которое сбивает с толку многих людей. Скорее, var
является аннотацией всей области . Размещение 'var' внутри области не имеет значения.
Объявления переменных внутри замыкания Javascript выполняются первыми, независимо от того, где они расположены внутри замыкания. Итак, в вашем первом примере локальные переменные msg
существуют в начале функции (потому что они объявлены внутри функции), но значение не присваивается ей до тех пор, пока после первого предупреждение
, поэтому для первого предупреждения сообщение
не определено.
Ваш первый пример эквивалентен:
var msg = 'outside';
function foo() {
var msg;
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}
alert(msg); // outside
Во втором примере вы явно не объявляете msg
внутри функции. Поскольку уже существует глобальная переменная с таким же именем, вместо определения локальной используется глобальная.
В третьем примере вы явно объявляете переменную и присваиваете ей значение перед попыткой ее использования, поэтому, когда вы alert (msg)
, выдается предупреждение локальной, определенной переменной.