Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проблема с глобальными переменными Javascript

Автор вопроса: Jérôme VerstryngeОтветов: 4

Я столкнулся со странной проблемой с областью действия 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), почему одна функция выдает неопределенную проблему, а другая нет?

javascriptglobal-variablesscope

Ответы

Ответ 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();

​

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы