【问题标题】: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如果在上层范围内声明变量在局部范围内未定义,并且在未执行语句中在局部范围内声明了同名 var
【发布时间】:2014-07-18 15:31:10
【问题描述】:
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();

警报未定义。为什么?

【问题讨论】:

标签: javascript


【解决方案1】:

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

function a() {
    var h = 1;

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

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

【讨论】:

    【解决方案2】:

    函数范围内的变量在整个函数范围内。 var 在块内并不重要。所以这个:

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

    相当于这个:

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

    没关系,周围的函数也有一个名为h的变量。

    【讨论】:

    • 正如你在 thefourtheye 的同一时间发布的,但你暗示在这种情况下 a.h 在 b 范围内无关紧要,我接受了你的
    【解决方案3】:

    您正在使用 'var.' 重新声明 'h'删除“var”的第二个实例。像这样:

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

    【讨论】:

    • 我认为您可能错过了问题的重点。这段代码是专门为显示某种行为而设计的,OP 想知道它为什么会这样工作,而不是如何“修复”它。
    • 这与设置 a 范围的 h 的行为不同
    • 该问题的“解决方案”是将另一个具有 h 值的变量声明到 b 的范围内,并在其上应用 * 2,但正如 @JamesMontagne 所述,这不是问题
    • 对,我误会了。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多