2

我读过一个好的做法是在每个函数的顶部放置一个定义所有局部变量的 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>
4

1 回答 1

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

哪个警报

在 catch 3
函数结束之前 1 函数
外部 0

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

于 2012-05-25T00:28:21.993 回答