js閉パケット理解(回転)
1078 ワード
まず簡単なコードを見てみましょう
1.関数aを定義するとき、js解析器は関数の役割ドメインチェーン(scope chain)を決定し、aはグローバルな関数であるため、彼の役割ドメインチェーンにはwindowオブジェクトが1つしかない.
2.aが実行されると、aは対応する実行環境に入り、まずaにscope属性を追加し、その値は彼の役割ドメインチェーン(scope chain)である.
3.その後、実行環境でアクティブなオブジェクトが生成され、a役割ドメインチェーンの最上位にアクティブなオブジェクトが追加されます.アクティブなオブジェクトにはargumentsプロパティ(入力したパラメータを含む)が含まれます.
4.次に、a関数のすべての変数と関数を添付します.このステップではb関数の定義も完了し,関数bの役割ドメインチェーンがbで定義された環境,すなわちaの役割ドメインチェーンに設定される.
これで、関数a全体の定義から実行までのステップが完了する.このときaは関数bの参照をcに返し、また関数bの役割ドメインチェーンは関数aのアクティブオブジェクトへの参照を含み、すなわちbはaで定義されたすべての変数と関数にアクセスすることができる.関数bはcで参照され、関数bはまた関数aに依存するため、関数aは戻った後GCで回収されない.
関数bが実行されると、上記の手順と同様になります.従って、実行時のbの役割ドメインチェーンには、bのアクティブオブジェクト、aのアクティブオブジェクト、windowオブジェクトの3つのオブジェクトが含まれる.
関数bで変数にアクセスすると、検索順序は、まず自身のアクティブオブジェクトを検索し、存在する場合は戻り、存在しない場合は、関数aのアクティブオブジェクトを検索し続け、見つかるまで順次検索する.役割ドメインチェーン全体が見つからない場合はundefinedを返します.関数bにPrototypeプロトタイプオブジェクトが存在する場合は、自分のアクティブオブジェクトを検索した後、自分のプロトタイプオブジェクトを検索してから検索を続行します.これがJavascriptの変数検索メカニズムです.
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
これにより閉パケットが形成される1.関数aを定義するとき、js解析器は関数の役割ドメインチェーン(scope chain)を決定し、aはグローバルな関数であるため、彼の役割ドメインチェーンにはwindowオブジェクトが1つしかない.
2.aが実行されると、aは対応する実行環境に入り、まずaにscope属性を追加し、その値は彼の役割ドメインチェーン(scope chain)である.
3.その後、実行環境でアクティブなオブジェクトが生成され、a役割ドメインチェーンの最上位にアクティブなオブジェクトが追加されます.アクティブなオブジェクトにはargumentsプロパティ(入力したパラメータを含む)が含まれます.
4.次に、a関数のすべての変数と関数を添付します.このステップではb関数の定義も完了し,関数bの役割ドメインチェーンがbで定義された環境,すなわちaの役割ドメインチェーンに設定される.
これで、関数a全体の定義から実行までのステップが完了する.このときaは関数bの参照をcに返し、また関数bの役割ドメインチェーンは関数aのアクティブオブジェクトへの参照を含み、すなわちbはaで定義されたすべての変数と関数にアクセスすることができる.関数bはcで参照され、関数bはまた関数aに依存するため、関数aは戻った後GCで回収されない.
関数bが実行されると、上記の手順と同様になります.従って、実行時のbの役割ドメインチェーンには、bのアクティブオブジェクト、aのアクティブオブジェクト、windowオブジェクトの3つのオブジェクトが含まれる.
関数bで変数にアクセスすると、検索順序は、まず自身のアクティブオブジェクトを検索し、存在する場合は戻り、存在しない場合は、関数aのアクティブオブジェクトを検索し続け、見つかるまで順次検索する.役割ドメインチェーン全体が見つからない場合はundefinedを返します.関数bにPrototypeプロトタイプオブジェクトが存在する場合は、自分のアクティブオブジェクトを検索した後、自分のプロトタイプオブジェクトを検索してから検索を続行します.これがJavascriptの変数検索メカニズムです.