JavaScript 変数のスコープを学ぶ前に、いくつかの点を明確にする必要があります。
•JavaScript の変数スコープは、独自のスコープ チェーンに基づいています。
• JavaScript にはブロックレベルのスコープがありません。
• 関数内で宣言された変数は、関数全体で定義されます。
1. JavaScript スコープ チェーン
まず次のコードを見てください:
コードをコピーします コードは次のとおりです。 4;alert(rain); } inner(); //内部関数を呼び出します} Rainman(); //rainman 関数を呼び出します
コードを確認します。 。 JavaScript はまず、変数 Rain が内部関数で定義されているかどうかを確認します。定義されている場合は、内部関数の Rain 変数が使用されます。Rain 変数が内部関数で定義されていない場合、JavaScript は Rain 変数が定義されているかどうかを引き続き確認します。このコードでは、rain 変数が Rainman 関数本体で定義されていないため、JavaScript エンジンは引き続き (グローバル オブジェクトを) 検索して、グローバル オブジェクトに Rain が定義されているかどうかを確認します。 Rain = 1 と定義されているため、最終結果は「1」と表示されます。
スコープ チェーン: JavaScript が変数をクエリする必要がある場合 2 つのオブジェクトが定義されていない場合、検索は続行されます。
上記のコードには、inner、rainman、window の 3 つのスコープ チェーン オブジェクトが順に含まれています。
2. 関数本体内では、ローカル変数は同じ名前のグローバル変数よりも優先されます。
3. JavaScript にはブロックレベルのスコープがありません。
これは、他の言語に比べて JavaScript のより柔軟な部分でもあります。
次のコードを注意深く見てください。変数 i、j、k のスコープが同じであり、rain 関数本体全体でグローバルであることがわかります。
上記のコードは、変数 x が Rain 関数本体全体で使用でき、再割り当てできることを示しています。このルールにより、「信じられない」結果が生成されます。次のコードを観察してください。
は、関数 Rain 内のローカル変数 x が関数本体全体で定義されているためです (var x= 'rain-man'、宣言されています)。これは関数 Rain 内で宣言されています。同じ名前のグローバル変数 x は Rain 関数本体に隠されています。ここで「未定義」が表示されるのは、alert(x) が初めて実行されるとき、ローカル変数 x がまだ初期化されていないためです。
したがって、上記の Rain 関数は次の関数と同等です: