6

我遇到了一个奇怪的 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),为什么一个函数会抛出未定义的问题而另一个不会呢?

4

4 回答 4

7

someF创建一个新的(局部范围的)变量,称为someGlobal(它掩盖了 global someGlobal)并为其分配一个值。它不会触及全局someGlobal(尽管无法访问它,因为范围内还有另一个同名的变量)。

var语句被提升,因此对所有的都someGlobal被屏蔽(不仅仅是在语句之​​后)。本地的值是直到一个值被分配给它。someFvarsomeGlobalundefined

someF2访问原始(未触及)的 global someGlobal

于 2013-01-02T12:33:33.170 回答
4

由于您要声明一个具有相同名称的局部变量。因此,它将值分配给局部变量。只需从 someF() 中的 var someGlobal 中删除 var 就可以了。

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();
于 2013-01-02T12:33:09.293 回答
1

someF2 显示 3,因为它仍然3。

在 someF() 中,您创建了一个恰好与 someGlobal 同名的新变量。这对原始的 someGlobal 没有任何作用,它只是在本地创建一个新变量来函数 someF,该变量在该函数结束时消失。

所以你有局部变量(例如在 someF 中用 var 创建)和全局变量。

于 2013-01-02T12:33:22.607 回答
-1

这是一个如何使用内部变量和全局变量的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();

​</p>

于 2013-01-02T13:01:21.183 回答