スコープチェーンの概念を要約すると、次のようになります。
Webページがロードされるとすぐに、Javascriptは関数定義を見つけて、それぞれにいわゆる変数オブジェクトを作成します。各VOは、各ローカル変数(またはグローバル)を参照する必要があるため、グローバルコンテキストまで、最初の祖先の関数から開始します。各関数のスコープチェーンは、Scopeという関数プロパティに格納されます。
さらに、関数が呼び出されると、新しいオブジェクトが作成されます:アクティベーションオブジェクト。
これは何ですか?:
これは、「引数」オブジェクトと仮パラメーターを含むすべての関数内部の変数オブジェクトを参照する役割を担う変数オブジェクト(実際にはVO)のように機能します。
もちろん、関数の祖先の変数オブジェクト+関数のアクティベーションオブジェクトで構成されるチェーンのそれぞれは、少なくともすべての変数をundefined
最初にマップします。次に、実行が進行する限り、値(参照される変数に対応)を更新することによって進化します。
ただし、Activation Objectは、 Argumentsオブジェクトが含まれているという理由だけで変数オブジェクトとは異なり、この事実により、関数が呼び出される前に作成できなくなることに気付きました。
それで、なぜJavascriptエンジンを構築した人々が、関数の定義ステップで各アクティベーションオブジェクトを割り当てなかったのだろうか。したがって、関数が呼び出されるときに、それがすでに存在するため、独自の特定のアクティベーションオブジェクトを作成する必要はありません。エンジンは、関数の実行の最後に対応する引数オブジェクトをクリアするだけなので、このオブジェクトへの次の呼び出しは副作用なしに可能になります。
パフォーマンスが向上する可能性はありますか?実際、呼び出しごとにアクティベーションオブジェクト全体を再作成すると、消費される可能性があります。または、この提案に問題がありますか?