6

私はJavascriptで奇妙なスコープの問題に遭遇しています(JSFiddleを参照):

var someGlobal = 3;

function someF() {
    // undefined issue
    alert(someGlobal);
    var someGlobal = 5;
    // Displays 5
    alert(someGlobal);
}

function someF2() {
    // Displays 3, why?
    alert(someGlobal);
}

someF();
someF2();

Javascriptが未定義の問題をスローしないのはなぜsomeF2()ですか?どうしてsomeF2()アクセスできるのsomeGlobalにアクセスできないのsomeF()ですか?関数でグローバル変数にアクセスできることを確認するにはどうすればよいですか?

述べる:

どちらの場合も、関数はを呼び出すことから始まりますalert(someglobal)。なぜ一方の関数は未定義の問題をスローし、もう一方はスローしないのですか?

4

4 に答える 4

7

someFsomeGlobal(グローバルをマスクする)という新しい(ローカルスコープの)変数を作成し、someGlobalそれに値を割り当てます。グローバルには影響しませんsomeGlobal(ただし、スコープ内に同じ名前の別の変数があるため、アクセスできません)。

varステートメントは吊り上げられているため、 (ステートメントの直後だけでなく)すべてに対してsomeGlobalマスクされます。ローカルの値は、値が割り当てられるまでです。someFvarsomeGlobalundefined

someF2元の(手つかずの)グローバルにアクセスしますsomeGlobal

于 2013-01-02T12:33:33.170 に答える
4

同じ名前のローカル変数を宣言しているので。そのため、ローカル変数に値を割り当てます。someF()のvar someGlobalからvarを削除するだけで、問題ないはずです。

var someGlobal = 3;

function someF() {
    // undefined issue
    alert(someGlobal);
    someGlobal = 5; // <-- orignially var someGlobal = 5
    // Displays 5
    alert(someGlobal);
}

function someF2() {
    // Should display 5 now
    alert(someGlobal);
}

someF();
someF2();
于 2013-01-02T12:33:09.293 に答える
1

someF2はまだ3であるため、3を表示します

someF()で、someGlobalと同じ名前の新しい変数を作成します。これは元のsomeGlobalには何もしません。ローカルで新しい変数を作成して、関数someFを作成し、その関数が終了すると消えます。

したがって、ローカル変数(たとえば、varを使用してsomeF内で作成されたもの)とグローバル変数があります。

于 2013-01-02T12:33:22.607 に答える
-1

someFこれは、を使用して内部でローカル変数とグローバル変数の両方を使用する方法の例ですthis

var someGlobal = 3;

function someF() {

    // Displays 3
    alert(someGlobal);
    this.someGlobal = 5;
    someGlobal = 5;
    // Displays 5
    alert(this.someGlobal);
}

function someF2() {
    // Displays 5
    alert(someGlobal);
}

someF();
someF2();

</ p>

于 2013-01-02T13:01:21.183 に答える