了解全球,;Javascript中的局部作用域

了解全球,;Javascript中的局部作用域,javascript,Javascript,我一直在学习使用Javascript 他举了一个比较全局范围和局部范围的例子: var a = 123; function f() { alert(a); var a = 1; alert(a); } f(); 看看这个例子,我希望第一个警报是“123”,第二个警报是“1”。瞧,斯托扬说: 您可能希望第一个警报()将显示123(值为 全局变量a)和第二个变量将显示1(局部变量a)。 事实并非如此。第一个警报将显示“未定义”。这是 因为在函数内部,局部作用域比 全球范围。

我一直在学习使用Javascript

他举了一个比较全局范围和局部范围的例子:

var a = 123;
function f() {
    alert(a);
    var a = 1;
    alert(a);
}
f();
看看这个例子,我希望第一个警报是“123”,第二个警报是“1”。瞧,斯托扬说:

您可能希望第一个警报()将显示123(值为 全局变量a)和第二个变量将显示1(局部变量a)。 事实并非如此。第一个警报将显示“未定义”。这是 因为在函数内部,局部作用域比 全球范围。因此,局部变量会用 同名。在发出第一个警报时()尚未定义 (因此该值未定义),但它仍然存在于局部空间中


解释我不清楚,局部变量如何在第一次警报中覆盖全局变量?任何其他/不同的解释都将不胜感激。

它不会覆盖全局变量。正在发生的事情被称为“可变提升”。即a
var a插入到函数的顶部

脚本引擎将脚本更改为以下内容:

var a = 123;
function f() {
    var a;
    alert(a);
    a = 1;
    alert(a);
}
f();

要学习的课程:在使用变量之前始终声明它们。有些人会说在函数顶部声明所有变量。

简单地说,变量和函数的所有声明都是首先考虑的。因此,有效的局部
var a
将只覆盖局部范围内的全局变量,并且没有任何值,即
未定义的
。因此,第一个警报将显示
未定义
。第二个警报将在
a=1
之后显示1。这只在局部发生,全局变量a的值为123,不会更改

另一个使用函数演示其工作原理的示例

 function show(){
    alert("I am global");
 }

 function f() {

    show();

    show = function(){
       alert("I am second");
    }  

    show();   

    function show(){
        alert("I am first");
    }

}
f();
show();

谢谢你,胡安。我猜你会对作者使用“覆盖”一词表示异议?我开始认为如果我在函数外调用alert(a)是用词不当的b/c,我得到了'123',这意味着没有覆盖,只有两个'a'变量,一个全局变量和一个局部变量。覆盖不是正确的术语,局部变量会影响全局变量,但真正的问题是要理解,如果你在函数中的任何地方都有一个
var
,那么即使在它被声明之前,全局函数在整个函数中都是隐藏的。我不明白这个例子如何帮助理解变量,你甚至没有一个局部var。答案中的单词似乎是正确的(尽管令人困惑),但这个例子使这一点更加令人困惑