如果在上层作用域中声明变量,则变量在局部作用域中是未定义的,并且在未执行的语句中在局部作用域中声明同名的变量

Variable is undefined in local scope if declared in upper scope and a var with same name is declared in local scope in an unexecuted statement

本文关键字:作用域 变量 局部 声明 执行 语句 如果 未定义      更新时间:2023-09-26
function a(){
    var h = 1;
    function b(){
        alert(h);
    }
    b();
}
a();
1 <<p>警报strong> ,
function a(){
    var h = 1;
    function b(){
        if(false){
            var h = h * 2;
        }
        alert(h);
    }
    b();
}
a();
<<p>警报strong>定义。为什么?

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

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

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

函数作用域中的变量在整个函数中都处于作用域中。var是否在块内并不重要。所以这:

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

等价于:

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

周围的函数也有一个名为h的变量。

您正在使用'var '声明'h' .删除'var '的第二个实例,如下所示:

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