9

myColorローカル コンテキストからアクセスできると思っていsayColor()ましたが、最初のアラートの後に myColor を宣言していてもそうではありません。なんで?

var myColor = "blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    var myColor = "green";
    alert(myColor); //green
}
sayColor();
4

4 に答える 4

17

ここで行われているのは「巻き上げ」と呼ばれるものです。use および function ステートメントを使用する変数宣言varは、それらを含むスコープの先頭に「巻き上げられ」ます。(ES6 以降では、セマンティクスが異なることに注意してくださいletconst)したがって、ブラウザの心には、コードは実際には次のようになります。

var myColor = "blue";
function sayColor() {
    var myColor;
    alert(myColor); //undefined expected blue
    myColor = "green";
    alert(myColor); //green
}
sayColor();

MDNから:

変数のすべての定義は、実際にはそのスコープの最上部での変数の宣言であり、定義がある場所での代入です。

于 2013-07-05T17:29:20.723 に答える
1

あなたはそれを再び宣言しているからです。

 var myColor = "green";

JavaScript では、関数がインタープリターによって実行される前に、関数全体をスキャンしてvar ...ステートメントを探します。そのため、関数の最初のステートメントが実行される前でも myColor 変数がリセットされます。

于 2013-07-05T17:29:30.143 に答える
1

関数内で変数を再度設定しています。ブラウザーは代入の前に関数を読み取っているため、未定義の結果が発生します。

あたりです。

var myColor = "blue";
function sayColor() {
    alert(myColor); //undefined expected blue
    myColor = "green";
    alert(myColor); //green
}
sayColor();
于 2013-07-05T17:29:03.300 に答える