2017-04-21 18 views
2

JSホイストの値を更新するためのこの簡単なプログラムを作成します。しかし、私の理解によると、グローバルxは更新する必要がありますが、アップデートしていません。関数のグローバル変数が更新されない

x = 5; 
var w = function(){ 
    x = 7 
    var x; 
    console.log(x); 
    x = 10; 
    console.log(x); 
}; 
w(); 
console.log(x); 

出力:それはグローバルXを更新しなかった理由

は、誰もがより詳細に説明してもらえますか?

Javascriptは値の参照に基づいていますので、x = 7と書くと、グローバルxを更新する必要があります。しかし、それはしないでください! x = 7が機能しないのはなぜですか?

ありがとうございます!

+0

関数内で再宣言する 'x'は、グローバルなものをシャドウします。 –

+0

ねえ、私はちょうど私の質問を更新しました。私はjsで良い経験をしています。だから私はscopingについてのアイデアを持っていると私はこの問題を解決する方法。しかし、私はちょうどx = 7が更新されない理由を知りたいですか? –

+0

x = 7の後にローカルxを定義するので、x = 7はグローバルを更新し、コンパイラは次の行に移動します。しかし、x = 7はグローバルに更新されませんでした。これが私の主な関心事ですか? –

答えて

2

xを関数のローカルスコープに再宣言したためです。それはあなたがグローバルなものの代わりに10を割り当てたものです。

ディッチvar x;となります。言われていること

x = 5; 
var w = function(){ 
    x = 7 
    // var x; 
    console.log(x); 
    x = 10; 
    console.log(x); 
}; 
w(); 
console.log(x); 

、何はおそらくあなたがhoisting

巻き上げは、現在のスクリプトの先頭または現在の(現在のスコープの先頭にすべての宣言を移動するのはJavaScriptのデフォルトの動作である不可解です関数)。

x = 5; 
var w = function(){ 
    x = 7 
    var x; // this is moved to the top of the local scope 
    console.log(x); 
    x = 10; 
    console.log(x); 
}; 
w(); 
console.log(x); 
+0

あなたは答えを補完することができます.Javascriptでのスコーピングの仕方を説明し、関数内のxの再宣言がグローバルxをオーバーロードするのはどうしてですか? – Lixus

+0

@Lixus "編集"ボタンを押すことによっても同様にできます。 –

+0

だから、関数内のグローバル変数と任意の点グローバル変数と同じ名前の同じローカル変数名を定義します。グローバル関数のすべての更新はリセットされますか? –

4

あなたが関数内の変数を宣言した瞬間、それが原因スコープ規則は、外側に、内側から仕事のやり方にグローバル変数をマスクします。したがって、関数レベルvar x変数が最初に見つけられ、期待したグローバル変数ではありません。これに

function(){ 
    x = 7 
    var x; 
    console.log(x); 
    x = 10; 
    console.log(x); 
} 

JSからあなたの関数を変換

function(){ 
    var x; 
    x = 7 
    //var x; 
    console.log(x); 
    x = 10; 
    console.log(x); 
} 

をあなたの質問に、X = 7を更新して、VAR xを宣言については、私はもう少しそれを説明しましょう。 JavaScriptコードは実行されただけではなく、コンパイル段階もあります。このフェーズでは、var宣言は関数内で調べられます(他の多くの事柄とは別に、私は手元の質問に固執しています)。 見つかった場合は、関数の先頭に移動します。これは巻上げと呼ばれます。現時点では、コードがJSによって変更されていると考えることができます(var宣言と割り当ての順序は今は関係ありません)。コードが解釈されていると思うなら、順序は問題ですが、私が言ったように、コンパイル段階のために吊り上げが発生し、これらの言葉で考えることはあなたの混乱を引き起こしません。一度コンパイルから見ると、角度をつかんで、物事がはっきりと見えます。

希望すると助かります! さらなる調査のために、javascriptの権限を持つKyle Simpsonを読んで聞いてください。

+0

はいそうでした。ありがとう!あなたはとても感謝して答えます。 –

0

ローカル変数は他の変数よりも優先順位が高く、グローバル変数とローカル変数に適切な命名規則を使用して、この種のエラーが発生しないようにしてください。 巨大なプロジェクトでは検出が困難です。

関連する問題