ホームページ  >  記事  >  ウェブフロントエンド  >  JS関数の実行環境とスコープチェーンの詳細な分析_JavaScriptスキル

JS関数の実行環境とスコープチェーンの詳細な分析_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 18:42:48956ブラウズ

ステップ 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 ステートメント ブロックにも当てはまります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。