了解JavaScript中的全局和本地范围

Understanding Global & Local Scope in Javascript

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

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

1
2
3
4
5
6
7
var a = 123;
function f() {
    alert(a);
    var a = 1;
    alert(a);
}
f();

看这个例子,我期望第一个警报是"123",第二个警报是"1"。你看,斯托扬说:

You might expect that the first alert() will display 123 (the value of
the global variable a) and the second will display 1 (the local a).
This is not the case. The first alert will show"undefined". This is
because inside the function the local scope is more important than the
global scope. So a local variable overwrites any global variable with
the same name. At the time of the first alert() a was not yet defined
(hence the value undefined) but it still existed in the local space.

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


它不重写全局变量。所发生的事情被称为"可变吊装"。也就是说,在函数的顶部插入一个var a;

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

1
2
3
4
5
6
7
8
var a = 123;
function f() {
    var a;
    alert(a);
    a = 1;
    alert(a);
}
f();

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


简单来说,首先考虑变量和函数的所有声明。因此,实际中的局部var a只会覆盖局部范围内的全局变量,没有值,即undefined。因此,第一个警报将显示undefined。第二个警报将显示1,如同在a = 1之后一样。这只在本地发生,全局变量A的值为123,不会更改。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 function show(){
    alert("I am global");
 }

 function f() {

    show();

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

    show();  

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

}
f();
show();