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

Ray*_*jax 3 javascript

function a(){
    var h = 1;
    function b(){
        alert(h);
    }
    b();
}
a();
Run Code Online (Sandbox Code Playgroud)

警报1 ;

function a(){
    var h = 1;
    function b(){
        if(false){
            var h = h * 2;
        }
        alert(h);
    }
    b();
}
a();
Run Code Online (Sandbox Code Playgroud)

警报未定义.为什么?

the*_*eye 5

变量声明将移动到它们定义的作用域的顶部,并且不会分配值,直到执行赋值行.所以,你的第二个代码可以理解为

function a() {
    var h = 1;

    function b() {
        var h;
        if (false) {
            h = h * 2;
        }
        alert(h);
    }
    b();
}
a();
Run Code Online (Sandbox Code Playgroud)

即使您已hif子句中定义,因为JavaScript没有块作用域,变量声明实际上移动到函数的顶部.并且由于if条件不满足,h因此永远不会赋值.这就是它提醒的原因undefined