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

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


person Jérôme Verstrynge    schedule 02.01.2013    source источник


Ответы (4)


someF создает новую (локальную) переменную с именем someGlobal (которая маскирует глобальную someGlobal) и присваивает ей значение. Он не затрагивает глобальную переменную someGlobal (хотя и не может получить к ней доступ, поскольку в области видимости есть другая переменная с таким же именем).

Операторы var поднимаются, поэтому someGlobal маскируется для всех операторов someF (а не только после оператора var). Значение локального someGlobal равно undefined, пока ему не будет присвоено значение.

someF2 получить доступ к исходному (нетронутому) глобальному someGlobal.

person Quentin    schedule 02.01.2013
comment
+1 за лучший ответ, но подробнее опишите, что глобальная переменная перезаписывается локальной переменной в функции: D - person Muhammad Talha Akbar; 02.01.2013
comment
Он не перезаписывается, он маскируется. - person Quentin; 02.01.2013
comment
хорошо, вы можете дать мне небольшое объяснение о обоих! Я не проводил исследования по этому поводу! Только для этой функции он перезаписывается или нет? - person Muhammad Talha Akbar; 02.01.2013
comment
Вы говорите, что, поскольку someF() объявляет локальную переменную с именем someGlobal после первого предупреждения, это влияет на это первое предупреждение(), вызывая неопределенную проблему? - person Jérôme Verstrynge; 02.01.2013

Поскольку вы объявляете локальную переменную с тем же именем. Таким образом, он присваивает значение локальной переменной. Просто удалите 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();
person Ali    schedule 02.01.2013

someF2 отображает 3, потому что это все еще равно 3.

В someF() вы создаете новую переменную, которая имеет то же имя, что и someGlobal. Это ничего не делает с оригинальным someGlobal, он просто создает новую переменную local для функции someF, которая исчезает, когда эта функция завершается.

Итак, у вас есть локальные переменные (например, созданные внутри someF с помощью var) и глобальные.

person Paul Collingwood    schedule 02.01.2013
comment
Хорошо, но почему я получаю неопределенную проблему в одном случае, а не в другом? Это мой вопрос. - person Jérôme Verstrynge; 02.01.2013
comment
Я думаю, что Квентин объяснил это. - person Paul Collingwood; 02.01.2013

Вот пример того, как использовать как локальную, так и глобальную переменную внутри 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();

person Dustin Kingen    schedule 02.01.2013