JavaScript全局变量作用域问题

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个回答

7

someF创建一个名为someGlobal的新变量(其遮盖了全局的someGlobal)并对其赋值。它不会触及全局的someGlobal(虽然不能访问它,因为在作用域中有另一个同名变量)。

var语句是被提升的,所以someGlobal被遮盖对于整个someF函数(而不仅仅是在var语句之后)。本地的someGlobal的值在赋值之前是undefined

someF2访问原始(未被触及的)全局someGlobal


+1 是最佳答案,但请描述得更多一些:全局变量会被函数中的局部变量覆盖。 - Muhammad Talha Akbar
它不会被覆盖,而是被掩盖。 - Quentin
你能给我简单解释一下这两个吗?我还没有研究过它们!仅对于该函数,它是否被覆盖? - Muhammad Talha Akbar
你是说因为 someF() 在第一个 alert() 之后声明了一个名为 someGlobal 的局部变量,这会影响到第一个 alert() 并导致它抛出未定义的问题? - Jérôme Verstrynge

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();

1

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

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

因此,您有局部变量(例如使用var在someF中创建的变量)和全局变量。


好的,但是为什么在一个情况下会出现未定义的问题而在另一个情况下却没有?这就是我的问题。 - Jérôme Verstrynge
我认为Quentin现在已经解释过了。 - Paul Collingwood

-1
这是一个关于如何使用本地变量和全局变量的例子,可以通过使用“this”在someF内部实现。
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 提供, 点击上面的
可以查看英文原文,
原文链接