0

重複の可能性:
可変巻き上げ

    var a = "global";

    //version 1
    function changeGlobal(){
        alert(a); //why is 'a' undefined here?
        if(a){ 
        var a = "local";
        alert(a);
        }
    }
    //version 2
    function changeGlobal(){
        alert(a); //why is 'a' 'global' here? what diff does 'var a="local"' make?
        if(a){ 
        //var a = "local";
        alert(a);
        }
    }
    changeGlobal();

質問はインラインです。変数スコープを理解するのを手伝ってください。

4

3 に答える 3

4

javascriptでは、変数宣言は、宣言した場所に関係なく、関数の先頭に「持ち上げられ」ます。

したがって、changeGlobalの最初のバリエーションでは、を宣言するvar a = "local"と、a変数宣言が一番上に引き上げられます。変数の割り当ても引き上げられないため、アラートを出した時点ではa、割り当てられていない変数であるため、未定義です。

あれは、

function changeGlobal(){
    alert(a); //why is 'a' undefined here?
    if(a){ 
    var a = "local";
    alert(a);
    }
}

と同等です

function changeGlobal(){
    var a;    // hoisted here (not assigned a value yet)
    alert(a); //why is 'a' undefined here?
    if(a){ 
    a = "local"; // only assigned a value here
    alert(a);
    }
}
于 2012-11-17T03:18:31.100 に答える
2

バージョン 1 では、関数内でaグローバル変数よりも優先される名前のローカル変数を宣言します。呼び出し後に定義されますが、その定義はスコープの先頭まで「巻き上げ」られますが、行までは初期化されません。それがショーの理由です。achangeGlobalalert(a);var a = "local";alert(a);undefined

バージョン 2 では local がないため、関数が実行される前に既に初期化されaている global を常に扱っています。a

于 2012-11-17T03:21:38.880 に答える
1

JavaScriptには字句スコープがあり、変数を編集したプログラム/関数から逆参照したり、ダウンしたりできます(たとえば、変数を参照してもスローさ れvarませんReferenceError。ステートメントも引き上げられ、初期値はに設定されます。
varundefined

または、簡単に言えば、変数はそれらが定義されている関数にスコープされ、値がまだ割り当てられていない場合でも、すべての変数は関数の実行中の任意の時点で使用できます。

組み合わせて、これはあなたが観察しているものです-グローバル変数をシャドウイングするローカル変数。

于 2012-11-17T03:34:50.343 に答える