テキスト
クロージャの概念:
クロージャは、多くの変数とこれらの変数にバインドされた環境を持つ式 (通常は関数) であり、したがって、これらの変数は式の一部でもあります。
最も一般的なクロージャ
関数 a() {
var i=0;
return function(){
alert(i );
}
var b= a( );
for(var i=0;ib()
}
上記のコードを説明する前に、まず a を受け入れます。 関数の作成と実行のプロセス
最初のステップ: 関数を定義し、環境を設定し、スコープ チェーンを作成します。 a はグローバル変数であり、a のスコープ チェーンには 1 つの変数しかありません。 window
ステップ 2: a を実行し、最初にスコープ (a.scope=a) を作成し、次にアクティブ オブジェクト (callObject) を作成し、callObject を a のスコープ チェーンの先頭に置きます。 a のスコープ チェーンには 2 つのオブジェクト (a と window) が含まれます
ステップ 3: アクティブ オブジェクトに argument 属性を追加して、a を呼び出すときにパラメーター値を保存します
ステップ 4: 仮パラメーターと内部変数 アクティブなオブジェクトに移動
javascriptGC 原則: オブジェクトが参照されなくなった場合、そのオブジェクトは GC によってリサイクルされます。 2 つのオブジェクトが干渉することなく相互に参照している場合、両方のオブジェクトもリサイクルされます。
概要:
1. 最初に a を定義するときに、a のスコープ チェーンが作成されます。
2. スコープの作成時に (var b=a()) が実行されます。 a.scope=a、callObject オブジェクトを作成し、それを a
のスコープに追加します。 3. argument 属性を a オブジェクトに追加し、i 関数と return 関数をアクティブ オブジェクト
4. aが実行されると、bはaのruturn関数の値を指し、bはaのローカル変数iを参照するため、アクティブなオブジェクトaはリサイクルされません。 b は i にアクセスします。これは初めてアクセスされるオブジェクトであり、b でのみアクセスできます。