了解Global& Javascript中的本地范围

时间:2012-08-13 17:05:30

标签: javascript

我一直在使用Object-Oriented JavaScript by Stoyan Stefanov

学习Javascript

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

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

看一下这个例子,我预计第一个警报为'123',第二个警报为'1'。瞧,斯托扬说:

  

您可能希望第一个alert()显示123(值为   全局变量a)和第二个将显示1(本地a)。   不是这种情况。第一个警报将显示“未定义”。这是   因为在函数内部,局部范围比重要   全球范围。所以局部变量用。覆盖任何全局变量   同名。在第一次警报时()a尚未定义   (因此值未定义)但它仍然存在于本地空间中。

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

2 个答案:

答案 0 :(得分:9)

它不会覆盖全局变量。发生的事情被称为“可变吊装”。也就是说,var a;会插入函数的顶部。

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

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

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

答案 1 :(得分:2)

简单来说,首先考虑变量和函数的所有声明。因此,本地var a实际上只会在本地范围内覆盖全局变量,并且没有值,即undefined。因此,首次提醒会显示undefined。第二个警报将显示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();