Javascript全局变量范围问题

Jér*_*nge 6 javascript scope global-variables

我遇到了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();
Run Code Online (Sandbox Code Playgroud)

为什么Javascript不引发未定义的问题someF2()?怎么来someF2()访问someGlobal,而someF()不是?如何确保函数中可以访问全局变量?

备注:

在这两种情况下,函数都是通过调用开始的alert(someglobal),为什么一个函数抛出一个未定义的问题而另一个函数没有?

Que*_*tin 7

someF创建一个名为someGlobal(掩盖全局someGlobal)的新(本地作用域)变量并为其赋值.它不会触及全局someGlobal(虽然无法访问它,因为在范围内有另一个具有相同名称的变量).

var声明悬挂,所以someGlobal被屏蔽了所有someF(不仅仅是后var声明).当地的值someGlobalundefined直到值分配给它.

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