【问题标题】:Why is function variable undefined when var comes after it?为什么函数变量在 var 后面时未定义?
【发布时间】:2012-05-31 14:24:11
【问题描述】:

我读过一个很好的做法是在每个函数的顶部放置一个定义所有局部变量的 var 语句。下面的代码说明了为什么这是一个好主意,因为显然 var after 使用了一个变量使其未定义。

但是谁能告诉我为什么会这样?

<html>
    <head>
        <script type="text/javascript">
            window.onload = function() {
                var a=1;
                function foo() {
                    //a = 2; //outputs 2,2 because this overwrites the external variable value
                    //var a = 2; //outputs 2,1 because the "var" keyword creates a second variable with local scope which doesn't affect the external variable 
                    console.log(a);
                    var a = 3; //ouputs "undefined,1" ???
                }
                foo();
                console.log(a);
            };
        </script>
    </head>
    <body>

    </body>
</html>

【问题讨论】:

    标签: javascript var


    【解决方案1】:
    function foo() {
      console.log(a);
      var a = 3;
    }
    

    等价于

    function foo() {
      var a;
      console.log(a);
      a = 3;
    }
    

    因为在 JavaScript 变量中 declarations 被提升,但 initializers 没有。

    您可以通过以下示例看到这确实是正确的:

    e = 0;
    function foo() {
      e = 1;
      try {
        throw 2;
      } catch (e) {
        var e = 3;
        alert("In catch " + e);
      }
      alert("Before end of function " + e);
    }
    foo();
    alert("Outside function " + e);
    

    哪些警报

    在捕获 3
    功能 1 结束前
    外部函数 0

    因为变量声明被提升所以函数外的e不会被e = 1改变,但是e = 3出现在catch内部所以3不会影响e函数结束,而不是覆盖异常值。

    【讨论】:

    • 吊装有时会很痛苦。
    • 说得有道理,又一个 JavaScript 怪事,谢谢
    • @JosephtheDreamer,真正的痛苦来自半生不熟的吊装。 with ({ x: 4 }) { var x = 5; } return x
    • @MikeSamuel — 没有这样的东西,你所拥有的是 x 作为对象属性和作为局部变量,它们是完全不同的东西。而“提升”是令人困惑的行话。更好的解释是,在 javascript 中,声明是在任何代码执行之前处理的。
    • @RobG,您所拥有的是对看起来像声明一部分的属性的赋值。这就是为什么我将吊装称为“半生不熟”。
    猜你喜欢
    • 2021-01-18
    • 2016-05-06
    • 2014-06-21
    • 2012-01-13
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多