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

どのアラート

キャッチ3
内機能終了前1
機能外0

変数宣言が持ち上げられているためe、関数の外側はによって変更されませんが、関数の内側で発生するe = 1ため、関数の最後のに影響を与えず、代わりに例外値を上書きします。e = 3catch3e

于 2012-05-25T00:28:21.993 に答える