Глобальная область переменных 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" внутри области не имеет значения.
вы можете полностью контроль исполнения 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 вы определяете "частные" переменные (с в объем функция) таким образом, его предупреждение "внутри" значение внутри функции. Надеюсь, это поможет вам!