当var出现之后,为什么函数变量未定义?

时间:2012-05-25 00:26:46

标签: javascript var

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

但有人可以告诉我为什么就是这种情况?

<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>

1 个答案:

答案 0 :(得分:4)

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

相当于

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

因为在JavaScript中变量声明被挂起但初始值设定项不是。

您可以通过以下示例看到这是真的:

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,而是覆盖异常值。