如果在上部作用域中声明,则在本地作用域中未定义变量,并且在未执行的语句中在本地作用域中声明具有相同名称的var

时间:2014-07-18 15:31:10

标签: javascript

function a(){
    var h = 1;
    function b(){
        alert(h);
    }
    b();
}
a();

提醒 1 ;

function a(){
    var h = 1;
    function b(){
        if(false){
            var h = h * 2;
        }
        alert(h);
    }
    b();
}
a();

提醒未定义。为什么?

3 个答案:

答案 0 :(得分:5)

变量声明被移动到它们定义的作用域的顶部,并且未分配值,直到执行赋值行。因此,您的第二个代码可以理解为

function a() {
    var h = 1;

    function b() {
        var h;
        if (false) {
            h = h * 2;
        }
        alert(h);
    }
    b();
}
a();

即使您在h子句中定义了if,由于JavaScript没有块作用域,因此变量声明实际上已移到函数的顶部。由于不满足if条件,因此h永远不会赋值。这就是它警告undefined

的原因

答案 1 :(得分:4)

功能范围内的变量在整个功能范围内。 var在一个区块内并不重要。所以这个:

function b(){
    if(false){
        var h = h * 2;
    }
    alert(h);
}

等同于:

function b(){
    var h;
    if(false){
        h = h * 2;
    }
    alert(h);
}

周围的函数也有一个名为h的变量并不重要。

答案 2 :(得分:-1)

你要重新宣布' h'使用' var。'删除' var。'的第二个实例像这样:

function a(){
    var h = 1;
    function b(){
        if(false){
            h = h * 2;
        }
        alert(h);
    }
    b();
}
a();