本頁の目次 目次 次頁: 11_Expressions 前頁: 9_Type_Conversion
制御が ECMAScript の実行可能コードに転送される時に、制御は 実行コンテキスト に入る。アクティブな実行コンテキストは論理的にスタックを形成する。この論理的スタック上の実行コンテキストの頂点が、実行される実行コンテキストである。
Function オブジェクトには 2 種類ある:
Function
オブジェクトを使用して動的に生成される。parseInt
や Math.exp
のような、言語の組込みオブジェクトである。実装は、本仕様に記述されない実装依存の内部関数を提供してもよい。これらの関数は ECMAScript 文法に記述される実行可能コードを含まない。従ってそれらは実行コンテキストのこの議論から除外される。ECMAScript の実行可能コードの種類は 3 つある:
各実行コンテキストは 変数オブジェクト (variable object) に結び付けられている。ソーステキスト内に宣言された変数と関数は変数オブジェクトのプロパティに追加される。関数コードについては、パラメータが変数オブジェクトのプロパティに追加される。
どのオブジェクトが変数オブジェクトに使われるか、どの属性がプロパティに使われるかは、コードの型に依存する。しかし、後の振る舞いは総括的である。実行コンテキストに入ると、プロパティは次の順に変数オブジェクトに結び付けられる:
各実行コンテキストは スコープ連鎖 (scope chain) に関連付けられている。スコープ連鎖はオブジェクトのリストで、Identifier の評価の際に検索される。制御が実行コンテキストに入るとき、コード型毎にオブジェクト集合の初期値を伴うスコープ連鎖が生成され、組み込まれる。実行コンテキスト内における実行の間、実行コンテキストのスコープ連鎖は with
文(12.10) と catch
クローズ(12.14) によってのみ影響を及ぼされる。
実行中、構文的生成規則 PrimaryExpression : Identifier は次のアルゴリズムで評価される:
識別子評価の結果は常に、識別子文字列と等しいメンバ名成分を持つ Reference 型の値である。
制御が任意の実行コンテキストに入る前に生成される、一意的な グローバルオブジェクト (セクション15.1) が存在する。最初はグローバルオブジェクトは次のプロパティを持つ:
制御が実行コンテキストに入り、ECMAScript コードが実行されれば、グローバルオブジェクトに追加プロパティを追加しても、初期のプロパティを変更してもよい。
関数コードによって制御が実行コンテキストに入るとき、 Activation オブジェクトと呼ばれるオブジェクトが生成され実行コンテキストに結び付けられる。 Activation オブジェクトは属性 { DontDelete } のプロパティ arguments で初期化される。このプロパティの初期値は下に述べる arguments オブジェクトである。
Activation オブジェクトは変数の実体化を目的とした変数オブジェクトとして使用される。
Activation オブジェクトは純粋に仕様のメカニズムである。 Activation オブジェクトへのアクセスは ECMAScript プログラムには不可能である。 Activation オブジェクトのメンバへのアクセスは可能だが、 Activation オブジェクト自身へのアクセスはできない。基準オブジェクトが Activation オブジェクトである Reference 値に呼出操作が適用されるとき、その呼出の this
値として null が使われる。
アクティブな実行コンテキストそれぞれに結び付けられる this
値がある。this 値は呼出側と実行されるコード型に依存し、制御が実行コンテキストに入るときに決定される。実行コンテキストに結び付けられる this
値は不変である。
関数コードによって制御が実行コンテキストに入るとき、 arguments オブジェクトが作成され次のように初期化される:
各関数とコンストラクタの呼出は、新しい実行コンテキストを開始する。関数がそれ自身の再帰的呼出であっても、各リターンは実行コンテキストを終了する。投げられた例外が受け取られない場合は、一つ以上の実行コンテキストを終了してよい。
制御が実行コンテキストを開始するとき、スコープ連鎖が生成・初期化され、変数の実体化が行われ、this 値が決定される。
スコープ連鎖の実体化、変数の実体化、this 値の決定は、開始するコード型に依存する。
this
値はグローバルオブジェクトである。制御が eval コードの実行コンテキストを開始するとき、前のアクティブな実行コンテキストは、 呼出コンテキスト として参照され、スコープ連鎖、変数オブジェクト、 this
値の決定に使用される。呼出コンテキストがなければ、スコープ連鎖、変数の実体化、this 値の決定の初期化は、グローバルコードとして行われる。
with
宣言および catch
クローズによって呼出コンテキストのスコープ連鎖に追加されるオブジェクトを含む。this
値は呼出コンテキストの this
値と同じである。this
値は呼出側が提供する。呼出側が提供する this
値がオブジェクトでない場合(null である場合を含む)、 this
値はグローバルオブジェクトとする。