関連書籍: JavaScript プロトタイプとクロージャ シリーズについての私の理解を語る (Shuishhou Note 6)
範囲
for(var i = 0; i < 10; i++) { //不好的声明方式 //... } console.log(i); /*----------------------------------------------*/ var i = 0; //好的声明方式 for(i = 0; i < 10; i++) { //.... } console.log(i);
変数を宣言する場合、グローバル コードはフロントエンドで宣言され、関数内で宣言された変数は関数本体の前で宣言する必要があります。同時に、変数を宣言するときは「var」演算子を使用する必要があります。
var a = 10, //全局作用域 b = 20; function fn() { //fn函数作用域 var a = 100, c = 300; function bar() { //bar函数作用域 var a = 1000, d = 4000; } }
スコープは、関数が呼び出されたときではなく、関数が定義されたときに決定されます。
1. グローバル コンテキスト環境はプログラムのロード時に決定され、プログラムの実行時に変数に値が割り当てられます。
2. 36 行目まで実行し、fn(10) を呼び出し、fn 関数の実行コンテキストを作成し、スタックをプッシュし、このコンテキストをアクティブ状態に設定します。
4. bar(100) が呼び出された後、スタックからポップされ、bar(100) 関数コンテキストが破棄されます。次に、行 33 を実行して、bar(200) を呼び出し、bar(200) 関数の実行コンテキストを作成し、スタックをプッシュし、このコンテキストをアクティブ状態に設定します。
5. bar(200) への呼び出しが完了すると、それはスタックからポップされ、そのコンテキストは破棄されます。制御は fn(10) コンテキストに渡され、再びアクティブになります。
6. このとき、fn(10) が呼び出され、スタックからポップされ、そのコンテキストが破棄されます。制御はグローバル実行コンテキストに移されます。
このコード部分の実行プロセスはこの時点で完了しています。
概要: