0

可能的重复:
可变提升

    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();

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

4

3 回答 3

4

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

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

那是,

function changeGlobal(){
    alert(a); //why is 'a' undefined here?
    if(a){ 
    var a = "local";
    alert(a);
    }
}

相当于

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);
    }
}
于 2012-11-17T03:18:31.100 回答
2

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

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

于 2012-11-17T03:21:38.880 回答
1

JavaScript 具有词法作用域,其中一个变量可以从它被var编辑的程序/函数中取消引用,然后向下(如引用它不会抛出ReferenceError.语句也
var被提升,并且初始值设置为undefined.

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

结合起来,这就是您所观察到的 - 一个局部 var 遮蔽了全局 var。

于 2012-11-17T03:34:50.343 回答