3

私はjavascriptの初心者です.疑問があります.私のコードは次のとおりです.これを実行すると、最初の警告ボックスに「未定義」と表示されます.理由がわかりません.どうもありがとう..

<html>
<head>
<script type="text/javascript">
var a = 123;
   function foo()
   {
     alert(a);
     var a = 890;
     alert(a);
   }
     foo();
     alert(a); 
</script>
</head>
<body>
</body>
</html>
4

3 に答える 3

4

これは、巻き上げ後、実行前に、関数がfoo()内部的に次のようになるためです。

function foo() {
    var a; // declaration hoisted to top
    alert(a); // the local var is 'undefined' at this point
    a = 890; // assignment operation not hoisted
    alert(a);
}

巻き上げについて詳しくは、こちらをご覧ください。

于 2013-02-08T06:07:42.390 に答える
1

これは、変数宣言の巻き上げが原因だと思います。変数宣言は、そのスコープの先頭に引き上げられます。つまり、技術的には、コードは次のように実行されます。

var a;
a = 123;
function foo()
{
  var a;
  alert(a);
  a = 890;
  alert(a);
}
foo();
alert(a); 

このシナリオでaは、最初に値を使用してグローバルに定義されundefinedます。次に、その値が に設定され123ます。関数が呼び出されると、値をローカル変数として関数内ですぐにnewaが宣言されるため、最初に警告が表示されます。次に、その値を に設定します。したがって、関数の途中で使用しても、巻き上げのために、そのように実行されるわけではありません。undefinedundefined890var

于 2013-02-08T06:08:12.883 に答える
0

変数 a を 2 回初期化すると、奇妙な結果が得られます。今と同じように、スコープが 2 度異なります。

<html>
<head>
<script type="text/javascript">
var a = 123;
   function foo()
   {
     alert(a);
     a = 890;
     alert(a);
   }
     foo();
     alert(a); 
</script>
</head>
<body>
</body>
</html>
于 2013-02-08T06:09:46.300 に答える