12

我一直在使用Stoyan Stefanov 的面向对象的 JavaScript学习 Javascript

他提供了一个比较全局和本地范围的示例:

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

看这个例子,我预计第一个警报是“123”,第二个警报是“1”。瞧,斯托扬说:

您可能期望第一个 alert() 将显示 123(全局变量 a 的值),第二个将显示 1(本地 a)。不是这种情况。第一个警报将显示“未定义”。这是因为在函数内部,局部作用域比全局作用域更重要。因此,局部变量会覆盖任何具有相同名称的全局变量。在第一次 alert() 时,a 尚未定义(因此值为 undefined),但它仍然存在于本地空间中。

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

4

2 回答 2

10

它没有覆盖全局变量。正在发生的事情称为“变量提升”。也就是说, avar a;被插入到函数的顶部。

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

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

经验教训:始终在使用变量之前声明它们。有人会说在函数顶部声明所有变量。

于 2012-08-13T17:06:59.053 回答
3

简而言之,首先考虑变量和函数的所有声明。所以 localvar a实际上只会在本地范围内覆盖全局变量,并且没有值,即undefined. 所以第一个警报会显示undefined。第二个警报将显示 1 之后的样子a = 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();
于 2012-08-13T17:15:07.893 回答