Глобальная область переменных JavaScript: почему это не работает?

поэтому я играю с JavaScript и наткнулся на то, что я считаю странностью. Кто-нибудь может объяснить следующее? (я включил предупрежденные значения в качестве комментариев)

почему первое предупреждение (msg) внутри foo () возвращается неопределено, а не за пределами?

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

5 ответов


что происходит в ваш первый пример декларации и initlization МСГ разделили с декларации, будучи поднят на вершину закрытия.

var msg; //declaration
msg = "inside" //initialization

поэтому код, который вы написали, - это то же самое, что и

var msg = 'outside';

function foo() {
var msg;  
alert(msg); // undefined
msg = 'inside';
alert(msg); // inside
}

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


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

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

var msg = 'outside';

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

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

alert(msg); // outside

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

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


от http://www.irt.org/script/1321.htm:

Если мы объявим, но не initalise переменной с 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" внутри области не имеет значения.

var в JavaScript-это Аннотация, а не оператор


вы можете полностью контроль исполнения of функции Java script и передать переменные в качестве аргумента,

вот этот случае внутри не может получить доступ к внешней переменной. но если вы хотите использовать вы передать переменную аргумента получить доступ к этому значению внутри функции.

var msg = 'outside';

function foo(msg) {
  alert(msg); // outside

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

foo(msg);    
alert(msg); // outside

проверить это демо jsFiddle

и внутри другой переменной g вы определяете "частные" переменные (с в объем функция) таким образом, его предупреждение "внутри" значение внутри функции. Надеюсь, это поможет вам!