1. JavaScript 関数のスコープ チェーンは、定義時スコープ チェーンと実行時スコープ チェーンに分割されます。
2. 関数が定義されると、その定義スコープ チェーン [[scope]] を示す属性 [[scope]] が設定されます。関数の定義スコープ チェーン [[scope]] は常に次の規則に従います。それが配置されている外部関数の実行スコープ チェーン。
3. グローバル関数の定義スコープ チェーンには window の属性のみが含まれます。
4. 関数が実行されると、スコープ チェーンは常に、定義時にスコープ チェーンの先頭にある現在のアクティブ オブジェクトにプッシュされます (スコープ チェーンには、これ、引数、パラメータ、およびローカル変数が含まれます)。
5. 関数が実行されるとき、変数のアドレス指定は常にスコープ チェーンの先頭から下方向に検索されるため、グローバル変数のアドレス指定速度は最も遅くなります。
6. 内部関数が実行されるときも、その完全なスコープ チェーンにアクセスできます。これが、クロージャが実行時に完成した外部関数によって定義された変数にアクセスできる理由です。
7. 関数の実行中に with ステートメントが検出されると、with で指定されたオブジェクトのすべての属性がスコープ チェーンの先頭として一時的にスコープ チェーンの先頭にプッシュされます。
8. 関数の実行で catch が発生すると、catch で指定されたエラー オブジェクトがスコープ チェーンの先頭として一時的にスコープ チェーンの先頭にプッシュされます。
理解を深めるために、例を示してスコープ チェーンを描いてみましょう。
そのようなコードがあります:
次のようにコードをコピーします。
関数 assignEvents(){
var id = "xdi9592";
document.getElementById("save-btn").onclick = function(event){
saveDocument(id);
};
}
この関数 Closure によって生成された匿名クロージャを呼び出し、assignEvent が実行されたときのスコープ チェーンと Closure が定義されたときのスコープ チェーンを示す次の図を描画します。