ステップ 1. 定義後: 定義された各関数には、オブジェクトのリストに対応する固有属性 [スコープ] があり、リスト内のオブジェクトには内部的にのみアクセスできます。
例: グローバル関数 A を作成した場合、A の [スコープ] 内部プロパティには 1 つのグローバル オブジェクト (グローバル オブジェクト) のみが含まれます。また、A に新しい関数 B を作成した場合、B の [スコープ]属性には 2 つのオブジェクトが含まれており、関数 A の Activation オブジェクト オブジェクトが前にあり、グローバル オブジェクト (Global Object) が後ろにあります。
つまり、関数の [Scope] 属性内のオブジェクト リストの順序は、上位層関数の Activation オブジェクト オブジェクト、次に上位層、最も外側のグローバル オブジェクトまでです。
ステップ 2. 実行: 関数が実行されると、実行可能オブジェクト (実行オブジェクト) が自動的に作成され、スコープ チェーン (スコープ チェーン) にバインドされます。スコープ チェーンは、識別子解決のための次の 2 つの手順を通じて確立されます。
まず、関数オブジェクト[Scope]の内部プロパティ内のオブジェクトをスコープチェーンに順番にコピーします。
次に、関数が実行されると、新しい Activation Object オブジェクトが作成され、このオブジェクトには this の定義、パラメーター (引数)、およびローカル変数 (名前付きパラメーターを含む) が配置されます。スコープチェーンの前部。
スコープ チェーンの最終順序は、この関数のアクティベーション オブジェクト、次に上位層の関数のアクティベーション オブジェクト、次に上位層のアクティベーション オブジェクト、そしてグローバル オブジェクトになります。
js コードの実行中に識別子が見つかると、識別子の名前に基づいて実行コンテキスト (実行コンテキスト) のスコープ チェーン内で識別子が検索されます。スコープ チェーン内の最初のオブジェクト (関数のアクティブ化オブジェクト) から開始して、見つからない場合はスコープ チェーン内の次のオブジェクトを検索し、識別子の定義が見つかるまで同様に検索します。スコープ内の最後のオブジェクト (グローバル オブジェクト) が検索後に見つからない場合は、エラーがスローされ、未定義を求めるプロンプトが表示されます。
ここから得られる提案:
1. ローカル変数を使用してみる これは、上記のプロセスから派生したものだけではありません。これにより、検索時間が短縮されることがわかります (注: 一般に、これにはブラウザの最適化動作は含まれません)。
2. with ステートメントの使用は避けてください。実行コンテキスト(Execution Context)のスコープチェーンを変更し、先頭にオブジェクト(Variable Object)を追加するためです。同じことが、try-catch ステートメント内の catch ステートメント ブロックにも当てはまります。