JavaScript の変数スコープを学習する前に、いくつかの点を明確にする必要があります:
a. JavaScript の変数スコープは、独自のスコープ チェーンに基づいています。
b. JavaScript にはブロックレベルのスコープがありません。
c. 関数内で宣言された変数は関数全体で定義されます。
1. JavaScript スコープ チェーン
まず、次のコードを見てください。
コードを確認します。 JavaScript はまず、変数 Rain が内部関数で定義されているかどうかを確認します。定義されている場合は、内部関数の Rain 変数が使用されます。Rain 変数が内部関数で定義されていない場合、JavaScript は Rain 変数が定義されているかどうかを引き続き確認します。このコードでは、rain 変数が Rainman 関数本体で定義されていないため、JavaScript エンジンは引き続き (グローバル オブジェクトを) 検索して、グローバル オブジェクトに Rain が定義されているかどうかを確認します。 Rain = 1 と定義されているため、最終結果は「1」と表示されます。
スコープ チェーン: JavaScript が変数をクエリする必要がある場合 2 つのオブジェクトが定義されていない場合、検索は続行されます。
上記のコードには、inner、rainman、window の 3 つのスコープ チェーン オブジェクトが順に含まれています。
2. 関数本体内では、ローカル変数は同じ名前のグローバル変数よりも優先されます。
コードをコピー
コードは次のとおりです: function Rain(){ var x = 1;
function man(){
x = 100;
}
man(); // 電話
alert( x ); // ここに 100 が表示されます
}
rain(); // 雨を呼び出します
上記のコード 変数 x が Rain 関数本体全体で使用でき、再代入できることを示しています。このルールにより、「信じられない」結果が生成されます。次のコードを観察してください。
これは、関数 Rain 内のローカル変数 x が関数本体全体で定義されているため (var x= 'rain-man'、宣言済み)、同じ名前のグローバル変数 x が Rain 関数本体全体に隠蔽されているためです。 。ここで「未定義」が表示されるのは、alert(x) が初めて実行されるとき、ローカル変数 x がまだ初期化されていないためです。
コードをコピー
コードは次のとおりです:
6. グローバル変数はすべてウィンドウ オブジェクトの属性です
次のコードと同等