JS におけるスコープの概念:
変数や関数が動作する領域を示し、それらが実行されるコンテキスト、つまりコンテキスト実行環境を指します。 Javascript にはグローバル スコープとローカル スコープの 2 つのスコープしかありません。これらは関数によって区別されます。
最初にいくつかの質問を見てみましょう:
if(true){
var aa= "bb";
}
console.log(aa); 🎜>for(var i = 0; i //do
}
console.log(i); //100
2 .
コードをコピーします
コードは次のとおりです。 var bb = '11111'; 🎜>function aa() { alert(bb);//undefine
var bb = 'test';
alert(bb);//test
var cc = "test1"; 🎜>alert(age);/ /構文エラー
}
aa();
コードをコピーします
コードは次のとおりです。
bb();//alert(1111111);
4.
コードをコピーします
コードは次のとおりです:
alert(typeof aa); //function
alert(typeof bb); //関数定義
コードをコピー
コードは次のとおりです。
function aa(){
var bb = "test"; cc = "テスト";
}
aa();
1. ブロックレベルのスコープはありません
最初の質問からわかるように、{} では、実行後も変数は破棄されませんが、メモリ内にまだ保存されているため、アクセスできます。
2. JavaScript の関数は、実行されるスコープではなく、定義されているスコープで実行されます。
関数スコープ チェーンの概念については、ECMA262 で説明されています。
任意の実行コンテキスト時のスコープはスコープ チェーンによって実装されます。
関数が定義されると、定義時のスコープは [ にリンクされます。
関数オブジェクトが呼び出されるとき、アクティブなオブジェクト (つまり、オブジェクト) が作成され、各関数の仮パラメータはアクティブなオブジェクトの名前付き属性として名前が付けられます。オブジェクトを作成し、この時点でこのアクティブ オブジェクトをスコープ チェーンのフロント エンドとして使用し、この関数オブジェクトの [[scope]] をスコープ チェーンに追加します。
質問 3 結果は、alert(1111111) になります。
3. JS は関数定義と var キーワードを事前に処理します
質問 4 と同様に、alert(bb) を開始します。 //undefine,alert(age) //構文エラー、何理由は、最後に var bb = "test" があるためです。var キーワードは初期化時に事前に処理されますが、最初には割り当てられていません。
コードを修正してください。このように、
コードをコピーします
コードは次のとおりです:
var dd = '11111 ';
function aa() {
alert(bb);//undefine
var bb = 'test';//test
; cc = "test1 ";
alert(age);//構文エラー
}
aa();//11111 alert(cc);//構文エラー ここでは、alert(bb) は構文エラーを報告しませんが、alert(age) は構文エラーを報告します。
ただし、次の点にご注意ください:
コードをコピーします
コードは次のとおりです:
<script> <br>alert(typeof aa); // 結果: 未定義 <br><script> '); </div>} <br></script>
これは、js のプリコンパイルがセグメントに基づいていることを示しています。質問 4 も同様
4. 関数レベルのスコープ
関数内で定義された変数は、関数の実行後に破棄され、メモリ領域を占有しなくなります。
したがって、質問 2 は、alert(cc) で終了し、構文エラーが報告されます。質問 5 は、同様に、alert(bb) で終了します。