ページ表示設定

9 実行可能コードと実行コンテキスト

9.1 Environment Record

Environment Record は、ECMAScript コードのレキシカルな入れ子構造に基づいて、Identifier と特定の変数および関数との関連付けを定義するために使用される仕様型です。通常、Environment Record は、FunctionDeclaration、BlockStatement、または TryStatement の Catch 節など、ECMAScript コードの特定の構文構造に関連付けられます。このようなコードが評価されるたびに、そのコードによって作成される識別子束縛を記録するため、新しい Environment Record が作成されます。

すべての Environment Record は [[OuterEnv]] フィールドを持ち、その値は null または外側の Environment Record への参照のいずれかです。これは Environment Record の論理的な入れ子をモデル化するために使用されます。(内側の)Environment Record の外側への参照は、その内側の Environment Record を論理的に囲む Environment Record への参照です。もちろん、外側の Environment Record 自身も別の外側の Environment Record を持つ場合があります。1つの Environment Record が、複数の内側の Environment Record に対する外側の環境として機能する場合があります。たとえば、ある FunctionDeclaration が2つの入れ子になった FunctionDeclaration を含む場合、各入れ子関数の Environment Record の外側の Environment Record は、周囲の関数の現在の評価に対応する Environment Record になります。

Environment Record は純粋に仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。ECMAScript プログラムがこのような値に直接アクセスしたり操作したりすることはできません。

9.1.1 Environment Record の型階層

Environment Record は、Environment Record を抽象クラスとし、Declarative Environment Record、Object Environment Record、および Global Environment Record という3つの具象サブクラスを持つ、単純なオブジェクト指向の階層に存在するものと考えることができます。Function Environment Record と Module Environment Record は Declarative Environment Record のサブクラスです。

Environment Record 抽象クラスには、表 15 で定義される抽象仕様メソッドが含まれます。これらの抽象メソッドには、各具象サブクラスについて異なる具象アルゴリズムがあります。

表 15: Environment Recordsの抽象メソッド
メソッド 目的 定義
HasBinding ( name )

抽象メソッド HasBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

Environment Record が name の束縛を持つかどうかを判定します。
次の型に具象定義があります。
CreateMutableBinding ( name, deletable )

抽象メソッド CreateMutableBinding。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。

Environment Record に、初期化されていない新しい可変束縛を作成します。name は束縛名のテキストです。deletable が true の場合、その束縛は後で削除できます。
次の型に具象定義があります。
CreateImmutableBinding ( name, strict )

抽象メソッド CreateImmutableBinding。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。

Environment Record に、初期化されていない新しい不変束縛を作成します。name は束縛名のテキストです。strict が true の場合、その束縛を初期化した後に設定しようとすると、その束縛を参照する操作の strict モード設定にかかわらず、常に例外がスローされます。
次の型に具象定義があります。
InitializeBinding ( name, value )

抽象メソッド InitializeBinding。引数 name (String) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。

Environment Record 内にすでに存在するが初期化されていない束縛の値を設定します。name は束縛名のテキストです。value は束縛に設定する値です。
次の型に具象定義があります。
SetMutableBinding ( name, value, strict )

抽象メソッド SetMutableBinding。引数 name (String)、value (ECMAScript 言語値) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。

Environment Record 内にすでに存在する可変束縛の値を設定します。name は束縛名のテキストです。value は束縛に設定する値です。strict が true であり、束縛を設定できない場合、TypeError 例外をスローします。
次の型に具象定義があります。
GetBindingValue ( name, strict )

抽象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。

Environment Record から、すでに存在する束縛の値を返します。name は束縛名のテキストです。strict は、strict モードコードから生じた参照、またはその他の理由で strict モードの参照意味論を必要とする参照を識別するために使用されます。strict が true であり、束縛が存在しない場合、ReferenceError 例外をスローします。束縛が存在するものの初期化されていない場合、strict の値にかかわらず ReferenceError がスローされます。
次の型に具象定義があります。
DeleteBinding ( name )

抽象メソッド DeleteBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。

Environment Record から束縛を削除します。name は束縛名のテキストです。name の束縛が存在する場合、その束縛を削除して true を返します。束縛は存在するものの削除できない場合、false を返します。束縛が存在しない場合は true を返します。
次の型に具象定義があります。
HasThisBinding ( )

抽象メソッド HasThisBinding。引数なし。戻り値:Boolean。

Environment Record が this 束縛を確立するかどうかを判定します。確立する場合は true、そうでない場合は false を返します。
次の型に具象定義があります。
GetThisBinding ( )

抽象メソッド GetThisBinding。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。

この Environment Record の this 束縛の値を返します。this 束縛が初期化されていない場合、ReferenceError をスローします。
次の型に具象定義があります。
HasSuperBinding ( )

抽象メソッド HasSuperBinding。引数なし。戻り値:Boolean。

Environment Record が super メソッド束縛を確立するかどうかを判定します。確立する場合は true、そうでない場合は false を返します。true を返す場合、その Environment Record が Function Environment Record であることを意味しますが、その逆は成立しません。
次の型に具象定義があります。
WithBaseObject ( )

抽象メソッド WithBaseObject。引数なし。戻り値:(Object または undefined)。

この Environment Record が with 文に関連付けられている場合、with オブジェクトを返します。それ以外の場合は undefined を返します。
次の型に具象定義があります。

9.1.1.1 Declarative Environment Record

各 Declarative Environment Record は、変数、定数、let、クラス、モジュール、インポート、および/または関数宣言を含む ECMAScript プログラムのスコープに関連付けられます。Declarative Environment Record は、そのスコープ内に含まれる宣言によって定義される識別子の集合を束縛します。

すべての Declarative Environment Record は [[DisposableResourceStack]] フィールドも持ち、このフィールドには DisposableResource Record の List が含まれます。このリストの要素は、Environment Record を構築した Evaluation 手順が完了したときに破棄しなければならない using 宣言および await using 宣言によって追跡されます。

9.1.1.1.1 HasBinding ( name )

a Declarative Environment Record envRecordの具象メソッド HasBinding。引数 name (String)。戻り値:正常完了 (値:Boolean)。 引数の識別子が、この Record によって束縛される識別子の1つであるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. envRecord が name の束縛を持つ場合、true を返す。
  2. false を返す。

9.1.1.1.2 CreateMutableBinding ( name, deletable )

a Declarative Environment Record envRecordの具象メソッド CreateMutableBinding。引数 name (String) および deletable (Boolean)。戻り値:正常完了 (値:unused)。 初期化されていない、名前 name の新しい可変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。deletable が true の場合、新しい束縛は削除可能であるものとして印付けされます。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の束縛をまだ持っていない。
  2. envRecord に name の可変束縛を作成し、それが初期化されていないことを記録する。deletable が true である場合、新しく作成された束縛が後の DeleteBinding 呼出しによって削除できることを記録する。
  3. unused を返す。

9.1.1.1.3 CreateImmutableBinding ( name, strict )

a Declarative Environment Record envRecordの具象メソッド CreateImmutableBinding。引数 name (String) および strict (Boolean)。戻り値:正常完了 (値:unused)。 初期化されていない、名前 name の新しい不変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。strict が true の場合、新しい束縛は strict 束縛として印付けされます。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の束縛をまだ持っていない。
  2. envRecord に name の不変束縛を作成し、それが初期化されていないことを記録する。strict が true である場合、新しく作成された束縛が strict 束縛であることを記録する。
  3. unused を返す。

9.1.1.1.4 InitializeBinding ( name, value )

a Declarative Environment Record envRecordの具象メソッド InitializeBinding。引数 name (String) および value (ECMAScript 言語値)。戻り値:正常完了 (値:unused)。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。name の初期化されていない束縛がすでに存在していなければなりません。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の初期化されていない束縛を持たなければならない。
  2. envRecord 内の name の束縛値を value に設定する。
  3. envRecord 内の name の束縛が初期化されたことを記録する。
  4. unused を返す。

9.1.1.1.5 SetMutableBinding ( name, value, strict )

a Declarative Environment Record envRecordの具象メソッド SetMutableBinding。引数 name (String)、value (ECMAScript 言語値) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 名前が name である識別子の現在の束縛の束縛値を value に変更しようとします。通常、name の束縛はすでに存在しますが、まれに存在しない場合があります。その束縛が不変束縛である場合、strict が true なら TypeError がスローされます。 呼び出されると、次の手順を実行する。

  1. envRecord が name の束縛を持たない場合、
    1. strict が true である場合、ReferenceError 例外をスローする。
    2. ! envRecord.CreateMutableBinding(name, true) を実行する。
    3. ! envRecord.InitializeBinding(name, value) を実行する。
    4. unused を返す。
  2. envRecord 内の name の束縛が strict 束縛である場合、strict を true に設定する。
  3. envRecord 内の name の束縛がまだ初期化されていない場合、
    1. ReferenceError 例外をスローする。
  4. そうでなく、envRecord 内の name の束縛が可変束縛である場合、
    1. その束縛値を value に変更する。
  5. そうでない場合、
    1. 表明: これは不変束縛の値を変更しようとする試みである。
    2. strict が true である場合、TypeError 例外をスローする。
  6. unused を返す。
注

手順 1 で束縛が存在しない状態になる ECMAScript コードの例は次のとおりです。

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( name, strict )

a Declarative Environment Record envRecordの具象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 名前が name である束縛された識別子の値を返します。束縛が存在するものの初期化されていない場合、strict の値にかかわらず ReferenceError がスローされます。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の束縛を持つ。
  2. envRecord 内の name の束縛が初期化されていない束縛である場合、ReferenceError 例外をスローする。
  3. envRecord 内で現在 name に束縛されている値を返す。

9.1.1.1.7 DeleteBinding ( name )

a Declarative Environment Record envRecordの具象メソッド DeleteBinding。引数 name (String)。戻り値:正常完了 (値:Boolean)。 明示的に削除可能と指定された束縛だけを削除できます。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の束縛を持つ。
  2. envRecord 内の name の束縛を削除できない場合、false を返す。
  3. envRecord から name の束縛を削除する。
  4. true を返す。

9.1.1.1.8 HasThisBinding ( )

a Declarative Environment Record envRecordの具象メソッド HasThisBinding。引数なし。戻り値:false。 呼び出されると、次の手順を実行する。

  1. false を返す。
注

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は、this 束縛を提供しません。

9.1.1.1.9 GetThisBinding ( )

Declarative Environment Record の GetThisBinding 具象メソッドは、この仕様内では使用されません。

9.1.1.1.10 HasSuperBinding ( )

a Declarative Environment Record envRecordの具象メソッド HasSuperBinding。引数なし。戻り値:false。 呼び出されると、次の手順を実行する。

  1. false を返す。
注

通常の Declarative Environment Record(すなわち、Function Environment Record でも Module Environment Record でもないもの)は、super 束縛を提供しません。

9.1.1.1.11 WithBaseObject ( )

a Declarative Environment Record envRecordの具象メソッド WithBaseObject。引数なし。戻り値:undefined。 呼び出されると、次の手順を実行する。

  1. undefined を返す。

9.1.1.2 Object Environment Record

各 Object Environment Record は、束縛オブジェクトと呼ばれるオブジェクトに関連付けられます。Object Environment Record は、その束縛オブジェクトのプロパティ名に直接対応する文字列識別子名の集合を束縛します。IdentifierName の形式ではない文字列以外のプロパティキーは、束縛された識別子の集合に含まれません。自身のプロパティと継承プロパティはどちらも、その [[Enumerable]] 属性の設定にかかわらず集合に含まれます。プロパティはオブジェクトに動的に追加したり削除したりできるため、Object Environment Record によって束縛される識別子の集合は、プロパティを追加または削除する任意の操作の副作用として変化する可能性があります。このような副作用の結果として作成された束縛は、対応するプロパティの Writable 属性が false であっても、可変束縛とみなされます。Object Environment Record には不変束縛は存在しません。

with 文(14.11)のために作成された Object Environment Record は、その束縛オブジェクトを、関数呼出しで使用する暗黙の this 値として提供できます。この機能は Boolean の [[IsWithEnvironment]] フィールドによって制御されます。

Object Environment Record は、表 16 に列挙される追加の状態フィールドを持ちます。

表 16: Object Environment Record の追加フィールド
フィールド名 値 意味
[[BindingObject]] an Object この Environment Record の束縛オブジェクトです。
[[IsWithEnvironment]] a Boolean この Environment Record が with 文のために作成されたかどうかを示します。

9.1.1.2.1 HasBinding ( name )

an Object Environment Record envRecordの具象メソッド HasBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 関連付けられた束縛オブジェクトが、名前が name であるプロパティを持つかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. bindingObj を envRecord.[[BindingObject]] とする。
  2. foundBinding を ? HasProperty(bindingObj, name) とする。
  3. foundBinding が false である場合、false を返す。
  4. envRecord.[[IsWithEnvironment]] が false である場合、true を返す。
  5. unscopables を ? Get(bindingObj, %Symbol.unscopables%) とする。
  6. unscopables が Object である場合、
    1. blocked を ToBoolean(? Get(unscopables, name)) とする。
    2. blocked が true である場合、false を返す。
  7. true を返す。

9.1.1.2.2 CreateMutableBinding ( name, deletable )

an Object Environment Record envRecordの具象メソッド CreateMutableBinding。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 Environment Record に関連付けられた束縛オブジェクトに、名前が name のプロパティを作成し、値 undefined で初期化します。deletable が true の場合、新しいプロパティの [[Configurable]] 属性は true に設定され、それ以外の場合は false に設定されます。 呼び出されると、次の手順を実行する。

  1. bindingObj を envRecord.[[BindingObject]] とする。
  2. ? DefinePropertyOrThrow(bindingObj, name, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable }) を実行する。
  3. unused を返す。
注

通常、envRecord は name の束縛を持ちませんが、持っている場合、DefinePropertyOrThrow の意味論によって既存の束縛が置換または隠蔽されるか、中断完了が返される場合があります。

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Object Environment Record の CreateImmutableBinding 具象メソッドは、この仕様内では使用されません。

9.1.1.2.4 InitializeBinding ( name, value )

an Object Environment Record envRecordの具象メソッド InitializeBinding。引数 name (String) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。 呼び出されると、次の手順を実行する。

  1. ? envRecord.SetMutableBinding(name, value, false) を実行する。
  2. unused を返す。
注

この仕様では、Object Environment Record に対する CreateMutableBinding のすべての使用の直後に、同じ名前に対する InitializeBinding の呼出しが続きます。そのため、この仕様では Object Environment Record 内の束縛の初期化状態を明示的には追跡しません。

9.1.1.2.5 SetMutableBinding ( name, value, strict )

an Object Environment Record envRecordの具象メソッド SetMutableBinding。引数 name (String)、value (ECMAScript 言語値) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 Environment Record に関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を value に設定しようとします。通常、name という名前のプロパティはすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。

  1. bindingObj を envRecord.[[BindingObject]] とする。
  2. stillExists を ? HasProperty(bindingObj, name) とする。
  3. stillExists が false かつ strict が true である場合、ReferenceError 例外をスローする。
  4. ? Set(bindingObj, name, value, strict) を実行する。
  5. unused を返す。

9.1.1.2.6 GetBindingValue ( name, strict )

an Object Environment Record envRecordの具象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 関連付けられた束縛オブジェクトの、名前が name であるプロパティの値を返します。そのプロパティはすでに存在することが想定されますが、存在しない場合、結果は strict に依存します。 呼び出されると、次の手順を実行する。

  1. bindingObj を envRecord.[[BindingObject]] とする。
  2. value を ? HasProperty(bindingObj, name) とする。
  3. value が false である場合、
    1. strict が false である場合、undefined を返す。
    2. ReferenceError 例外をスローする。
  4. ? Get(bindingObj, name) を返す。

9.1.1.2.7 DeleteBinding ( name )

an Object Environment Record envRecordの具象メソッド DeleteBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 環境オブジェクトの [[Configurable]] 属性が true であるプロパティに対応する束縛だけを削除できます。 呼び出されると、次の手順を実行する。

  1. bindingObj を envRecord.[[BindingObject]] とする。
  2. ? bindingObj.[[Delete]](name) を返す。

9.1.1.2.8 HasThisBinding ( )

an Object Environment Record envRecordの具象メソッド HasThisBinding。引数なし。戻り値:false。 呼び出されると、次の手順を実行する。

  1. false を返す。
注

Object Environment Record は this 束縛を提供しません。

9.1.1.2.9 GetThisBinding ( )

Object Environment Record の GetThisBinding 具象メソッドは、この仕様内では使用されません。

9.1.1.2.10 HasSuperBinding ( )

an Object Environment Record envRecordの具象メソッド HasSuperBinding。引数なし。戻り値:false。 呼び出されると、次の手順を実行する。

  1. false を返す。
注

Object Environment Record は super 束縛を提供しません。

9.1.1.2.11 WithBaseObject ( )

an Object Environment Record envRecordの具象メソッド WithBaseObject。引数なし。戻り値:(Object または undefined)。 呼び出されると、次の手順を実行する。

  1. envRecord.[[IsWithEnvironment]] が true である場合、envRecord.[[BindingObject]] を返す。
  2. undefined を返す。

9.1.1.3 Function Environment Record

Function Environment Record は、関数のトップレベルスコープを表すために使用される Declarative Environment Record であり、その関数が ArrowFunction 関数または AsyncArrowFunction 関数でない場合は this 束縛を提供します。関数が ArrowFunction 関数または AsyncArrowFunction 関数でなく、super を参照する場合、その Function Environment Record は、関数内から super メソッド呼出しを実行するために使用される状態も含みます。

Function Environment Record は、表 17 に列挙される追加の状態フィールドを持ちます。

表 17: Function Environment Record の追加フィールド
フィールド名 値 意味
[[ThisValue]] an ECMAScript language value この関数呼出しで使用される this 値です。
[[ThisBindingStatus]] lexical, initialized, or uninitialized 値が lexical の場合、これは ArrowFunction または AsyncArrowFunction であり、ローカルな this 値を持ちません。
[[FunctionObject]] an ECMAScript function object その呼出しによってこの Environment Record が作成された関数オブジェクトです。
[[NewTarget]] a constructor or undefined この Environment Record が [[Construct]] 内部メソッドによって作成された場合、[[NewTarget]] は [[Construct]] の newTarget パラメーターの値です。それ以外の場合、その値は undefined です。

Function Environment Record は、表 15 に列挙された Declarative Environment Record のすべてのメソッドをサポートし、HasThisBinding、GetThisBinding、および HasSuperBinding を除くすべてのメソッドについて同じ仕様を共有します。

9.1.1.3.1 BindThisValue ( envRecord, value )

抽象操作 BindThisValue。引数 envRecord (Function Environmentレコード) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 envRecord.[[ThisValue]] を設定し、それが初期化されたことを記録します。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord.[[ThisBindingStatus]] は lexical ではない。
  2. envRecord.[[ThisBindingStatus]] が initialized である場合、ReferenceError 例外をスローする。
  3. envRecord.[[ThisValue]] を value に設定する。
  4. envRecord.[[ThisBindingStatus]] を initialized に設定する。
  5. unused を返す。

9.1.1.3.2 HasThisBinding ( )

a Function Environment Record envRecordの具象メソッド HasThisBinding。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. envRecord.[[ThisBindingStatus]] が lexical である場合、false を返す。
  2. true を返す。

9.1.1.3.3 GetThisBinding ( )

a Function Environment Record envRecordの具象メソッド GetThisBinding。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord.[[ThisBindingStatus]] は lexical ではない。
  2. envRecord.[[ThisBindingStatus]] が uninitialized である場合、ReferenceError 例外をスローする。
  3. envRecord.[[ThisValue]] を返す。

9.1.1.3.4 HasSuperBinding ( )

a Function Environment Record envRecordの具象メソッド HasSuperBinding。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. envRecord.[[ThisBindingStatus]] が lexical である場合、false を返す。
  2. envRecord.[[FunctionObject]].[[HomeObject]] が undefined である場合、false を返す。
  3. true を返す。

9.1.1.3.5 GetSuperBase ( envRecord )

抽象操作 GetSuperBase。引数 envRecord (Function Environmentレコード)。戻り値:(Object、null または undefined)。 envRecord 内で束縛された super プロパティアクセスの基底となるオブジェクトを返します。値 undefined は、そのようなアクセスが実行時エラーを生成することを示します。 呼び出されると、次の手順を実行する。

  1. home を envRecord.[[FunctionObject]].[[HomeObject]] とする。
  2. home が undefined である場合、undefined を返す。
  3. 表明: home は通常オブジェクトである。
  4. ! home.[[GetPrototypeOf]]() を返す。

9.1.1.4 Global Environment Record

Global Environment Record は、共通の Realm 内で処理されるすべての ECMAScript Script 要素によって共有される、最外層のスコープを表すために使用されます。Global Environment Record は、組込みグローバル(箇条 19)、グローバルオブジェクトのプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.11、8.2.13)に対する束縛を提供します。

Global Environment Record は論理的には単一の Record ですが、Object Environment Record と Declarative Environment Record をカプセル化した複合体として規定されます。Object Environment Record の基底オブジェクトは、関連付けられた Realm Record のグローバルオブジェクトです。このグローバルオブジェクトは、Global Environment Record の GetThisBinding 具象メソッドによって返される値です。Global Environment Record の Object Environment Record 構成要素には、すべての組込みグローバル(箇条 19)の束縛と、グローバルコードに含まれる FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、AsyncGeneratorDeclaration、または VariableStatement によって導入されるすべての束縛が含まれます。グローバルコード内のその他すべての ECMAScript 宣言の束縛は、Global Environment Record の Declarative Environment Record 構成要素に含まれます。

プロパティはグローバルオブジェクト上に直接作成することもできます。そのため、Global Environment Record の Object Environment Record 構成要素には、FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、AsyncGeneratorDeclaration、または VariableDeclaration 宣言によって明示的に作成された束縛と、グローバルオブジェクトのプロパティとして暗黙的に作成された束縛の両方が含まれる場合があります。

Global Environment Record は、表 18 に列挙される追加のフィールドを持ちます。

表 18: Global Environment Record の追加フィールド
フィールド名 値 意味
[[ObjectRecord]] an Object Environment Record 束縛オブジェクトはグローバルオブジェクトです。関連する Realm のグローバルコードにおけるグローバル組込み束縛、および FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、AsyncGeneratorDeclaration、VariableDeclaration の束縛を含みます。
[[GlobalThisValue]] an Object グローバルスコープで this によって返される値です。ホストは任意の ECMAScript Object 値を提供できます。
[[DeclarativeRecord]] a Declarative Environment Record 関連する Realm のグローバルコード内のすべての宣言の束縛を含みます。ただし、FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、AsyncGeneratorDeclaration、および VariableDeclaration の束縛は除きます。

9.1.1.4.1 HasBinding ( name )

a Global Environment Record envRecordの具象メソッド HasBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 引数の識別子が、この Record によって束縛される識別子の1つであるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、true を返す。
  3. objRecord を envRecord.[[ObjectRecord]] とする。
  4. ? objRecord.HasBinding(name) を返す。

9.1.1.4.2 CreateMutableBinding ( name, deletable )

a Global Environment Record envRecordの具象メソッド CreateMutableBinding。引数 name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 初期化されていない、名前 name の新しい可変束縛を作成します。束縛は関連付けられた DeclarativeRecord に作成されます。DeclarativeRecord に name の束縛がすでに存在してはなりません。deletable が true の場合、新しい束縛は削除可能であるものとして印付けされます。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、TypeError 例外をスローする。
  3. ! declRecord.CreateMutableBinding(name, deletable) を返す。

9.1.1.4.3 CreateImmutableBinding ( name, strict )

a Global Environment Record envRecordの具象メソッド CreateImmutableBinding。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 初期化されていない、名前 name の新しい不変束縛を作成します。この Environment Record に name の束縛がすでに存在してはなりません。strict が true の場合、新しい束縛は strict 束縛として印付けされます。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、TypeError 例外をスローする。
  3. ! declRecord.CreateImmutableBinding(name, strict) を返す。

9.1.1.4.4 InitializeBinding ( name, value )

a Global Environment Record envRecordの具象メソッド InitializeBinding。引数 name (String) および value (ECMAScript 言語値)。戻り値:(正常完了 (値:unused) または throw 完了)。 名前が name である識別子の現在の束縛の束縛値を value に設定するために使用されます。name の初期化されていない束縛がすでに存在していなければなりません。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、
    1. ! declRecord.InitializeBinding(name, value) を返す。
  3. 表明: 束縛が存在する場合、それは Object Environment Record 内になければならない。
  4. objRecord を envRecord.[[ObjectRecord]] とする。
  5. ? objRecord.InitializeBinding(name, value) を返す。

9.1.1.4.5 SetMutableBinding ( name, value, strict )

a Global Environment Record envRecordの具象メソッド SetMutableBinding。引数 name (String)、value (ECMAScript 言語値) および strict (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 名前が name である識別子の現在の束縛の束縛値を value に変更しようとします。その束縛が不変束縛であり、strict が true の場合、TypeError がスローされます。通常、name という名前の束縛はすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、
    1. ? declRecord.SetMutableBinding(name, value, strict) を返す。
  3. objRecord を envRecord.[[ObjectRecord]] とする。
  4. ? objRecord.SetMutableBinding(name, value, strict) を返す。

9.1.1.4.6 GetBindingValue ( name, strict )

a Global Environment Record envRecordの具象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 名前が name である束縛された識別子の値を返します。その束縛が初期化されていない束縛である場合、ReferenceError 例外をスローします。通常、name という名前の束縛はすでに存在しますが、存在しない場合または現在書込み可能でない場合、エラー処理は strict によって決定されます。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、
    1. ? declRecord.GetBindingValue(name, strict) を返す。
  3. objRecord を envRecord.[[ObjectRecord]] とする。
  4. ? objRecord.GetBindingValue(name, strict) を返す。

9.1.1.4.7 DeleteBinding ( name )

a Global Environment Record envRecordの具象メソッド DeleteBinding。引数 name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 明示的に削除可能と指定された束縛だけを削除できます。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) が true である場合、
    1. ! declRecord.DeleteBinding(name) を返す。
  3. objRecord を envRecord.[[ObjectRecord]] とする。
  4. globalObj を objRecord.[[BindingObject]] とする。
  5. existingProperty を ? HasOwnProperty(globalObj, name) とする。
  6. existingProperty が true である場合、
    1. ? objRecord.DeleteBinding(name) を返す。
  7. true を返す。

9.1.1.4.8 HasThisBinding ( )

a Global Environment Record envRecordの具象メソッド HasThisBinding。引数なし。戻り値:true。 呼び出されると、次の手順を実行する。

  1. true を返す。
注

Global Environment Record は常に this 束縛を提供します。

9.1.1.4.9 GetThisBinding ( )

a Global Environment Record envRecordの具象メソッド GetThisBinding。引数なし。戻り値:正常完了 (値:Object)。 呼び出されると、次の手順を実行する。

  1. envRecord.[[GlobalThisValue]] を返す。

9.1.1.4.10 HasSuperBinding ( )

a Global Environment Record envRecordの具象メソッド HasSuperBinding。引数なし。戻り値:false。 呼び出されると、次の手順を実行する。

  1. false を返す。
注

Global Environment Record は super 束縛を提供しません。

9.1.1.4.11 WithBaseObject ( )

a Global Environment Record envRecordの具象メソッド WithBaseObject。引数なし。戻り値:undefined。 呼び出されると、次の手順を実行する。

  1. undefined を返す。

9.1.1.4.12 HasLexicalDeclaration ( envRecord, name )

抽象操作 HasLexicalDeclaration。引数 envRecord (Global Environmentレコード) および name (String)。戻り値:Boolean。 引数の識別子が、LexicalDeclaration または ClassDeclaration などのレキシカル宣言を使用して作成された envRecord 内の束縛を持つかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. declRecord を envRecord.[[DeclarativeRecord]] とする。
  2. ! declRecord.HasBinding(name) を返す。

9.1.1.4.13 HasRestrictedGlobalProperty ( envRecord, name )

抽象操作 HasRestrictedGlobalProperty。引数 envRecord (Global Environmentレコード) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 引数の識別子が、グローバルレキシカル束縛によって隠蔽されてはならないグローバルオブジェクトのプロパティ名であるかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. objRecord を envRecord.[[ObjectRecord]] とする。
  2. globalObj を objRecord.[[BindingObject]] とする。
  3. existingProperty を ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingProperty が undefined である場合、false を返す。
  5. existingProperty.[[Configurable]] が true である場合、false を返す。
  6. true を返す。
注

var 宣言または関数宣言を使用して宣言されたのではなく、直接作成されたプロパティがグローバルオブジェクト上に存在する場合があります。グローバルオブジェクトの構成不可のプロパティと同じ名前を持つグローバルレキシカル束縛を作成することはできません。グローバルプロパティ "undefined" はそのようなプロパティの例です。

9.1.1.4.14 CanDeclareGlobalVar ( envRecord, name )

抽象操作 CanDeclareGlobalVar。引数 envRecord (Global Environmentレコード) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 同じ引数 name について対応する CreateGlobalVarBinding 呼出しを行った場合に成功するかどうかを判定します。重複する var 宣言、および既存のグローバルオブジェクトプロパティに対する var 宣言は許可されます。 呼び出されると、次の手順を実行する。

  1. objRecord を envRecord.[[ObjectRecord]] とする。
  2. globalObj を objRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObj, name) とする。
  4. hasProperty が true である場合、true を返す。
  5. ? IsExtensible(globalObj) を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRecord, name )

抽象操作 CanDeclareGlobalFunction。引数 envRecord (Global Environmentレコード) および name (String)。戻り値:(正常完了 (値:Boolean) または throw 完了)。 同じ引数 name について対応する CreateGlobalFunctionBinding 呼出しを行った場合に成功するかどうかを判定します。 呼び出されると、次の手順を実行する。

  1. objRecord を envRecord.[[ObjectRecord]] とする。
  2. globalObj を objRecord.[[BindingObject]] とする。
  3. existingProperty を ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingProperty が undefined である場合、? IsExtensible(globalObj) を返す。
  5. existingProperty.[[Configurable]] が true である場合、true を返す。
  6. IsDataDescriptor(existingProperty) が true であり、existingProperty が属性値 { [[Writable]]: true, [[Enumerable]]: true } を持つ場合、true を返す。
  7. false を返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRecord, name, deletable )

抽象操作 CreateGlobalVarBinding。引数 envRecord (Global Environmentレコード)、name (String) および deletable (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 関連付けられた Object Environment Record に可変束縛を作成して初期化します。束縛がすでに存在する場合、それを再利用し、初期化済みであるとみなします。 呼び出されると、次の手順を実行する。

  1. objRecord を envRecord.[[ObjectRecord]] とする。
  2. globalObj を objRecord.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObj, name) とする。
  4. extensible を ? IsExtensible(globalObj) とする。
  5. hasProperty が false かつ extensible が true である場合、
    1. ? objRecord.CreateMutableBinding(name, deletable) を実行する。
    2. ? objRecord.InitializeBinding(name, undefined) を実行する。
  6. unused を返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRecord, name, value, deletable )

抽象操作 CreateGlobalFunctionBinding。引数 envRecord (Global Environmentレコード)、name (String)、value (ECMAScript 関数オブジェクト) および deletable (Boolean)。戻り値:(正常完了 (値:unused) または throw 完了)。 関連付けられた Object Environment Record に可変束縛を作成して初期化します。束縛がすでに存在する場合、それを置換します。 呼び出されると、次の手順を実行する。

  1. objRecord を envRecord.[[ObjectRecord]] とする。
  2. globalObj を objRecord.[[BindingObject]] とする。
  3. existingProperty を ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingProperty が undefined であるか、existingProperty.[[Configurable]] が true である場合、
    1. propertyDesc を PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable } とする。
  5. そうでない場合、
    1. propertyDesc を PropertyDescriptor { [[Value]]: value } とする。
  6. ? DefinePropertyOrThrow(globalObj, name, propertyDesc) を実行する。
  7. ? Set(globalObj, name, value, false) を実行する。
  8. unused を返す。
注

グローバル関数宣言は常にグローバルオブジェクト自身のプロパティとして表現されます。可能であれば、既存の自身のプロパティが標準の属性値の集合を持つように再構成されます。手順 7 は InitializeBinding 具象メソッドを呼び出す場合と同等であり、globalObj が Proxy である場合、同じ順序の Proxy トラップ呼出しを生成します。

9.1.1.5 Module Environment Record

Module Environment Record は、ECMAScript Module の外側のスコープを表すために使用される Declarative Environment Record です。通常の可変束縛および不変束縛に加えて、Module Environment Record は不変のインポート束縛も提供します。これは、別の Environment Record に存在する対象束縛への間接アクセスを提供する束縛です。

Module Environment Record は、表 15 に列挙された Declarative Environment Record のすべてのメソッドをサポートし、GetBindingValue、DeleteBinding、HasThisBinding、および GetThisBinding を除くすべてのメソッドについて同じ仕様を共有します。

9.1.1.5.1 GetBindingValue ( name, strict )

a Module Environment Record envRecordの具象メソッド GetBindingValue。引数 name (String) および strict (Boolean)。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 名前が name である束縛された識別子の値を返します。ただし、束縛が間接束縛である場合は、対象束縛の値を返します。束縛が存在するものの初期化されていない場合、ReferenceError がスローされます。 呼び出されると、次の手順を実行する。

  1. 表明: strict は true である。
  2. 表明: envRecord は name の束縛を持つ。
  3. name の束縛が間接束縛である場合、
    1. module および targetName を、この name の束縛が作成されたときに提供された間接参照値とする。
    2. targetEnv を module.[[Environment]] とする。
    3. targetEnv が empty である場合、ReferenceError 例外をスローする。
    4. ? targetEnv.GetBindingValue(targetName, true) を返す。
  4. envRecord 内の name の束縛が初期化されていない束縛である場合、ReferenceError 例外をスローする。
  5. envRecord 内で現在 name に束縛されている値を返す。
注

Module は常に strict モードコードであるため、strict は常に true です。

9.1.1.5.2 DeleteBinding ( name )

Module Environment Record の DeleteBinding 具象メソッドは、この仕様内では使用されません。

注

Module Environment Record は strict コード内でのみ使用され、早期エラー規則により、strict コード内の delete 演算子を、Module Environment Record の束縛に解決される Reference Record に適用することは禁止されています。13.5.1.1 を参照してください。

9.1.1.5.3 HasThisBinding ( )

a Module Environment Record envRecordの具象メソッド HasThisBinding。引数なし。戻り値:true。 呼び出されると、次の手順を実行する。

  1. true を返す。
注

Module Environment Record は常に this 束縛を提供します。

9.1.1.5.4 GetThisBinding ( )

a Module Environment Record envRecordの具象メソッド GetThisBinding。引数なし。戻り値:正常完了 (値:undefined)。 呼び出されると、次の手順を実行する。

  1. undefined を返す。

9.1.1.5.5 CreateImportBinding ( envRecord, name, targetModule, targetName )

抽象操作 CreateImportBinding。引数 envRecord (Module Environmentレコード)、name (String)、targetModule (Moduleレコード) および targetName (String)。戻り値:unused。 名前 name に対して、初期化済みの新しい不変の間接束縛を作成します。envRecord に name の束縛がすでに存在してはなりません。targetName は targetModule の Module Environment Record に存在する束縛名です。新しい束縛の値へのアクセスは、対象束縛の束縛値に間接的にアクセスします。 呼び出されると、次の手順を実行する。

  1. 表明: envRecord は name の束縛をまだ持っていない。
  2. 表明: targetModule.[[Environment]] がインスタンス化されるとき、targetName の直接束縛を持つ。
  3. targetModule と targetName を対象束縛として参照する、name の不変の間接束縛を envRecord に作成し、その束縛が初期化済みであることを記録する。
  4. unused を返す。

9.1.2 Environment Record に対する操作

この仕様では、Environment Record を操作するために次の抽象操作を使用します。

9.1.2.1 GetIdentifierReference ( envRecord, name, strict )

抽象操作 GetIdentifierReference。引数 envRecord ((Environmentレコード または null))、name (String) および strict (Boolean)。戻り値:(正常完了 (値:Referenceレコード) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. envRecord が null である場合、
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  2. exists を ? envRecord.HasBinding(name) とする。
  3. exists が true である場合、
    1. Reference Record { [[Base]]: envRecord, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  4. outer を envRecord.[[OuterEnv]] とする。
  5. ? GetIdentifierReference(outer, name, strict) を返す。

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

抽象操作 NewDeclarativeEnvironment。引数 outerEnv ((Environmentレコード または null))。戻り値:Declarative Environmentレコード。 呼び出されると、次の手順を実行する。

  1. envRecord を、束縛を持たない新しい Declarative Environment Record とする。
  2. envRecord.[[OuterEnv]] を outerEnv に設定する。
  3. envRecord.[[DisposableResourceStack]] を新しい空の List に設定する。
  4. envRecord を返す。

9.1.2.3 NewObjectEnvironment ( obj, isWithEnv, outerEnv )

抽象操作 NewObjectEnvironment。引数 obj (Object)、isWithEnv (Boolean) および outerEnv ((Environmentレコード または null))。戻り値:Object Environmentレコード。 呼び出されると、次の手順を実行する。

  1. envRecord を新しい Object Environment Record とする。
  2. envRecord.[[BindingObject]] を obj に設定する。
  3. envRecord.[[IsWithEnvironment]] を isWithEnv に設定する。
  4. envRecord.[[OuterEnv]] を outerEnv に設定する。
  5. envRecord を返す。

9.1.2.4 NewFunctionEnvironment ( func, newTarget )

抽象操作 NewFunctionEnvironment。引数 func (ECMAScript 関数オブジェクト) および newTarget ((Object または undefined))。戻り値:Function Environmentレコード。 呼び出されると、次の手順を実行する。

  1. envRecord を、束縛を持たない新しい Function Environment Record とする。
  2. envRecord.[[FunctionObject]] を func に設定する。
  3. func.[[ThisMode]] が lexical である場合、envRecord.[[ThisBindingStatus]] を lexical に設定する。
  4. そうでない場合、envRecord.[[ThisBindingStatus]] を uninitialized に設定する。
  5. envRecord.[[NewTarget]] を newTarget に設定する。
  6. envRecord.[[OuterEnv]] を func.[[Environment]] に設定する。
  7. envRecord.[[DisposableResourceStack]] を新しい空の List に設定する。
  8. envRecord を返す。

9.1.2.5 NewGlobalEnvironment ( obj, thisValue )

抽象操作 NewGlobalEnvironment。引数 obj (Object) および thisValue (Object)。戻り値:Global Environmentレコード。 呼び出されると、次の手順を実行する。

  1. objRecord を NewObjectEnvironment(obj, false, null) とする。
  2. declRecord を NewDeclarativeEnvironment(null) とする。
  3. envRecord を新しい Global Environment Record とする。
  4. envRecord.[[ObjectRecord]] を objRecord に設定する。
  5. envRecord.[[GlobalThisValue]] を thisValue に設定する。
  6. envRecord.[[DeclarativeRecord]] を declRecord に設定する。
  7. envRecord.[[OuterEnv]] を null に設定する。
  8. envRecord を返す。

9.1.2.6 NewModuleEnvironment ( outerEnv )

抽象操作 NewModuleEnvironment。引数 outerEnv (Global Environmentレコード)。戻り値:Module Environmentレコード。 呼び出されると、次の手順を実行する。

  1. envRecord を、束縛を持たない新しい Module Environment Record とする。
  2. envRecord.[[OuterEnv]] を outerEnv に設定する。
  3. envRecord.[[DisposableResourceStack]] を新しい空の List に設定する。
  4. envRecord を返す。

9.2 PrivateEnvironment Record

PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression のレキシカルな入れ子構造に基づいて Private Name を追跡するために使用される仕様上の仕組みです。Environment Record と似ていますが、別のものです。各 PrivateEnvironment Record は ClassDeclaration または ClassExpression に関連付けられます。このようなクラスが評価されるたびに、そのクラスによって宣言された Private Name を記録するため、新しい PrivateEnvironment Record が作成されます。

各 PrivateEnvironment Record は、表 19 で定義されるフィールドを持ちます。

表 19: PrivateEnvironment Record のフィールド
フィールド名 値の型 意味
[[OuterPrivateEnvironment]] a PrivateEnvironment Record or null 最も近い包含クラスの PrivateEnvironment Record です。この PrivateEnvironment Record に関連付けられたクラスが他のクラス内に含まれていない場合は null です。
[[Names]] a List of Private Names このクラスによって宣言された Private Name です。

9.2.1 PrivateEnvironment Record に対する操作

この仕様では、PrivateEnvironment Record を操作するために次の抽象操作を使用します。

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

抽象操作 NewPrivateEnvironment。引数 outerPrivateEnv ((PrivateEnvironmentレコード または null))。戻り値:PrivateEnvironmentレコード。 呼び出されると、次の手順を実行する。

  1. names を新しい空の List とする。
  2. PrivateEnvironment Record { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names } を返す。

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

抽象操作 ResolvePrivateIdentifier。引数 privateEnv (PrivateEnvironmentレコード) および identifier (String)。戻り値:プライベート名。 呼び出されると、次の手順を実行する。

  1. names を privateEnv.[[Names]] とする。
  2. names の各 Private Name privateName について、次を行う。
    1. privateName.[[Description]] が identifier である場合、
      1. privateName を返す。
  3. outerPrivateEnv を privateEnv.[[OuterPrivateEnvironment]] とする。
  4. 表明: outerPrivateEnv は null ではない。
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) を返す。

9.3 Realm

すべての ECMAScript コードは、評価される前に Realm に関連付けられなければなりません。概念上、Realm は、イントリンシックオブジェクトの集合、ECMAScript グローバル環境、そのグローバル環境のスコープ内に読み込まれたすべての ECMAScript コード、およびその他の関連する状態とリソースから構成されます。

この仕様では、Realm は、表 20 で指定されるフィールドを持つ Realm Record として表されます。

表 20: Realm Record のフィールド
フィールド名 値 意味
[[AgentSignifier]] agent signifier この realm を所有する agent
[[Intrinsics]] フィールド名が intrinsic key であり、その値がオブジェクトである Record この realm に関連付けられたコードによって使用される intrinsic 値
[[GlobalObject]] Object この realm のグローバルオブジェクト
[[GlobalEnv]] Global Environment Record この realm のグローバル環境
[[TemplateMap]] [[Site]](TemplateLiteral Parse Node)および [[Array]](Array)というフィールドを持つ Record の List

Template オブジェクトは、各 realm について、その Realm Record の [[TemplateMap]] を使用して個別に正規化されます。各 [[Site]] 値は、TemplateLiteral である Parse Node です。関連付けられた [[Array]] 値は、tag 関数に渡される対応する template オブジェクトです。

注 1
Parse Node が到達不能になると、対応する [[Array]] も到達不能になり、実装がその組を [[TemplateMap]] の List から削除しても観測できません。
[[LoadedModules]] LoadedModuleRequest Record の List

この realm によってインポートされた specifier 文字列から、解決済みの Module Record への対応付けです。この List には、ModuleRequestsEqual(r1, r2) が true となる2つの異なる Record r1 および r2 は含まれません。

注 2
HostLoadImportedModule(16.2.1.10 注 1)で述べたように、Realm Record 内の [[LoadedModules]] は、アクティブな script または module が存在しないコンテキストで import() 式を実行する場合にのみ使用されます。
[[HostDefined]] 任意のもの(既定値は undefined) Realm Record に追加情報を関連付ける必要がある host が使用するために予約されたフィールドです。

9.3.1 InitializeHostDefinedRealm ( )

抽象操作 InitializeHostDefinedRealm。引数なし。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. realm を新しい Realm Record とする。
  2. CreateIntrinsics(realm) を実行する。
  3. realm.[[AgentSignifier]] を AgentSignifier() に設定する。
  4. realm.[[TemplateMap]] を新しい空の List に設定する。
  5. newContext を新しい実行コンテキストとする。
  6. newContext の Function を null に設定する。
  7. newContext の Realm を realm に設定する。
  8. newContext の ScriptOrModule を null に設定する。
  9. newContext を実行コンテキストスタックにプッシュする。これで newContext が実行中の実行コンテキストになる。
  10. ホストが realm のグローバルオブジェクトとして機能する特定のオブジェクトの使用を要求する場合、
    1. global を、ホスト定義の方法で作成されたそのようなオブジェクトとする。
  11. そうでない場合、
    1. global を OrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) とする。
  12. ホストが realm のグローバルスコープ内の this 束縛からグローバルオブジェクトとは異なるオブジェクトを返すことを要求する場合、
    1. thisValue を、ホスト定義の方法で作成されたそのようなオブジェクトとする。
  13. そうでない場合、
    1. thisValue を global とする。
  14. realm.[[GlobalObject]] を global に設定する。
  15. realm.[[GlobalEnv]] を NewGlobalEnvironment(global, thisValue) に設定する。
  16. ? SetDefaultGlobalBindings(realm) を実行する。
  17. global にホスト定義のグローバルオブジェクトプロパティを作成する。
  18. unused を返す。

9.3.2 CreateIntrinsics ( realmRecord )

抽象操作 CreateIntrinsics。引数 realmRecord (Realmレコード)。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. realmRecord.[[Intrinsics]] を新しい Record に設定する。
  2. realmRecord.[[Intrinsics]] のフィールドを、表 6 に列挙される値で設定する。フィールド名は、表の「イントリンシック名」列に列挙される名前である。各フィールドの値は、箇条 19 から 28 までにある各オブジェクトの仕様で定義されるプロパティ値を、完全かつ再帰的に設定した新しいオブジェクト値である。すべてのオブジェクトプロパティ値は新しく作成されたオブジェクト値である。組込み関数オブジェクトであるすべての値は、CreateBuiltinFunction(steps, length, name, slots, realmRecord, proto, async) を実行して作成される。ここで steps はこの仕様によって提供されるその関数の定義、name は関数の "name" プロパティの初期値、length は関数の "length" プロパティの初期値、slots は関数について規定された内部スロット名が存在する場合のその List、proto は関数の [[Prototype]] 内部スロットについて規定された値、async は関数が「async」と記述されている場合は true、それ以外の場合は false である。イントリンシックおよびそのプロパティの作成は、まだ作成されていないオブジェクトへの依存を避けるような順序で行わなければならない。
  3. AddRestrictedFunctionProperties(realmRecord.[[Intrinsics]].[[%Function.prototype%]], realmRecord) を実行する。
  4. unused を返す。

9.3.3 SetDefaultGlobalBindings ( realmRecord )

抽象操作 SetDefaultGlobalBindings。引数 realmRecord (Realmレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. global を realmRecord.[[GlobalObject]] とする。
  2. 箇条 19 で規定される Global Object の各プロパティについて、次を行う。
    1. name をプロパティ名の String 値とする。
    2. propertyDesc を、そのプロパティについて規定された属性を含む、そのプロパティの完全に設定されたデータ Property Descriptor とする。19.2、19.3、または 19.4 に列挙されるプロパティについては、[[Value]] 属性の値は realmRecord からの対応するイントリンシックオブジェクトである。
    3. ? DefinePropertyOrThrow(global, name, propertyDesc) を実行する。
  3. unused を返す。

9.4 実行コンテキスト

実行コンテキストは、ECMAScript 実装によるコードの実行時評価を追跡するために使用される仕様上の仕組みです。任意の時点において、実際にコードを実行している実行コンテキストは、エージェントごとに最大1つだけです。これはそのエージェントの 実行中の実行コンテキストと呼ばれます。この仕様における実行中の実行コンテキストへのすべての参照は、周囲のエージェントの実行中の実行コンテキストを表します。

実行コンテキストスタックは、実行コンテキストを追跡するために使用されます。実行中の実行コンテキストは常にこのスタックの最上位要素です。現在実行中の実行コンテキストに関連付けられた実行可能コードから、その実行コンテキストに関連付けられていない実行可能コードへ制御が移るたびに、新しい実行コンテキストが作成されます。新しく作成された実行コンテキストはスタックにプッシュされ、実行中の実行コンテキストになります。

実行コンテキストには、関連するコードの実行進行状況を追跡するために必要な、実装固有のあらゆる状態が含まれます。各実行コンテキストは、少なくとも 表 21 に列挙される状態構成要素を持ちます。

表 21: すべての実行コンテキストの状態構成要素
構成要素 目的
コード評価状態 この実行コンテキストに関連付けられたコードの評価を実行、中断、および再開するために必要なすべての状態です。
Function この実行コンテキストが関数オブジェクトのコードを評価している場合、この構成要素の値はその関数オブジェクトです。コンテキストが Script または Module のコードを評価している場合、値は null です。
Realm 関連付けられたコードが ECMAScript リソースへアクセスする際の Realm Record です。
ScriptOrModule 関連付けられたコードの起源である Module Record または Script Record です。InitializeHostDefinedRealm で作成される最初の実行コンテキストのように、起源となるスクリプトまたはモジュールがない場合、値は null です。

実行中の実行コンテキストによるコードの評価は、この仕様内で定義されるさまざまな時点で中断される場合があります。実行中の実行コンテキストが中断されると、別の実行コンテキストが実行中の実行コンテキストとなり、そのコードの評価を開始する場合があります。その後、ある時点で、中断された実行コンテキストが再び実行中の実行コンテキストとなり、以前に中断された地点からコードの評価を続行する場合があります。実行コンテキスト間での実行中の実行コンテキスト状態の遷移は、通常、スタックの後入れ先出し方式で行われます。ただし、一部の ECMAScript 機能では、実行中の実行コンテキストに非 LIFO の遷移が必要です。

実行中の実行コンテキストの Realm 構成要素の値は、現在の Realm Record とも呼ばれます。実行中の実行コンテキストの Function 構成要素の値は、アクティブ関数オブジェクトとも呼ばれます。

ECMAScript コード実行コンテキストは、表 22 に列挙される追加の状態構成要素を持ちます。

表 22: ECMAScript コード実行コンテキストの追加の状態構成要素
構成要素 目的
LexicalEnvironment この実行コンテキスト内のコードによって行われる識別子参照の解決に使用される Environment Record を識別します。
VariableEnvironment この実行コンテキスト内の VariableStatement によって作成される束縛を保持する Environment Record を識別します。
PrivateEnvironment 最も近い包含クラス内の ClassElement によって作成される Private Name を保持する PrivateEnvironment Record を識別します。包含クラスが存在しない場合は null です。

実行コンテキストの LexicalEnvironment および VariableEnvironment 構成要素は常に Environment Record です。

Generator の評価を表す実行コンテキストは、表 23 に列挙される追加の状態構成要素を持ちます。

表 23: Generator 実行コンテキストの追加の状態構成要素
構成要素 目的
Generator この実行コンテキストが評価している Generator です。

ほとんどの場合、この仕様内のアルゴリズムによって直接操作されるのは、実行中の実行コンテキスト(実行コンテキストスタックの最上位)だけです。そのため、「LexicalEnvironment」および「VariableEnvironment」という用語が修飾なしで使用される場合、それらは実行中の実行コンテキストの対応する構成要素を指します。

実行コンテキストは純粋に仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。ECMAScript コードから実行コンテキストへ直接アクセスしたり、それを観測したりすることはできません。

9.4.1 GetActiveScriptOrModule ( )

抽象操作 GetActiveScriptOrModule。引数なし。戻り値:(Scriptレコード、Moduleレコード または null)。 実行中の実行コンテキストに基づいて、実行中のスクリプトまたはモジュールを判定するために使用されます。 呼び出されると、次の手順を実行する。

  1. 実行コンテキストスタックが空である場合、null を返す。
  2. executionContext を、実行コンテキストスタック上で ScriptOrModule 構成要素が null でない最上位の実行コンテキストとする。
  3. そのような実行コンテキストが存在しない場合、null を返す。
  4. executionContext の ScriptOrModule を返す。

9.4.2 ResolveBinding ( name [ , envRecord ] )

抽象操作 ResolveBinding。引数 name (String)および省略可能な引数 envRecord ((Environmentレコード または undefined))。戻り値:(正常完了 (値:Referenceレコード) または throw 完了)。 name の束縛を判定するために使用されます。envRecord を使用して、束縛を検索する Environment Record を明示的に指定できます。 呼び出されると、次の手順を実行する。

  1. envRecord が存在しないか、envRecord が undefined である場合、
    1. envRecord を実行中の実行コンテキストの LexicalEnvironment に設定する。
  2. 表明: envRecord は Environment Record である。
  3. strict を IsStrict(評価中の構文生成規則) とする。
  4. ? GetIdentifierReference(envRecord, name, strict) を返す。
注

ResolveBinding の結果は常に [[ReferencedName]] フィールドが name である Reference Record です。

9.4.3 GetThisEnvironment ( )

抽象操作 GetThisEnvironment。引数なし。戻り値:Environmentレコード。 現在キーワード this の束縛を提供している Environment Record を見つけます。 呼び出されると、次の手順を実行する。

  1. envRecord を実行中の実行コンテキストの LexicalEnvironment とする。
  2. 次を繰り返す。
    1. exists を envRecord.HasThisBinding() とする。
    2. exists が true である場合、envRecord を返す。
    3. outer を envRecord.[[OuterEnv]] とする。
    4. 表明: outer は null ではない。
    5. envRecord を outer に設定する。
注

手順 2 のループは常に終了します。これは、環境のリストが常に this 束縛を持つグローバル環境で終わるためです。

9.4.4 ResolveThisBinding ( )

抽象操作 ResolveThisBinding。引数なし。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。 実行中の実行コンテキストの LexicalEnvironment を使用して、キーワード this の束縛を判定します。 呼び出されると、次の手順を実行する。

  1. envRecord を GetThisEnvironment() とする。
  2. ? envRecord.GetThisBinding() を返す。

9.4.5 GetNewTarget ( )

抽象操作 GetNewTarget。引数なし。戻り値:(Object または undefined)。 実行中の実行コンテキストの LexicalEnvironment を使用して、NewTarget 値を判定します。 呼び出されると、次の手順を実行する。

  1. envRecord を GetThisEnvironment() とする。
  2. 表明: envRecord は [[NewTarget]] フィールドを持つ。
  3. envRecord.[[NewTarget]] を返す。

9.4.6 GetGlobalObject ( )

抽象操作 GetGlobalObject。引数なし。戻り値:Object。 現在実行中の実行コンテキストによって使用されるグローバルオブジェクトを返します。 呼び出されると、次の手順を実行する。

  1. currentRealm を現在の Realm Record とする。
  2. currentRealm.[[GlobalObject]] を返す。

9.4.7 RunSuspendedContext ( context, completionRecord )

抽象操作 RunSuspendedContext。引数 context (実行コンテキスト) および completionRecord (完了レコード)。戻り値:(正常完了 (値:(ECMAScript 言語値 または unused)) または 中途完了)。 context を再開し(再開値として completionRecord を渡します)、結果を待ちます。 呼び出されると、次の手順を実行する。

  1. callerContext を実行中の実行コンテキストとする。
  2. callerContext を中断する。
  3. context を実行コンテキストスタックにプッシュする。これで context が実行中の実行コンテキストになる。
  4. context の中断された評価を再開し、それを中断させた操作の結果として completionRecord を渡す。result を、再開された計算によって渡される Completion Record とする。
  5. 表明: この手順に到達したとき、context はすでに実行コンテキストスタックから削除されており、callerContext が再び実行中の実行コンテキストである。
  6. Completion(result) を返す。

9.4.8 RunCallerContext ( value )

抽象操作 RunCallerContext。引数 value ((ECMAScript 言語値 または empty))。戻り値:完了レコード。 呼出し元コンテキストを再開し(再開値として value を渡します)、結果がある場合はそれを待ちます。 呼び出されると、次の手順を実行する。

  1. genContext を実行中の実行コンテキストとする。
  2. genContext を実行コンテキストスタックから削除し、実行コンテキストスタックの最上位にある実行コンテキストを実行中の実行コンテキストとして復元する。
  3. callerContext を実行中の実行コンテキストとする。
  4. NormalCompletion(value) を渡して callerContext を再開する。
  5. 注記: 上の手順は制御を callerContext に移し、一時停止する。このアルゴリズム内の後続手順へ進むために一時停止を解除する唯一の方法は、genContext が再び再開されることであり、それは決して起こらない可能性もある。
  6. 表明: genContext は実行中の実行コンテキストである。
  7. result を、genContext が直前に再開された際の Completion Record とする。
  8. Completion(result) を返す。

9.5 Job および Job をキューに追加するためのホスト操作

Job は、パラメーターを持たない Abstract Closure であり、他の ECMAScript 計算が現在進行していないときに ECMAScript 計算を開始します。

Job は、特定のエージェント内で ECMAScript ホスト環境によって実行予定が設定されます。この仕様では、Job の実行予定を設定するためのホストフック HostEnqueueGenericJob、HostEnqueueFinalizationRegistryCleanupJob、HostEnqueuePromiseJob、および HostEnqueueTimeoutJob を説明します。この仕様のホストフックは、Job のスケジューリングに課される追加の制約に従って整理されています。ホストは、Job の実行予定を設定する追加の抽象操作を定義してもかまいません。このような操作は、Job Abstract Closure と Realm(Realm Record または null)をパラメーターとして受け取ります。Realm Record が提供された場合、これらの操作は、その Realm を所有するエージェント内で、将来のある時点に提供された Realm 内で Job を実行するようスケジュールします。Realm に null が提供された場合、その Job は ECMAScript コードを評価しません。その実装は次の要件に適合しなければなりません。

注 1
ホスト環境は、スケジューリングに関してすべての Job を一様に扱う必要はありません。たとえば、Web ブラウザーと Node.js は Promise を処理する Job を他の作業より高い優先度で扱います。将来の機能では、それほど高い優先度で扱われない Job が追加される可能性があります。

任意の時点において、scriptOrModule(Script Record、Module Record、または null)は、次の条件がすべて真である場合に アクティブなスクリプトまたはモジュールです。

任意の時点において、次の条件がすべて真である場合、実行は ECMAScript コードを評価する準備ができているといいます。

注 2

ホスト環境は、実行コンテキストを実行コンテキストスタックにプッシュすることによって、コードを評価するための実行を準備できます。具体的な手順は実装定義です。

Realm の具体的な選択はホスト環境に委ねられます。この最初の実行コンテキストおよび Realm は、コールバック関数が呼び出される前にのみ使用されます。Promise ハンドラーなど、Job に関連するコールバック関数が呼び出されると、その呼出しは独自の実行コンテキストと Realm をプッシュします。

特定の種類の Job には追加の適合要件があります。

9.5.1 JobCallback Record

JobCallback Record は、関数オブジェクトとホスト定義値を格納するために使用される Record です。ホストによってキューに追加された Job を介して呼び出される関数オブジェクトには、追加のホスト定義コンテキストがある場合があります。この状態を伝播するため、Job Abstract Closure は関数オブジェクトを直接捕捉して呼び出すべきではありません。代わりに HostMakeJobCallback と HostCallJobCallback を使用します。

注

たとえば、WHATWG HTML 仕様(https://html.spec.whatwg.org/)では、Promise コールバックの incumbent settings object を伝播するためにホスト定義値を使用します。

JobCallback Record は、表 24 に列挙されるフィールドを持ちます。

表 24: JobCallback Record のフィールド
フィールド名 値 意味
[[Callback]] a function object Job が呼び出されるときに呼び出す関数です。
[[HostDefined]] anything (default value is empty) ホストによる使用のために予約されたフィールドです。

9.5.2 HostMakeJobCallback ( callback )

ホスト定義の抽象操作 HostMakeJobCallback。引数 callback (関数オブジェクト)。戻り値:JobCallbackレコード。

HostMakeJobCallback の実装は、次の要件に適合しなければなりません。

  • [[Callback]] フィールドが callback である JobCallback Record を返さなければなりません。

HostMakeJobCallback の既定の実装は、呼び出されたときに次の手順を実行します。

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty } を返す。

Web ブラウザーではない ECMAScript ホストは、HostMakeJobCallback の既定の実装を使用しなければなりません。

注

これは、最終的にコールバックをスケジュールして実行する責任を持つ関数に、そのコールバックが渡された時点で呼び出されます。たとえば、promise.then(thenAction) は、リアクション Job をスケジュールするときではなく、Promise.prototype.then を呼び出す時点で thenAction に対して MakeJobCallback を呼び出します。

9.5.3 HostCallJobCallback ( jobCallback, thisValue, argList )

ホスト定義の抽象操作 HostCallJobCallback。引数 jobCallback (JobCallbackレコード)、thisValue (ECMAScript 言語値) および argList (リスト (要素:ECMAScript 言語値))。戻り値:(正常完了 (値:ECMAScript 言語値) または throw 完了)。

HostCallJobCallback の実装は、次の要件に適合しなければなりません。

  • Call(jobCallback.[[Callback]], thisValue, argList) を実行し、その結果を返さなければなりません。
注

この要件は、ホストがこの仕様で定義された関数オブジェクトの [[Call]] 動作を変更できないことを意味します。

HostCallJobCallback の既定の実装は、呼び出されたときに次の手順を実行します。

  1. 表明: IsCallable(jobCallback.[[Callback]]) は true である。
  2. ? Call(jobCallback.[[Callback]], thisValue, argList) を返す。

Web ブラウザーではない ECMAScript ホストは、HostCallJobCallback の既定の実装を使用しなければなりません。

9.5.4 HostEnqueueGenericJob ( job, realm )

ホスト定義の抽象操作 HostEnqueueGenericJob。引数 job (a Job Abstract Closure) および realm (Realmレコード)。戻り値:unused。 realm.[[AgentSignifier]] によって示されるエージェント内の Realm realm に job を、将来のある時点に実行されるようスケジュールします。このアルゴリズムで使用される Abstract Closure は、優先度や順序などの追加の制約なしでスケジュールされることを意図しています。

HostEnqueueGenericJob の実装は、9.5 の要件に適合しなければなりません。

9.5.5 HostEnqueuePromiseJob ( job, realm )

ホスト定義の抽象操作 HostEnqueuePromiseJob。引数 job (a Job Abstract Closure) および realm ((Realmレコード または null))。戻り値:unused。 job を将来のある時点に実行されるようスケジュールします。このアルゴリズムで使用される Abstract Closure は、Promise の処理に関連するか、またはその他の方法で Promise 処理操作と同等の優先度でスケジュールされることを意図しています。

HostEnqueuePromiseJob の実装は、9.5 の要件に加えて、次の要件にも適合しなければなりません。

注

NewPromiseResolveThenableJob によって返される Job の realm は通常、then 関数オブジェクトに対して GetFunctionRealm を呼び出した結果です。NewPromiseReactionJob によって返される Job の realm は通常、ハンドラーが undefined でない場合にそのハンドラーに対して GetFunctionRealm を呼び出した結果です。ハンドラーが undefined の場合、realm は null です。どちらの種類の Job についても、GetFunctionRealm が異常完了する場合(すなわち、取り消された Proxy に対して呼び出された場合)、realm は GetFunctionRealm 呼出し時の現在の Realm Record です。realm が null の場合、ユーザー ECMAScript コードは評価されず、新しい ECMAScript オブジェクト(たとえば Error オブジェクト)も作成されません。たとえば、WHATWG HTML 仕様(https://html.spec.whatwg.org/)では、realm を使用して、スクリプトを実行する能力と entry 概念を検査します。

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

ホスト定義の抽象操作 HostEnqueueTimeoutJob。引数 timeoutJob (a Job Abstract Closure)、realm (Realmレコード) および milliseconds (非負で有限の Number)。戻り値:unused。 realm.[[AgentSignifier]] によって示されるエージェント内の Realm realm に timeoutJob を、少なくとも milliseconds ミリ秒後に実行されるようスケジュールします。

HostEnqueueTimeoutJob の実装は、9.5 の要件に適合しなければなりません。

9.6 エージェント

エージェントは、ECMAScript 実行コンテキストの集合、実行コンテキストスタック、実行中の実行コンテキスト、Agent Record、および 実行スレッドから構成されます。実行スレッドを除き、エージェントの構成要素はそのエージェントだけに属します。

エージェントの実行スレッドは、他のエージェントとは独立して、そのエージェントの実行コンテキストに対するアルゴリズム手順を実行します。ただし、スレッドを共有するエージェントのいずれにも [[CanBlock]] フィールドが true の Agent Record がない場合、1つの実行スレッドを複数のエージェントが実行スレッドとして使用してもかまいません。

注 1

たとえば、一部の Web ブラウザーは、ブラウザーウィンドウ内の関連のない複数のタブ間で単一の実行スレッドを共有します。

エージェントの実行スレッドがアルゴリズム手順を実行している間、そのエージェントは、それらの手順に対する 周囲のエージェントです。手順は、周囲のエージェントを使用して、そのエージェント内に保持される仕様レベルの実行オブジェクト、すなわち実行中の実行コンテキスト、実行コンテキストスタック、および Agent Record のフィールドにアクセスします。

エージェント識別子は、Agent を識別するために使用される、グローバルに一意な不透明値です。

表 25: Agent Record のフィールド
フィールド名 値 意味
[[LittleEndian]] a Boolean アルゴリズム GetValueFromBuffer および SetValueInBuffer が必要とする場合に、isLittleEndian パラメーターに対して計算される既定値です。その選択は実装定義であり、実装にとって最も効率的な選択肢であるべきです。
[[CanBlock]] a Boolean エージェントがブロックできるかどうかを決定します。
[[Signifier]] an agent signifier エージェントクラスタ内でエージェントを一意に識別します。
[[IsLockFree1]] a Boolean 1バイト値に対するアトミック操作がロックフリーである場合は true、それ以外の場合は false です。
[[IsLockFree2]] a Boolean 2バイト値に対するアトミック操作がロックフリーである場合は true、それ以外の場合は false です。
[[IsLockFree8]] a Boolean 8バイト値に対するアトミック操作がロックフリーである場合は true、それ以外の場合は false です。
[[CandidateExecution]] a candidate execution Record メモリモデルを参照してください。
[[KeptAlive]] a List of either Objects or Symbols 初期状態では新しい空の List であり、現在の Job の終了まで生存させるオブジェクトおよび/またはシンボルのリストを表します。
[[ModuleAsyncEvaluationCount]] an integer 初期値は 0 であり、非同期であるか非同期依存関係を持つモジュールの [[AsyncEvaluationOrder]] フィールドに、一意に増加する値を割り当てるために使用されます。
[[GlobalSymbolRegistry]] a List of GlobalSymbolRegistry Records 初期状態では新しい空の List であり、Symbol.for によって生成された Symbol 値のリストを表します。

[[LittleEndian]]、[[Signifier]]、[[IsLockFree1]]、[[IsLockFree2]]、および [[IsLockFree8]] の値は変更できません。

[[GlobalSymbolRegistry]] List は追記専用であり、再代入されることはありません。

注 2

[[IsLockFree1]]、[[IsLockFree2]]、および [[IsLockFree8]] の値は、必ずしもハードウェアだけによって決定されるものではなく、時間の経過や ECMAScript 実装間で異なり得る実装上の選択も反映する場合があります。

[[IsLockFree4]] フィールドは存在しません。4バイトのアトミック操作は常にロックフリーです。

実際には、アトミック操作が何らかの種類のロックを使用して実装されている場合、その操作はロックフリーではありません。ロックフリーであることはウェイトフリーであることを意味しません。ロックフリーなアトミック操作の完了に必要となる機械ステップ数には上限がありません。

サイズ n のアトミックアクセスがロックフリーであることは、サイズ n の非アトミックアクセスの(知覚される)原子性について何も意味しません。特に、非アトミックアクセスは複数の独立したメモリアクセスの列として実行される場合があります。詳細については ReadSharedMemory および WriteSharedMemory を参照してください。

注 3

エージェントは仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。

9.6.1 AgentSignifier ( )

抽象操作 AgentSignifier。引数なし。戻り値:an agent signifier。 呼び出されると、次の手順を実行する。

  1. agentRecord を周囲のエージェントの Agent Record とする。
  2. agentRecord.[[Signifier]] を返す。

9.6.2 AgentCanSuspend ( )

抽象操作 AgentCanSuspend。引数なし。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. agentRecord を周囲のエージェントの Agent Record とする。
  2. agentRecord.[[CanBlock]] を返す。
注

一部の環境では、特定のエージェントを中断することが妥当でない場合があります。たとえば Web ブラウザー環境では、文書のメインイベント処理スレッドの中断は禁止しつつ、Worker のイベント処理スレッドの中断は許可することが妥当な場合があります。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

抽象操作 IncrementModuleAsyncEvaluationCount。引数なし。戻り値:非負整数。 呼び出されると、次の手順を実行する。

  1. agentRecord を周囲のエージェントの Agent Record とする。
  2. count を agentRecord.[[ModuleAsyncEvaluationCount]] とする。
  3. agentRecord.[[ModuleAsyncEvaluationCount]] を count + 1 に設定する。
  4. count を返す。
注

この値は、保留中のモジュール間の相対的な評価順序を追跡するためにのみ使用されます。保留中のモジュールが存在しないときはいつでも、実装は観測されることなく [[ModuleAsyncEvaluationCount]] を 0 にリセットしてもかまいません。

9.7 エージェントクラスタ

エージェントクラスタは、共有メモリを操作することで通信できるエージェントの極大集合です。

注 1

異なるエージェント内のプログラムは、規定されていない方法でメモリを共有する場合があります。少なくとも、SharedArrayBuffer の基盤となるメモリは、クラスタ内のエージェント間で共有できます。

メッセージパッシングによって通信できてもメモリを共有できないエージェントが存在する場合があります。そのようなエージェントが同じエージェントクラスタに属することはありません。

すべてのエージェントは、正確に1つのエージェントクラスタに属します。

注 2

クラスタ内のすべてのエージェントが、ある特定の時点で生存している必要はありません。エージェント A が別のエージェント B を作成し、その後 A が終了し、B がエージェント C を作成した場合、A が B と何らかのメモリを共有でき、B が C と何らかのメモリを共有できるのであれば、3つのエージェントは同じクラスタに属します。

クラスタ内のすべてのエージェントは、それぞれの Agent Record の [[LittleEndian]] フィールドについて同じ値を持たなければなりません。

注 3

エージェントクラスタ内の異なるエージェントが [[LittleEndian]] について異なる値を持つ場合、複数バイトデータに共有メモリを使用することが困難になります。

クラスタ内のすべてのエージェントは、それぞれの Agent Record の [[IsLockFree1]] フィールドについて同じ値を持たなければなりません。[[IsLockFree2]] および [[IsLockFree8]] フィールドについても同様です。

クラスタ内のすべてのエージェントは、それぞれの Agent Record の [[Signifier]] フィールドについて異なる値を持たなければなりません。

埋込み環境は、エージェントの知識または協力なしに、エージェントを非アクティブ化(前進を停止)またはアクティブ化(前進を再開)してもかまいません。埋込み環境がこれを行う場合、クラスタ内の一部のエージェントをアクティブなままにし、同じクラスタ内の別のエージェントを無期限に非アクティブ化したままにしてはなりません。

注 4

前述の制約の目的は、別のエージェントが非アクティブ化されたために、あるエージェントがデッドロックしたり枯渇したりする状況を避けることです。たとえば、どのウィンドウ内の文書からも独立した存続期間を持つ HTML Shared Worker が、そのような独立した文書の Dedicated Worker とメモリを共有できるとします。その文書と Dedicated Worker が、Dedicated Worker がロックを保持している間に非アクティブ化され(たとえば、文書がそのウィンドウの履歴にプッシュされ)、その後 Shared Worker がそのロックの取得を試みた場合、Shared Worker は、Dedicated Worker が再びアクティブ化されるまで、場合によっては永遠に、ブロックされます。その間、他のウィンドウから Shared Worker にアクセスしようとする他の Worker は枯渇します。

この制約から、埋込み環境内で同じ中断/復帰集合に属さないエージェント間ではメモリを共有できないことになります。

埋込み環境は、エージェントのクラスタ内の他のエージェントに事前に知られることも協力されることもなく、エージェントを終了してもかまいません。エージェントが自身またはクラスタ内の別のエージェントのプログラム上の操作によってではなく、クラスタ外部の力によって終了された場合、埋込み環境は次の2つの戦略のいずれかを選択しなければなりません。クラスタ内のすべてのエージェントを終了するか、クラスタ内のエージェントが協調できる信頼性のある API を提供し、クラスタに残る少なくとも1つのメンバーが終了を検出できるようにし、その終了データに終了されたエージェントを識別するのに十分な情報を含めるかのいずれかです。

注 5

そのような終了の例としては、別々のプロセスで実行されているエージェントをオペレーティングシステムまたはユーザーが終了する場合や、エージェント単位のリソース計測によってそのエージェントが暴走していることが示されたため、他のエージェントと同一プロセス内で実行されているエージェントを埋込み環境自身が終了する場合があります。

次の各仕様値、およびそれらから推移的に到達可能な値は、正確に1つのエージェントクラスタに属します。

クラスタ内の任意のエージェントによって ECMAScript コードが評価される前に、クラスタ内のすべてのエージェントの Agent Record の [[CandidateExecution]] フィールドが initial candidate execution に設定されます。initial candidate execution は空の candidate execution であり、その [[EventsRecords]] フィールドは、各エージェントについて、そのエージェントの agent signifier を [[AgentSignifier]] フィールドに持ち、[[EventList]] および [[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List です。

注 6

エージェントクラスタ内のすべてのエージェントは、その Agent Record の [[CandidateExecution]] フィールドで同じ candidate execution を共有します。candidate execution は、メモリモデルで使用される仕様上の仕組みです。

注 7

エージェントクラスタは仕様上の仕組みであり、ECMAScript 実装の特定の実体に対応する必要はありません。

9.8 前進保証

エージェントが前進するとは、この仕様に従って評価手順を実行することです。

エージェントの実行中の実行コンテキストが外部イベントを同期的かつ無期限に待機すると、そのエージェントはブロックされます。この意味でブロックされ得るのは、Agent Record の [[CanBlock]] フィールドが true であるエージェントだけです。非ブロックエージェントとは、ブロックされていないエージェントです。

実装は次のことを保証しなければなりません。

注

これは、メモリモデルの生存性保証とあわせて、すべての seq-cst 書込みが最終的にすべてのエージェントから観測可能になることを保証します。

9.9 WeakRef および FinalizationRegistry のターゲットの処理モデル

9.9.1 目的

この仕様は、いかなるオブジェクトまたはシンボルがガベージコレクションされることについても保証しません。生存していないオブジェクトやシンボルであっても、長期間の後に解放される場合もあれば、まったく解放されない場合もあります。このため、この仕様では、ガベージコレクションによって引き起こされる動作を説明するときに「してもよい」という表現を使用します。

WeakRef と FinalizationRegistry の意味論は、特定の時点に発生する2つの操作に基づいています。

  • WeakRef.prototype.deref が呼び出されると、参照対象(undefined が返されなかった場合)は生存状態に維持され、その後の同期的なアクセスでも同じ値が返されるようになります。このリストは、ClearKeptObjects 抽象操作を使用して同期作業が完了したときにリセットされます。
  • FinalizationRegistry に登録されたオブジェクトまたはシンボルが到達不能になると、同期的な ECMAScript 実行が完了した後、最終的に FinalizationRegistry のクリーンアップコールバックが呼び出される場合があります。FinalizationRegistry のクリーンアップは CleanupFinalizationRegistry 抽象操作によって実行されます。

これらのどちらの操作(ClearKeptObjects または CleanupFinalizationRegistry)も、同期的な ECMAScript 実行を中断してはなりません。ホストはより長い同期的な ECMAScript 実行をまとめる場合があるため、この仕様では ClearKeptObjects と CleanupFinalizationRegistry のスケジューリングをホスト環境に委ねます。

一部の ECMAScript 実装には、ECMAScript がアイドル状態のときも含め、バックグラウンドで実行されるガベージコレクター実装が含まれます。ホスト環境に CleanupFinalizationRegistry のスケジューリングを委ねることで、ファイナライザー処理を実行するために ECMAScript 実行を再開でき、保持されている値を解放して全体のメモリ使用量を削減できる場合があります。

9.9.2 生存性

オブジェクトおよび/またはシンボルのある集合 objSet について、objSet に関する 仮想的な WeakRef 非依存実行とは、参照対象が objSet の要素である WeakRef の抽象操作 WeakRefDeref が常に undefined を返す実行です。

注 1
WeakRef 非依存性は、生存性とあわせて2つの概念を表します。1つ目は、WeakRef 自身はその参照対象を生存させないということです。2つ目は、生存性の循環が値の生存を意味しないということです。具体的には、v の生存性を判定するために WeakRef の参照対象 r の生存性の判定が必要である場合、r の生存性を判定する際に v の生存性を前提にすることはできません。それは循環論法になるためです。
注 2
循環を考慮するため、WeakRef 非依存性は個々の値ではなくオブジェクトまたはシンボルの集合について定義されます。個々の値について定義した場合、循環内の WeakRef の参照対象は、その同一性が循環内の他の WeakRef の参照対象を介してのみ観測される場合でも、生存しているとみなされてしまいます。
注 3
口語的には、個々のオブジェクトまたはシンボルを含むすべての集合が生存している場合、そのオブジェクトまたはシンボルは生存しているといいます。

評価中の任意の時点で、オブジェクトおよび/またはシンボルの集合 objSet は、次の条件のいずれかを満たす場合に 生存しているとみなされます。

  • objSet 内のいずれかの要素が、いずれかのエージェントの [[KeptAlive]] List に含まれる。
  • objSet に関する有効な将来の仮想的な WeakRef 非依存実行が存在し、その実行が objSet 内のいずれかの値の同一性を観測する。
注 4
上記の2番目の条件は、WeakRef 以外の手段によって同一性を観測できる場合に値が生存している、という直感を表すことを意図しています。値の同一性は、厳密等価比較を観測することや、値が Map のキーとして使用されることを観測することによって確認できる場合があります。
注 5

フィールド、内部スロット、またはプロパティにオブジェクトまたはシンボルが存在すること自体は、その値が生存していることを意味しません。たとえば、問題の値がプログラムへ決して返されない場合、その値は観測できません。

これは、WeakMap のキー、WeakSet のメンバー、および FinalizationRegistry Cell Record の [[WeakRefTarget]] と [[UnregisterToken]] フィールドに該当します。

上記の定義は、WeakMap のキーが生存していない場合、その対応する値も必ずしも生存しているわけではないことを意味します。

注 6
生存性は、エンジンがどの WeakRef を空にしてはならないかを保証するための下限です。ここで定義される生存性は決定不能です。実際には、エンジンは到達可能性などの保守的な近似を使用します。実装には大きな裁量が認められることが想定されています。

9.9.3 実行

任意の時点で、オブジェクトおよび/またはシンボルの集合 objSet が生存していない場合、ECMAScript 実装は次の手順を原子的に実行してもかまいません。

  1. objSet の各要素 value について、次を行う。
    1. ref.[[WeakRefTarget]] が value である各 WeakRef ref について、次を行う。
      1. ref.[[WeakRefTarget]] を empty に設定する。
    2. finalizationRegistry.[[Cells]] が cell.[[WeakRefTarget]] が value である Record cell を含む各 FinalizationRegistry finalizationRegistry について、次を行う。
      1. cell.[[WeakRefTarget]] を empty に設定する。
      2. enqueueCleanup を true または false のいずれかとして実装定義で選択する。
      3. enqueueCleanup が true である場合、HostEnqueueFinalizationRegistryCleanupJob(finalizationRegistry) を実行する。
    3. map.[[WeakMapData]] が entry.[[Key]] が value である Record entry を含む各 WeakMap map について、次を行う。
      1. entry.[[Key]] を empty に設定する。
      2. entry.[[Value]] を empty に設定する。
    4. set.[[WeakSetData]] が value を含む各 WeakSet set について、次を行う。
      1. set.[[WeakSetData]] 内の値が value である要素を、値が empty である要素に置換する。
注 1

生存性の定義とあわせて、この箇条は実装が WeakRef に関して適用してもよい最適化を規定します。

オブジェクトの同一性を観測せずにそのオブジェクトへアクセスすることは可能です。同一性が観測されない、外部へ脱出しないオブジェクトのプロパティに対するデッド変数除去やスカラー置換などの最適化は許可されます。したがって、これらの最適化が、そのようなオブジェクトを指す WeakRef を観測可能な形で空にすることも許可されます。

一方、オブジェクトの同一性が観測可能で、そのオブジェクトが WeakRef の [[WeakRefTarget]] 内部スロットにある場合、WeakRef を観測可能な形で空にする再実体化などの最適化は禁止されます。

HostEnqueueFinalizationRegistryCleanupJob の呼出しは任意であるため、FinalizationRegistry に登録されたオブジェクトが、その FinalizationRegistry を必ずしも生存させるわけではありません。実装は任意の理由で FinalizationRegistry のコールバックを省略してもかまいません。たとえば、FinalizationRegistry 自身が生存しなくなった場合や、アプリケーションが終了中の場合などです。

注 2

実装は、生存していないオブジェクトまたはシンボルの極大集合について WeakRef を空にする義務を負いません。

実装が WeakRef を空にする生存していない集合 objSet を選択した場合、この定義は objSet 内のすべての値について WeakRef を同時に空にすることを要求します。言い換えると、値 v を指す WeakRef を空にする一方で、空にしなければ v の値を観測する実行につながり得る他の WeakRef を空にしないことは、適合する実装ではありません。

9.9.4 ホストフック

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

ホスト定義の抽象操作 HostEnqueueFinalizationRegistryCleanupJob。引数 finalizationRegistry (FinalizationRegistry)。戻り値:unused。

cleanupJob を、パラメーターを持たず、finalizationRegistry を捕捉し、呼び出されたときに次の手順を実行する新しい Job Abstract Closure とする。

  1. cleanupResult を Completion(CleanupFinalizationRegistry(finalizationRegistry)) とする。
  2. cleanupResult が中断完了である場合、エラーを報告するためのホスト定義の手順を実行する。
  3. unused を返す。

HostEnqueueFinalizationRegistryCleanupJob の実装は、可能であれば cleanupJob を将来のある時点に実行されるようスケジュールします。また、9.5 の要件にも適合しなければなりません。

9.10 ClearKeptObjects ( )

抽象操作 ClearKeptObjects。引数なし。戻り値:unused。 ECMAScript 実装は、ECMAScript 実行の同期的な列が完了したときに ClearKeptObjects を呼び出すことが期待されます。 呼び出されると、次の手順を実行する。

  1. agentRecord を周囲のエージェントの Agent Record とする。
  2. agentRecord.[[KeptAlive]] を新しい空の List に設定する。
  3. unused を返す。

9.11 AddToKeptObjects ( value )

抽象操作 AddToKeptObjects。引数 value ((Object または Symbol))。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. agentRecord を周囲のエージェントの Agent Record とする。
  2. value を agentRecord.[[KeptAlive]] に追加する。
  3. unused を返す。
注
Abstract Operation AddToKeptObjects が対象オブジェクトまたはシンボルを指定して呼び出されると、その対象を、ClearKeptObjects が呼び出されるまで対象を強参照するリストに追加します。

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

抽象操作 CleanupFinalizationRegistry。引数 finalizationRegistry (FinalizationRegistry)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. 表明: finalizationRegistry は [[Cells]] および [[CleanupCallback]] 内部スロットを持つ。
  2. callback を finalizationRegistry.[[CleanupCallback]] とする。
  3. finalizationRegistry.[[Cells]] が cell.[[WeakRefTarget]] が empty である Record cell を含む間、実装は次の手順を実行してもかまわない。
    1. そのような cell を任意に1つ選択する。
    2. cell を finalizationRegistry.[[Cells]] から削除する。
    3. ? HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») を実行する。
  4. unused を返す。

9.13 CanBeHeldWeakly ( arg )

抽象操作 CanBeHeldWeakly。引数 arg (ECMAScript 言語値)。戻り値:Boolean。 arg が弱参照として使用するのに適している場合に限り true を返します。弱参照として使用するのに適した値だけが、WeakMap のキー、WeakSet の要素、WeakRef の対象、または FinalizationRegistry の対象の1つになることができます。 呼び出されると、次の手順を実行する。

  1. arg が Object である場合、true を返す。
  2. arg が Symbol であり、KeyForSymbol(arg) が undefined である場合、true を返す。
  3. false を返す。
注

言語上の同一性を持たない言語値は、事前の参照なしに具現化できるため、弱参照としての使用には適していません。Symbol.for によって生成された Symbol 値は、他の Symbol 値とは異なり、言語上の同一性を持たず、弱参照としての使用には適していません。ウェルノウンシンボルは、ほとんど収集されない可能性がありますが、その数が限定されており、さまざまな実装手法で管理可能であるため、それでも弱参照としての使用に適しているものとして扱われます。ただし、生存している WeakMap 内でウェルノウンシンボルに関連付けられた値は収集される可能性が低く、実装内でメモリリソースを「リーク」する可能性があります。