关于局部变量影响全局变量:局部变量影响全局变量 – Javascript变量范围

Local variable impact global variable - Javascript variable scoping

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
variable hoisting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    var a ="global";

    //version 1
    function changeGlobal(){
        alert(a); //why is 'a' undefined here?
        if(a){
        var a ="local";
        alert(a);
        }
    }
    //version 2
    function changeGlobal(){
        alert(a); //why is 'a' 'global' here? what diff does 'var a="local"' make?
        if(a){
        //var a ="local";
        alert(a);
        }
    }
    changeGlobal();

问题是内联的。 帮助我理解变量范围。


在javascript中,变量声明被"提升"到函数的顶部,与您声明它们的位置无关。

因此,在changeGlobal的第一个变体中,当您声明var a ="local"时,a变量声明将被提升到顶部。变量的赋值也不会被提升,所以当你提醒a时,它是一个未赋值的变量,因此是未定义的。

那是,

1
2
3
4
5
6
7
function changeGlobal(){
    alert(a); //why is 'a' undefined here?
    if(a){
    var a ="local";
    alert(a);
    }
}

相当于

1
2
3
4
5
6
7
8
function changeGlobal(){
    var a;    // hoisted here (not assigned a value yet)
    alert(a); //why is 'a' undefined here?
    if(a){
    a ="local"; // only assigned a value here
    alert(a);
    }
}

在版本1中,您声明一个名为a的局部变量,该变量优先于changeGlobal函数中的全局a。即使它是在alert(a);调用之后定义的,它的定义也是"悬挂"直到范围的开头,但是直到var a ="local";行才会被初始化。这就是alert(a);显示undefined的原因。

在版本2中,因为没有本地a,所以您总是处理在函数运行之前已经初始化的全局a


JavaScript具有词法作用域,其中变量可以从程序/函数中取消引用,其中var ed和down(因为,引用它不会抛出ReferenceError
var语句也将被提升,初始值设置为undefined

或者以外行术语来说,变量的作用域是它们定义的函数,并且所有变量在函数执行期间的任何时候都可用,尽管可能尚未赋值。

结合起来,这就是你所观察到的 - 一个局部变量阴影全局变量。