Я столкнулся со странной проблемой с областью действия Javascript (см. JSFiddle):
var someGlobal = 3;
function someF() {
// undefined issue
alert(someGlobal);
var someGlobal = 5;
// Displays 5
alert(someGlobal);
}
function someF2() {
// Displays 3, why?
alert(someGlobal);
}
someF();
someF2();
Почему Javascript не создает неопределенную проблему в someF2()? Почему someF2() может получить доступ к someGlobal, а someF() нет? Как я могу убедиться, что глобальная переменная доступна в функции?
Примечание:
В обоих случаях функции начинаются с вызова alert(someglobal), почему одна функция выдает неопределенную проблему, а другая нет?
Ответ 1 · рейтинг 7 · Quentin
someF создает новую (локальную) переменную с именем someGlobal (которая маскирует глобальную someGlobal) и присваивает ей значение. Он не затрагивает глобальную переменную someGlobal (хотя и не может получить к ней доступ, поскольку в области видимости есть другая переменная с таким же именем).
Операторы var поднимаются, поэтому someGlobal маскируется для всех операторов someF (а не только после оператора var). Значение локального someGlobal равно undefined, пока ему не будет присвоено значение.
someF2 получить доступ к исходному (нетронутому) глобальному someGlobal.
Ответ 2 · рейтинг 4 · Ali
Поскольку вы объявляете локальную переменную с тем же именем. Таким образом, он присваивает значение локальной переменной. Просто удалите var из var someGlobal в someF(), и все будет в порядке.
var someGlobal = 3;
function someF() {
// undefined issue
alert(someGlobal);
someGlobal = 5; // <-- orignially var someGlobal = 5
// Displays 5
alert(someGlobal);
}
function someF2() {
// Should display 5 now
alert(someGlobal);
}
someF();
someF2();
Ответ 3 · рейтинг 1 · Paul Collingwood
someF2 отображает 3, потому что это все еще равно 3.
В someF() вы создаете новую переменную, которая имеет то же имя, что и someGlobal. Это ничего не делает с оригинальным someGlobal, он просто создает новую переменную local для функции someF, которая исчезает, когда эта функция завершается.
Итак, у вас есть локальные переменные (например, созданные внутри someF с помощью var) и глобальные.
Ответ 4 · рейтинг -1 · Dustin Kingen
Вот пример того, как использовать как локальную, так и глобальную переменную внутри someF с помощью this.
var someGlobal = 3;
function someF() {
// Displays 3
alert(someGlobal);
this.someGlobal = 5;
someGlobal = 5;
// Displays 5
alert(this.someGlobal);
}
function someF2() {
// Displays 5
alert(someGlobal);
}
someF();
someF2();