1

私はいくつかのシナリオを練習していて、ケースを見つけました:

ここにフィドルがあります

クロージャーバー関数によるとvar x、アラート1と条件がfalseになると予想していましif(!1)たが、アラートが発生しundefined、条件がtrueになり、2番目のアラートの値は10になります。

var x = 1;
function bar() {
    alert(x);
    if (!x) {
        var x = 10;
    }
    alert(x);
}
bar();

では、なぜ未定義のプロンプトが表示されるのか混乱していますか?

特定のスコープでの巻き上げによれば、常に最上位で定義されていると見なされる場所に変数を定義します。

巻き上げ効果が原因である場合でも、未定義の代わりに 10 を警告する必要があります。

4

2 に答える 2

5

巻き上げにより、変数は定義されずに、関数内のあらゆる場所で宣言されます。

の最初の行では、関数の 3 行目にbarあるvar xため、グローバルxがマスクされ、ローカルが表示されますx(これはundefined、まだ値が与えられていないためです)。

の 3 行目に、変数を定義する whichbarがあります。x = 10これは上げられません。

5 行目でアラートを出すと、それが定義されます。

上記のベン図

于 2014-01-13T16:56:22.030 に答える
1

巻き上げにより、コードは次のように効果的に機能します。

var x;
x = 1;
function bar() {
    var x; //same as var x = undefined;
    alert(x);
    if (!x) {
        x = 10;
    }
    alert(x);
}
bar();
于 2014-01-13T16:59:50.773 に答える