本頁の目次 目次

10 実行コンテキスト (Execution Contexts)

制御が ECMAScript の実行可能コードに転送される時に、制御は 実行コンテキスト に入る。アクティブな実行コンテキストは論理的にスタックを形成する。この論理的スタック上の実行コンテキストの頂点が、実行される実行コンテキストである。

10.1 定義 (Definitions)

10.1.1 Function オブジェクト (Function Objects)

Function オブジェクトには 2 種類ある:

  • プログラム関数 は、ソーステキスト内に FunctionDeclaration で定義される。あるいは、 FunctionExpression かコンストラクタとしての組込み Function オブジェクトを使用して動的に生成される。
  • 内部関数 は、 parseIntMath.exp のような、言語の組込みオブジェクトである。実装は、本仕様に記述されない実装依存の内部関数を提供してもよい。これらの関数は ECMAScript 文法に記述される実行可能コードを含まない。従ってそれらは実行コンテキストのこの議論から除外される。

10.1.2 実行可能コードの種類 (Types of Executable Code)

ECMAScript の実行可能コードの種類は 3 つある:

  • グローバルコード は ECMAScript の Program として扱われるソーステキストである。個々の Program のグローバルコードは FunctionBody 部分として解析されるソーステキストを含まない。
  • eval コード は組込み eval 関数に提供されるソーステキストである。より正確には、組込み eval 関数のパラメータが文字列なら、それは ECMAScript の Program として扱われる。個々の eval 呼び出しのための eval コードは、文字列パラメータのグローバルコード部分である。
  • 関数コードFunctionBody 部分として解析されるソーステキストである。個々の FunctionBody の関数コードは、ネストされた FunctionBody 部分として解析されるソーステキストを含まない。関数コードはまた、コンストラクタとして組込み Function オブジェクトを使用する際提供されるソーステキストもあらわす。より正確には、 Function コンストラクタに提供される最後のパラメータは文字列に変換され FunctionBody として扱われる。 Function コンストラクタにひとつ以上のパラメータが供給されれば、最後の一つを除いた残りのパラメータすべてが文字列に変換され、カンマを区切りに連結される。その結果の文字列は最後のパラメータで定義される FunctionBody のための FormalParameterList として解釈される。 Function の個々のインスタンス化のための関数コードはネストされた FunctionBody 部分として解析されるソーステキストを含まない。

10.1.3 変数の実体化 (Variable Instantiation)

各実行コンテキストは 変数オブジェクト (variable object) に結び付けられている。ソーステキスト内に宣言された変数と関数は変数オブジェクトのプロパティに追加される。関数コードについては、パラメータが変数オブジェクトのプロパティに追加される。

どのオブジェクトが変数オブジェクトに使われるか、どの属性がプロパティに使われるかは、コードの型に依存する。しかし、後の振る舞いは総括的である。実行コンテキストに入ると、プロパティは次の順に変数オブジェクトに結び付けられる:

  • 関数コードでは: FormalParameterList で定義された仮引数ごとに、変数オブジェクトにプロパティを生成する。その名前は Identifier で、属性はコード型によって決定する。パラメータ値は呼出側によって [[Call]] の引数として供給される。呼出側が仮引数より少ないパラメータ値を供給するならば、余分な仮引数は値 undefined を持つ。 2 つ以上の仮引数が同じ名前のために同じプロパティを共有する場合、該当するプロパティは、後出のパラメータに供給された値を与えられる。この後出のパラメータ値が呼出側から供給されない場合、該当するプロパティの値は undefined である。
  • ソーステキスト順で、コード中の各 FunctionDeclaration 毎に、変数オブジェクトにプロパティを生成する。その名前は FunctionDeclarationIdentifier で、値にはセクション 13 に記述される Function オブジェクトの生成で返される結果が設定され、属性はコードの型によって決定する。変数オブジェクトが既にこの名前のプロパティを持っている場合、その値と属性を置換する。意味論的に、このステップは FormalParameterList プロパティの生成に続かなければならない。
  • コード中の各 VariableDeclaration あるいは VariableDeclarationNoIn 毎に、変数オブジェクトにプロパティを生成する。その名前は VariableDeclaration または VariableDeclarationNoIn 中の Identifier で、値は undefined 、属性はコードの型により決定する。変数オブジェクトが既にこの名前のプロパティを持っている場合、プロパティの値と属性は変更されない。意味論的に、このステップは FormalParameterListFunctionDeclaration のプロパティ生成に続かなければならない。宣言される変数が、宣言された関数や仮引数と同じ名前を持っている場合、変数宣言は特に既存のプロパティを妨害しない。

10.1.4 スコープ連鎖と識別子の解決 (Scope Chain and Identifier Resolution)

各実行コンテキストは スコープ連鎖 (scope chain) に関連付けられている。スコープ連鎖はオブジェクトのリストで、Identifier の評価の際に検索される。制御が実行コンテキストに入るとき、コード型毎にオブジェクト集合の初期値を伴うスコープ連鎖が生成され、組み込まれる。実行コンテキスト内における実行の間、実行コンテキストのスコープ連鎖は with 文(12.10) と catch クローズ(12.14) によってのみ影響を及ぼされる。

実行中、構文的生成規則 PrimaryExpression : Identifier は次のアルゴリズムで評価される:

  1. スコープ連鎖内で次のオブジェクトを取得する。一つもなければ、ステップ 5ヘ。
  2. Result(1) の [[HasProperty]] メソッドを呼び、プロパティとして Identifier を渡す。
  3. Result(2) が true ならば、基準オブジェクトが Result(1) でプロパティ名が Identifier である Reference 型の値を返す。
  4. ステップ 1 へ。
  5. 基準オブジェクトが null でプロパティ名が Identifier である Reference 型の値を返す。

識別子評価の結果は常に、識別子文字列と等しいメンバ名成分を持つ Reference 型の値である。

10.1.5 Global オブジェクト (Global Object)

制御が任意の実行コンテキストに入る前に生成される、一意的な グローバルオブジェクト (セクション15.1) が存在する。最初はグローバルオブジェクトは次のプロパティを持つ:

  • Math, String, Date, parseInt 等のような組込みオブジェクト。これらは属性 { DontEnum } を持つ。
  • ホストの定義する追加プロパティ。これはグローバルオブジェクト自身を値とするプロパティを含めてよい; たとえば、HTML 文書オブジェクトモデルにおけるグローバルオブジェクトの window プロパティは、グローバルオブジェクトそれ自身である。

制御が実行コンテキストに入り、ECMAScript コードが実行されれば、グローバルオブジェクトに追加プロパティを追加しても、初期のプロパティを変更してもよい。

10.1.6 Activation オブジェクト (Activation Object)

関数コードによって制御が実行コンテキストに入るとき、 Activation オブジェクトと呼ばれるオブジェクトが生成され実行コンテキストに結び付けられる。 Activation オブジェクトは属性 { DontDelete } のプロパティ arguments で初期化される。このプロパティの初期値は下に述べる arguments オブジェクトである。

Activation オブジェクトは変数の実体化を目的とした変数オブジェクトとして使用される。

Activation オブジェクトは純粋に仕様のメカニズムである。 Activation オブジェクトへのアクセスは ECMAScript プログラムには不可能である。 Activation オブジェクトのメンバへのアクセスは可能だが、 Activation オブジェクト自身へのアクセスはできない。基準オブジェクトが Activation オブジェクトである Reference 値に呼出操作が適用されるとき、その呼出の this 値として null が使われる。

10.1.7 this

アクティブな実行コンテキストそれぞれに結び付けられる this 値がある。this 値は呼出側と実行されるコード型に依存し、制御が実行コンテキストに入るときに決定される。実行コンテキストに結び付けられる this 値は不変である。

10.1.8 arguments オブジェクト (Arguments Object)

関数コードによって制御が実行コンテキストに入るとき、 arguments オブジェクトが作成され次のように初期化される:

  • argument オブジェクトの内部 [[Prototype]] プロパティの値は、オリジナルの Object prototype オブジェクトで、 Object.prototype (セクション15.2.3.1) の初期値である。
  • 属性 { DontEnum } のプロパティ callee を作成する。このプロパティの初期値は実行されている Function オブジェクトである。これは再帰する匿名ファンクションを許す。
  • 属性 { DontEnum } のプロパティ length を作成する。このプロパティの初期値は呼出側から供給された実際のパラメータの数である。
  • 0 以上 length プロパティの値未満の整数 arg それぞれについて、属性 { DontEnum } のプロパティ ToString(arg) が作成される。このプロパティの初期値は対応するパラメータの呼出側に供給される実際の値である。最初の実際のパラメータ値が arg = 0、2 番目は arg = 1, 以下同様である。arg が Function オブジェクトの仮引数の数より小さい場合、このプロパティは Activation オブジェクトの対応するプロパティとその値を共有する。このことは、このプロパティの変更が Activation オブジェクトの対応するプロパティを変更すること、そしてその逆を意味する。

10.2 実行コンテキストの開始 (Entering An Execution Context)

各関数とコンストラクタの呼出は、新しい実行コンテキストを開始する。関数がそれ自身の再帰的呼出であっても、各リターンは実行コンテキストを終了する。投げられた例外が受け取られない場合は、一つ以上の実行コンテキストを終了してよい。

制御が実行コンテキストを開始するとき、スコープ連鎖が生成・初期化され、変数の実体化が行われ、this 値が決定される。

スコープ連鎖の実体化、変数の実体化、this 値の決定は、開始するコード型に依存する。

10.2.1 グローバルコード (Global Code)

  • スコープ連鎖が作成され、グローバルオブジェクトのみの構成で初期化される。
  • 変数の実体化が行われ、変数オブジェクトにグローバルオブジェクト、プロパティ属性 { DontDelete } が用いられる。
  • this 値はグローバルオブジェクトである。

10.2.2 Eval コード (Eval Code)

制御が eval コードの実行コンテキストを開始するとき、前のアクティブな実行コンテキストは、 呼出コンテキスト として参照され、スコープ連鎖、変数オブジェクト、 this 値の決定に使用される。呼出コンテキストがなければ、スコープ連鎖、変数の実体化、this 値の決定の初期化は、グローバルコードとして行われる。

  • スコープ連鎖が初期化され、呼出コンテキストのスコープ連鎖と同じオブジェクト、同じ順序になるように構成される。これは with 宣言および catch クローズによって呼出コンテキストのスコープ連鎖に追加されるオブジェクトを含む。
  • 変数の実体化が行われ、呼出コンテキストの変数オブジェクト、プロパティ属性 { } が用られる。
  • this 値は呼出コンテキストの this 値と同じである。

10.2.3 関数コード (Function Code)

  • スコープ連鎖が初期化され、 Activation オブジェクトに Function オブジェクトの [[Scope]] プロパティに蓄積されたスコープ連鎖内のオブジェクトが続くように構成される。
  • 変数の実体化が行われ、変数オブジェクトに Activation オブジェクト、プロパティ属性 { DontDelete } が用いられる。
  • this 値は呼出側が提供する。呼出側が提供する this 値がオブジェクトでない場合(null である場合を含む)、 this 値はグローバルオブジェクトとする。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI