Глобальный Объем Переменной JavaScript: Почему это не работает?

Таким образом, я играю вокруг с 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
10
задан CoryDorning 21 April 2010 в 18:07
поделиться

4 ответа

Что происходит в вашем первом примере, так это то, что объявление и инициализация 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

17
ответ дан 3 December 2019 в 16:51
поделиться

из 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"
2
ответ дан 3 December 2019 в 16:51
поделиться

var не является объявлением. Это заблуждение, которое сбивает с толку многих людей. Скорее, var является аннотацией всей области . Размещение 'var' внутри области не имеет значения.

var в JavaScript - это аннотация, а не утверждение

1
ответ дан 3 December 2019 в 16:51
поделиться

Объявления переменных внутри замыкания Javascript выполняются первыми, независимо от того, где они расположены внутри замыкания. Итак, в вашем первом примере локальные переменные msg существуют в начале функции (потому что они объявлены внутри функции), но значение не присваивается ей до тех пор, пока после первого предупреждение , поэтому для первого предупреждения сообщение не определено.

Ваш первый пример эквивалентен:

var msg = 'outside';

function foo() {
  var msg;
  alert(msg); // undefined

  msg = 'inside';
  alert(msg); // inside
}

alert(msg); // outside

Во втором примере вы явно не объявляете msg внутри функции. Поскольку уже существует глобальная переменная с таким же именем, вместо определения локальной используется глобальная.

В третьем примере вы явно объявляете переменную и присваиваете ей значение перед попыткой ее использования, поэтому, когда вы alert (msg) , выдается предупреждение локальной, определенной переменной.

3
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: