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

9.1 Environment Records

Environment Recordは、ECMAScriptコードの字句的な入れ子構造に基づいて、Identifierと特定の変数および関数との関連付けを定義するために使用される仕様型です。通常、Environment Recordは、FunctionDeclarationBlockStatement、またはTryStatementCatch節など、ECMAScriptコードの何らかの特定の構文構造に関連付けられます。そのようなコードが評価されるたびに、そのコードによって作成されるidentifier bindingsを記録するため、新しいEnvironment Recordが作成されます。

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

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

9.1.1 Environment Record型階層

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

  • Environment Record(抽象)

    • Declarative Environment Recordは、FunctionDeclarationVariableDeclaration、およびCatch節など、identifier bindingsをECMAScript言語値と直接関連付けるECMAScript言語構文要素の効果を定義するために使用されます。

      • Function Environment Recordは、ECMAScript function objectの呼び出しに対応し、その関数内のtop-level declarationsに対するbindingsを含みます。これは新しいthis bindingを確立する場合があります。また、super method呼び出しをサポートするために必要な状態もcaptureします。

      • Module Environment Recordは、Moduleのtop-level declarationsに対するbindingsを含みます。また、Moduleによって明示的にimportされるbindingsも含みます。その[[OuterEnv]]Global Environment Recordです。

    • Object Environment Recordは、identifier bindingsを何らかのオブジェクトのプロパティと関連付けるWithStatementなどのECMAScript要素の効果を定義するために使用されます。

    • Global Environment Recordは、Scriptのglobal declarationsに使用されます。これは外側環境を持たず、その[[OuterEnv]]nullです。identifier bindingsが事前に設定されている場合があり、関連付けられたglobal objectを含み、そのプロパティはglobal environmentのidentifier bindingsの一部を提供します。ECMAScriptコードが実行されるにつれて、global objectに追加のプロパティが追加され、初期プロパティが変更される場合があります。

Environment Record抽象クラスは、Table 15で定義される抽象仕様メソッドを含みます。これらの抽象メソッドは、具体サブクラスごとに異なる具体アルゴリズムを持ちます。

Table 15: Abstract Methods of Environment Records
メソッド 目的 定義
HasBinding ( name )

The abstract method HasBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは、Environment Recordnameに対するbindingを持つかどうかを決定します。
これは次の型に具体定義を持ちます:
CreateMutableBinding ( name, deletable )

The abstract method CreateMutableBinding takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは、Environment Record内に、新しいが未初期化のmutable bindingを作成します。nameはbound nameのテキストです。deletabletrueなら、そのbindingは後で削除される場合があります。
これは次の型に具体定義を持ちます:
CreateImmutableBinding ( name, strict )

The abstract method CreateImmutableBinding takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは、Environment Record内に、新しいが未初期化のimmutable bindingを作成します。nameはbound nameのテキストです。stricttrueなら、それが初期化された後に設定しようとする試みは、そのbindingを参照する操作のstrict mode設定にかかわらず、常に例外をthrowします。
これは次の型に具体定義を持ちます:
InitializeBinding ( name, value )

The abstract method InitializeBinding takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion.

これは、Environment Record内の既存だが未初期化のbindingの値を設定します。nameはbound nameのテキストです。valueはそのbindingの値です。
これは次の型に具体定義を持ちます:
SetMutableBinding ( name, value, strict )

The abstract method SetMutableBinding takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

これは、Environment Record内の既存のmutable bindingの値を設定します。nameはbound nameのテキストです。valueはそのbindingの値です。stricttrueで、そのbindingを設定できない場合、これはTypeError例外をthrowします。
これは次の型に具体定義を持ちます:
GetBindingValue ( name, strict )

The abstract method GetBindingValue takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion.

これは、Environment Recordから既存のbindingの値を返します。nameはbound nameのテキストです。strictは、strict mode codeに由来する参照、またはそれ以外でstrict mode reference semanticsを必要とする参照を識別するために使用されます。stricttrueでbindingが存在しない場合、これはReferenceError例外をthrowします。bindingが存在していても未初期化である場合、strictの値にかかわらずReferenceErrorがthrowされます。
これは次の型に具体定義を持ちます:
DeleteBinding ( name )

The abstract method DeleteBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

これは、Environment Recordからbindingを削除します。nameはbound nameのテキストです。nameに対するbindingが存在する場合、これはbindingを削除してtrueを返します。bindingは存在するが削除できない場合、これはfalseを返します。bindingが存在しない場合、これはtrueを返します。
これは次の型に具体定義を持ちます:
HasThisBinding ( )

The abstract method HasThisBinding takes no arguments and returns a Boolean.

これは、Environment Recordthis bindingを確立するかどうかを決定します。確立する場合はtrueを返し、そうでない場合はfalseを返します。
これは次の型に具体定義を持ちます:
GetThisBinding ( )

The abstract method GetThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion.

これは、このEnvironment Recordthis bindingの値を返します。this bindingが初期化されていない場合、ReferenceErrorをthrowします。
これは次の型に具体定義を持ちます:
HasSuperBinding ( )

The abstract method HasSuperBinding takes no arguments and returns a Boolean.

これは、Environment Recordsuper method bindingを確立するかどうかを決定します。確立する場合はtrueを返し、そうでない場合はfalseを返します。trueを返す場合、そのEnvironment RecordFunction Environment Recordであることを含意しますが、その逆は成り立ちません。
これは次の型に具体定義を持ちます:
WithBaseObject ( )

The abstract method WithBaseObject takes no arguments and returns an Object or undefined.

このEnvironment Recordwith statementに関連付けられている場合、これはwith objectを返します。そうでない場合、undefinedを返します。
これは次の型に具体定義を持ちます:

9.1.1.1 Declarative Environment Records

Declarative Environment Recordは、variable、constant、let、class、module、import、および/またはfunction declarationsを含むECMAScriptプログラムscopeに関連付けられます。Declarative Environment Recordは、そのscope内に含まれるdeclarationsによって定義される識別子集合をbindします。

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

9.1.1.1.1 HasBinding ( name )

The HasBinding concrete method of an Declarative Environment Record envRecord takes argument name (a String) and returns a normal completion containing a Boolean. これは、argument identifierがそのrecordによってbindされるidentifiersの1つであるかどうかを決定します。 It performs the following steps when called:

  1. envRecordnameに対するbindingを持つなら、trueを返す。
  2. falseを返す。

9.1.1.1.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of an Declarative Environment Record envRecord takes arguments name (a String) and deletable (a Boolean) and returns a normal completion containing unused. これは、未初期化である名前nameに対する新しいmutable bindingを作成します。このEnvironment Record内にnameに対するbindingが既に存在してはなりません。deletabletrueなら、新しいbindingは削除対象であるとして印付けられます。 It performs the following steps when called:

  1. Assert: envRecordnameに対するbindingを既に持っていない。
  2. envRecord内にnameに対するmutable bindingを作成し、それが未初期化であることを記録する。deletabletrueなら、新しく作成されたbindingが後続のDeleteBinding呼び出しによって削除され得ることを記録する。
  3. unusedを返す。

9.1.1.1.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of an Declarative Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns a normal completion containing unused. これは、未初期化である名前nameに対する新しいimmutable bindingを作成します。このEnvironment Record内にnameに対するbindingが既に存在してはなりません。stricttrueなら、新しいbindingはstrict bindingとして印付けられます。 It performs the following steps when called:

  1. Assert: envRecordnameに対するbindingを既に持っていない。
  2. envRecord内にnameに対するimmutable bindingを作成し、それが未初期化であることを記録する。stricttrueなら、新しく作成されたbindingがstrict bindingであることを記録する。
  3. unusedを返す。

9.1.1.1.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of an Declarative Environment Record envRecord takes arguments name (a String) and value (an ECMAScript language value) and returns a normal completion containing unused. これは、名前がnameであるidentifierの現在のbindingのbound valueを、値valueに設定するために使用されます。nameに対する未初期化のbindingが既に存在していなければなりません。 It performs the following steps when called:

  1. Assert: envRecordnameに対する未初期化のbindingを持っていなければならない。
  2. envRecord内のnameに対するbound valueをvalueに設定する。
  3. envRecord内のnameに対するbindingが初期化済みであることをRecordする。
  4. unusedを返す。

9.1.1.1.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of an Declarative Environment Record envRecord takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前がnameであるidentifierの現在のbindingのbound valueを、値valueに変更しようとします。nameに対するbindingは通常既に存在しますが、まれに存在しない場合があります。bindingがimmutable bindingである場合、stricttrueならTypeErrorがthrowされます。 It performs the following steps when called:

  1. envRecordnameに対するbindingを持たないなら、
    1. stricttrueなら、ReferenceError例外をthrowする。
    2. envRecord.CreateMutableBinding(name, true)を実行する。
    3. envRecord.InitializeBinding(name, value)を実行する。
    4. unusedを返す。
  2. envRecord内のnameに対するbindingがstrict bindingなら、stricttrueに設定する。
  3. envRecord内のnameに対するbindingがまだ初期化されていないなら、
    1. ReferenceError例外をthrowする。
  4. そうでなく、envRecord内のnameに対するbindingがmutable bindingなら、
    1. そのbound valueをvalueへ変更する。
  5. そうでなければ、
    1. Assert: これはimmutable bindingの値を変更しようとする試みである。
    2. stricttrueなら、TypeError例外をthrowする。
  6. unusedを返す。
Note

ステップ1でmissing bindingになるECMAScriptコードの例は次のとおりです:

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

9.1.1.1.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of an Declarative Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、名前がnameである自身のbound identifierの値を返します。bindingが存在するが未初期化である場合、strictの値にかかわらずReferenceErrorがthrowされます。 It performs the following steps when called:

  1. Assert: envRecordnameに対するbindingを持つ。
  2. envRecord内のnameに対するbindingが未初期化のbindingなら、ReferenceError例外をthrowする。
  3. envRecord内でnameに現在bindされている値を返す。

9.1.1.1.7 DeleteBinding ( name )

The DeleteBinding concrete method of an Declarative Environment Record envRecord takes argument name (a String) and returns a normal completion containing a Boolean. これは、明示的に削除対象として指定されたbindingsのみを削除できます。 It performs the following steps when called:

  1. Assert: envRecordnameに対するbindingを持つ。
  2. envRecord内のnameに対するbindingを削除できないなら、falseを返す。
  3. envRecordからnameに対するbindingを削除する。
  4. trueを返す。

9.1.1.1.8 HasThisBinding ( )

The HasThisBinding concrete method of an Declarative Environment Record envRecord takes no arguments and returns false. It performs the following steps when called:

  1. falseを返す。
Note

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

9.1.1.1.9 GetThisBinding ( )

Declarative Environment RecordGetThisBinding concrete methodは、この仕様内では決して使用されません。

9.1.1.1.10 HasSuperBinding ( )

The HasSuperBinding concrete method of an Declarative Environment Record envRecord takes no arguments and returns false. It performs the following steps when called:

  1. falseを返す。
Note

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

9.1.1.1.11 WithBaseObject ( )

The WithBaseObject concrete method of an Declarative Environment Record envRecord takes no arguments and returns undefined. It performs the following steps when called:

  1. undefinedを返す。

9.1.1.2 Object Environment Records

Object Environment Recordは、自身のbinding objectと呼ばれるオブジェクトに関連付けられます。Object Environment Recordは、そのbinding objectのプロパティ名に直接対応するstring identifier namesの集合をbindします。IdentifierName形式のstringsでないproperty keysは、bound identifiersの集合に含まれません。own propertiesとinherited propertiesの両方が、その[[Enumerable]]属性の設定にかかわらず集合に含まれます。プロパティはオブジェクトに動的に追加および削除できるため、Object Environment Recordによってbindされるidentifiersの集合は、プロパティを追加または削除する任意の操作のside-effectとして変化する可能性があります。そのようなside-effectの結果として作成されるbindingsは、対応するプロパティのWritable属性がfalseであってもmutable bindingとみなされます。Object Environment Recordsにはimmutable bindingsは存在しません。

with statements(14.11)のために作成されるObject Environment Recordsは、function callsで使用するための暗黙のthis値として、そのbinding objectを提供できます。この能力はBoolean [[IsWithEnvironment]]フィールドによって制御されます。

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

Table 16: Additional Fields of Object Environment Records
フィールド名 意味
[[BindingObject]] Object このEnvironment Recordのbinding object。
[[IsWithEnvironment]] Boolean このEnvironment Recordwith statementのために作成されたかどうかを示します。

9.1.1.2.1 HasBinding ( name )

The HasBinding concrete method of an Object Environment Record envRecord takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、自身に関連付けられたbinding objectが、名前がnameであるプロパティを持つかどうかを決定します。 It performs the following steps when called:

  1. bindingObjenvRecord.[[BindingObject]]とする。
  2. foundBindingを ? HasProperty(bindingObj, name) とする。
  3. foundBindingfalseなら、falseを返す。
  4. envRecord.[[IsWithEnvironment]]falseなら、trueを返す。
  5. unscopablesを ? Get(bindingObj, %Symbol.unscopables%) とする。
  6. unscopablesがObjectなら、
    1. blockedToBoolean(? Get(unscopables, name))とする。
    2. blockedtrueなら、falseを返す。
  7. trueを返す。

9.1.1.2.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of an Object Environment Record envRecord takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Recordに関連付けられたbinding object内に、名前がnameであるプロパティを作成し、それを値undefinedで初期化します。deletabletrueなら、新しいプロパティの[[Configurable]]属性はtrueに設定されます。そうでなければfalseに設定されます。 It performs the following steps when called:

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

通常、envRecordnameに対するbindingを持ちませんが、持つ場合、DefinePropertyOrThrowの意味論は、既存のbindingが置換またはshadowされる結果になるか、abrupt completionが返される原因となる場合があります。

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Object Environment RecordCreateImmutableBinding concrete methodは、この仕様内では決して使用されません。

9.1.1.2.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of an Object Environment Record envRecord takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前がnameであるidentifierの現在のbindingのbound valueを、値valueに設定するために使用されます。 It performs the following steps when called:

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

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

9.1.1.2.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of an Object Environment Record envRecord takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、Environment Recordに関連付けられたbinding objectの、名前がnameであるプロパティの値を、値valueに設定しようとします。nameという名前のプロパティは通常既に存在しますが、存在しない場合や現在writableでない場合、error handlingはstrictによって決定されます。 It performs the following steps when called:

  1. bindingObjenvRecord.[[BindingObject]]とする。
  2. stillExistsを ? HasProperty(bindingObj, name) とする。
  3. stillExistsfalseかつstricttrueなら、ReferenceError例外をthrowする。
  4. Set(bindingObj, name, value, strict)を実行する。
  5. unusedを返す。

9.1.1.2.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of an Object Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、自身に関連付けられたbinding objectの、名前がnameであるプロパティの値を返します。そのプロパティは既に存在するべきですが、存在しない場合、結果はstrictに依存します。 It performs the following steps when called:

  1. bindingObjenvRecord.[[BindingObject]]とする。
  2. valueを ? HasProperty(bindingObj, name) とする。
  3. valuefalseなら、
    1. strictfalseなら、undefinedを返す。
    2. ReferenceError例外をthrowする。
  4. Get(bindingObj, name)を返す。

9.1.1.2.7 DeleteBinding ( name )

The DeleteBinding concrete method of an Object Environment Record envRecord takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、environment objectのプロパティに対応するbindingsのうち、その[[Configurable]]属性の値がtrueであるもののみを削除できます。 It performs the following steps when called:

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

9.1.1.2.8 HasThisBinding ( )

The HasThisBinding concrete method of an Object Environment Record envRecord takes no arguments and returns false. It performs the following steps when called:

  1. falseを返す。
Note

Object Environment Recordsthis bindingを提供しません。

9.1.1.2.9 GetThisBinding ( )

Object Environment RecordGetThisBinding concrete methodは、この仕様内では決して使用されません。

9.1.1.2.10 HasSuperBinding ( )

The HasSuperBinding concrete method of an Object Environment Record envRecord takes no arguments and returns false. It performs the following steps when called:

  1. falseを返す。
Note

Object Environment Recordssuper bindingを提供しません。

9.1.1.2.11 WithBaseObject ( )

The WithBaseObject concrete method of an Object Environment Record envRecord takes no arguments and returns an Object or undefined. It performs the following steps when called:

  1. envRecord.[[IsWithEnvironment]]trueなら、envRecord.[[BindingObject]]を返す。
  2. undefinedを返す。

9.1.1.3 Function Environment Records

Function Environment Recordは、functionのtop-level scopeを表すために使用されるDeclarative Environment Recordであり、そのfunctionがArrowFunction functionまたはAsyncArrowFunction functionでない場合、this bindingを提供します。functionがArrowFunction functionまたはAsyncArrowFunction functionでなく、かつsuperを参照する場合、そのFunction Environment Recordは、function内からsuper method呼び出しを実行するために使用される状態も含みます。

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

Table 17: Additional Fields of Function Environment Records
フィールド名 意味
[[ThisValue]] ECMAScript言語値 これは、このfunctionのこの呼び出しに使用されるthis値です。
[[ThisBindingStatus]] lexical, initialized, or uninitialized 値がlexicalである場合、これはArrowFunctionまたはAsyncArrowFunctionであり、localなthis値を持ちません。
[[FunctionObject]] ECMAScript function object このEnvironment Recordが作成される原因となった呼び出しのfunction object
[[NewTarget]] constructorまたはundefined このEnvironment Record[[Construct]] internal methodによって作成された場合、[[NewTarget]][[Construct]] newTarget parameterの値です。そうでない場合、その値はundefinedです。

Function Environment Recordsは、Table 15に列挙されるすべてのDeclarative Environment Record methodsをサポートし、HasThisBindingGetThisBinding、およびHasSuperBindingを除くそれらすべてのメソッドについて同じ仕様を共有します。

9.1.1.3.1 BindThisValue ( envRecord, value )

The abstract operation BindThisValue takes arguments envRecord (a Function Environment Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これはenvRecord.[[ThisValue]]を設定し、それが初期化済みであることを記録します。 It performs the following steps when called:

  1. Assert: envRecord.[[ThisBindingStatus]]lexicalでない。
  2. envRecord.[[ThisBindingStatus]]initializedなら、ReferenceError例外をthrowする。
  3. envRecord.[[ThisValue]]valueに設定する。
  4. envRecord.[[ThisBindingStatus]]initializedに設定する。
  5. unusedを返す。

9.1.1.3.2 HasThisBinding ( )

The HasThisBinding concrete method of a Function Environment Record envRecord takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRecord.[[ThisBindingStatus]]lexicalなら、falseを返す。
  2. trueを返す。

9.1.1.3.3 GetThisBinding ( )

The GetThisBinding concrete method of a Function Environment Record envRecord takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. Assert: envRecord.[[ThisBindingStatus]]lexicalでない。
  2. envRecord.[[ThisBindingStatus]]uninitializedなら、ReferenceError例外をthrowする。
  3. envRecord.[[ThisValue]]を返す。

9.1.1.3.4 HasSuperBinding ( )

The HasSuperBinding concrete method of a Function Environment Record envRecord takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRecord.[[ThisBindingStatus]]lexicalなら、falseを返す。
  2. envRecord.[[FunctionObject]].[[HomeObject]]undefinedなら、falseを返す。
  3. trueを返す。

9.1.1.3.5 GetSuperBase ( envRecord )

The abstract operation GetSuperBase takes argument envRecord (a Function Environment Record) and returns an Object, null, or undefined. これは、envRecord内でbindされたsuper property accessesのbaseであるオブジェクトを返します。値undefinedは、そのようなアクセスがruntime errorsを生成することを示します。 It performs the following steps when called:

  1. homeenvRecord.[[FunctionObject]].[[HomeObject]]とする。
  2. homeundefinedなら、undefinedを返す。
  3. Assert: homeordinary objectである。
  4. home.[[GetPrototypeOf]]()を返す。

9.1.1.4 Global Environment Records

Global Environment Recordは、共通のrealmで処理されるすべてのECMAScript Script要素によって共有される最も外側のscopeを表すために使用されます。Global Environment Recordは、built-in globals(19節)、global objectのプロパティ、およびScript内で出現するすべてのtop-level declarations(8.2.118.2.13)に対するbindingsを提供します。

Global Environment Recordは論理的には単一のrecordですが、Object Environment RecordDeclarative Environment Recordをカプセル化する合成物として指定されます。Object Environment Recordは、関連付けられたRealm Recordglobal objectをbase objectとして持ちます。このglobal objectは、Global Environment RecordのGetThisBinding concrete methodによって返される値です。Global Environment RecordのObject Environment Record componentは、すべてのbuilt-in globals(19節)に対するbindings、およびglobal codeに含まれるFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、またはVariableStatementによって導入されるすべてのbindingsを含みます。global code内の他のすべてのECMAScript declarationsに対するbindingsは、Global Environment RecordのDeclarative Environment Record componentに含まれます。

プロパティはglobal object上に直接作成される場合があります。したがって、Global Environment RecordのObject Environment Record componentは、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、またはVariableDeclaration declarationsによって明示的に作成されるbindingsと、global objectのプロパティとして暗黙的に作成されるbindingsの両方を含む場合があります。

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

Table 18: Additional Fields of Global Environment Records
フィールド名 意味
[[ObjectRecord]] Object Environment Record Binding objectはglobal objectです。これは、global built-in bindingsに加えて、関連realmのglobal code内のFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、およびVariableDeclaration bindingsを含みます。
[[GlobalThisValue]] Object global scope内のthisによって返される値です。hostsは任意のECMAScript Object値を提供できます。
[[DeclarativeRecord]] Declarative Environment Record 関連realm codeのglobal code内のすべてのdeclarationsに対するbindingsをContainsします。ただし、FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration、およびVariableDeclaration bindingsは除きます。

9.1.1.4.1 HasBinding ( name )

The HasBinding concrete method of a Global Environment Record envRecord takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、argument identifierがそのrecordによってbindされるidentifiersの1つであるかどうかを決定します。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、trueを返す。
  3. objRecordenvRecord.[[ObjectRecord]]とする。
  4. objRecord.HasBinding(name)を返す。

9.1.1.4.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Global Environment Record envRecord takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、未初期化である名前nameに対する新しいmutable bindingを作成します。bindingは関連付けられたDeclarativeRecord内に作成されます。nameに対するbindingは、DeclarativeRecord内に既に存在してはなりません。deletabletrueなら、新しいbindingは削除対象であるとして印付けられます。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、TypeError例外をthrowする。
  3. declRecord.CreateMutableBinding(name, deletable)を返す。

9.1.1.4.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Global Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、未初期化である名前nameに対する新しいimmutable bindingを作成します。このEnvironment Record内にnameに対するbindingが既に存在してはなりません。stricttrueなら、新しいbindingはstrict bindingとして印付けられます。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、TypeError例外をthrowする。
  3. declRecord.CreateImmutableBinding(name, strict)を返す。

9.1.1.4.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Global Environment Record envRecord takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. これは、名前がnameであるidentifierの現在のbindingのbound valueを、値valueに設定するために使用されます。nameに対する未初期化のbindingが既に存在していなければなりません。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、
    1. declRecord.InitializeBinding(name, value)を返す。
  3. Assert: bindingが存在するなら、それはObject Environment Record内になければならない。
  4. objRecordenvRecord.[[ObjectRecord]]とする。
  5. objRecord.InitializeBinding(name, value)を返す。

9.1.1.4.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Global Environment Record envRecord takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、名前がnameであるidentifierの現在のbindingのbound valueを、値valueに変更しようとします。bindingがimmutable bindingであり、stricttrueの場合、TypeErrorがthrowされます。nameという名前のbindingは通常既に存在しますが、存在しない場合や現在writableでない場合、error handlingはstrictによって決定されます。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、
    1. declRecord.SetMutableBinding(name, value, strict)を返す。
  3. objRecordenvRecord.[[ObjectRecord]]とする。
  4. objRecord.SetMutableBinding(name, value, strict)を返す。

9.1.1.4.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Global Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、名前がnameである自身のbound identifierの値を返します。bindingが未初期化のbindingである場合、ReferenceError例外をthrowします。nameという名前のbindingは通常既に存在しますが、存在しない場合や現在writableでない場合、error handlingはstrictによって決定されます。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、
    1. declRecord.GetBindingValue(name, strict)を返す。
  3. objRecordenvRecord.[[ObjectRecord]]とする。
  4. objRecord.GetBindingValue(name, strict)を返す。

9.1.1.4.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Global Environment Record envRecord takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、明示的に削除対象として指定されたbindingsのみを削除できます。 It performs the following steps when called:

  1. declRecordenvRecord.[[DeclarativeRecord]]とする。
  2. declRecord.HasBinding(name)がtrueなら、
    1. declRecord.DeleteBinding(name)を返す。
  3. objRecordenvRecord.[[ObjectRecord]]とする。
  4. globalObjobjRecord.[[BindingObject]]とする。
  5. existingPropertyを ? HasOwnProperty(globalObj, name) とする。
  6. existingPropertytrueなら、
    1. objRecord.DeleteBinding(name)を返す。
  7. trueを返す。

9.1.1.4.8 HasThisBinding ( )

The HasThisBinding concrete method of a Global Environment Record envRecord takes no arguments and returns true. It performs the following steps when called:

  1. trueを返す。
Note

Global Environment Recordsは常にthis bindingを提供します。

9.1.1.4.9 GetThisBinding ( )

The GetThisBinding concrete method of a Global Environment Record envRecord takes no arguments and returns a normal completion containing an Object. It performs the following steps when called:

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

9.1.1.4.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Global Environment Record envRecord takes no arguments and returns false. It performs the following steps when called:

  1. falseを返す。
Note

Global Environment Recordssuper bindingを提供しません。

9.1.1.4.11 WithBaseObject ( )

The WithBaseObject concrete method of a Global Environment Record envRecord takes no arguments and returns undefined. It performs the following steps when called:

  1. undefinedを返す。

9.1.1.4.12 HasLexicalDeclaration ( envRecord, name )

The abstract operation HasLexicalDeclaration takes arguments envRecord (a Global Environment Record) and name (a String) and returns a Boolean. これは、argument identifierが、LexicalDeclarationClassDeclarationなどのlexical declarationを使用して作成されたbindingをenvRecord内に持つかどうかを決定します。 It performs the following steps when called:

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

9.1.1.4.13 HasRestrictedGlobalProperty ( envRecord, name )

The abstract operation HasRestrictedGlobalProperty takes arguments envRecord (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、argument identifierが、global lexical bindingによってshadowされてはならないglobal objectのプロパティの名前であるかどうかを決定します。 It performs the following steps when called:

  1. objRecordenvRecord.[[ObjectRecord]]とする。
  2. globalObjobjRecord.[[BindingObject]]とする。
  3. existingPropertyを ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingPropertyundefinedなら、falseを返す。
  5. existingProperty.[[Configurable]]trueなら、falseを返す。
  6. trueを返す。
Note

varまたはfunction declarationを使用して宣言されたのではなく、直接作成されたプロパティがglobal object上に存在する場合があります。global objectのnon-configurable propertyと同じ名前を持つglobal lexical bindingは作成できません。global property "undefined"は、そのようなプロパティの例です。

9.1.1.4.14 CanDeclareGlobalVar ( envRecord, name )

The abstract operation CanDeclareGlobalVar takes arguments envRecord (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じargument nameで呼び出された場合に、対応するCreateGlobalVarBinding呼び出しが成功するかどうかを決定します。冗長なvar declarationsおよび既存のglobal object propertiesに対するvar declarationsは許可されます。 It performs the following steps when called:

  1. objRecordenvRecord.[[ObjectRecord]]とする。
  2. globalObjobjRecord.[[BindingObject]]とする。
  3. hasPropertyを ? HasOwnProperty(globalObj, name) とする。
  4. hasPropertytrueなら、trueを返す。
  5. IsExtensible(globalObj)を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRecord, name )

The abstract operation CanDeclareGlobalFunction takes arguments envRecord (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. これは、同じargument nameで呼び出された場合に、対応するCreateGlobalFunctionBinding呼び出しが成功するかどうかを決定します。 It performs the following steps when called:

  1. objRecordenvRecord.[[ObjectRecord]]とする。
  2. globalObjobjRecord.[[BindingObject]]とする。
  3. existingPropertyを ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingPropertyundefinedなら、? IsExtensible(globalObj)を返す。
  5. existingProperty.[[Configurable]]trueなら、trueを返す。
  6. IsDataDescriptor(existingProperty)がtrueであり、かつexistingPropertyがattribute values { [[Writable]]: true, [[Enumerable]]: true }を持つなら、trueを返す。
  7. falseを返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRecord, name, deletable )

The abstract operation CreateGlobalVarBinding takes arguments envRecord (a Global Environment Record), name (a String), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられたObject Environment Record内にmutable bindingを作成し、初期化します。bindingが既に存在する場合、それは再利用され、初期化済みであると仮定されます。 It performs the following steps when called:

  1. objRecordenvRecord.[[ObjectRecord]]とする。
  2. globalObjobjRecord.[[BindingObject]]とする。
  3. hasPropertyを ? HasOwnProperty(globalObj, name) とする。
  4. extensibleを ? IsExtensible(globalObj) とする。
  5. hasPropertyfalseかつextensibletrueなら、
    1. objRecord.CreateMutableBinding(name, deletable)を実行する。
    2. objRecord.InitializeBinding(name, undefined)を実行する。
  6. unusedを返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRecord, name, value, deletable )

The abstract operation CreateGlobalFunctionBinding takes arguments envRecord (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. これは、関連付けられたObject Environment Record内にmutable bindingを作成し、初期化します。bindingが既に存在する場合、それは置き換えられます。 It performs the following steps when called:

  1. objRecordenvRecord.[[ObjectRecord]]とする。
  2. globalObjobjRecord.[[BindingObject]]とする。
  3. existingPropertyを ? globalObj.[[GetOwnProperty]](name) とする。
  4. existingPropertyundefinedまたは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を返す。
Note

Global function declarationsは常にglobal objectのown propertiesとして表現されます。可能であれば、既存のown propertyは標準的なattribute valuesの集合を持つように再構成されます。ステップ7は、InitializeBinding concrete methodを呼び出すことが行うことと等価であり、globalObjがProxyである場合、同じ一連のProxy trap呼び出しを生成します。

9.1.1.5 Module Environment Records

Module Environment Recordは、ECMAScript Moduleの外側scopeを表すために使用されるDeclarative Environment Recordです。通常のmutable bindingsおよびimmutable bindingsに加えて、Module Environment Recordsはimmutable import bindingsも提供します。これは、別のEnvironment Record内に存在するtarget bindingへの間接アクセスを提供するbindingsです。

Module Environment Recordsは、Table 15に列挙されるすべてのDeclarative Environment Record methodsをサポートし、GetBindingValueDeleteBindingHasThisBinding、およびGetThisBindingを除くそれらすべてのメソッドについて同じ仕様を共有します。

9.1.1.5.1 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Module Environment Record envRecord takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、名前がnameである自身のbound identifierの値を返します。ただし、bindingがindirect bindingである場合、target bindingの値が返されます。bindingが存在するが未初期化である場合、ReferenceErrorがthrowされます。 It performs the following steps when called:

  1. Assert: stricttrueである。
  2. Assert: envRecordnameに対するbindingを持つ。
  3. nameに対するbindingがindirect bindingであるなら、
    1. moduleおよびtargetNameを、このnameに対するbindingが作成されたときに提供されたindirection valuesとする。
    2. targetEnvmodule.[[Environment]]とする。
    3. targetEnvemptyなら、ReferenceError例外をthrowする。
    4. targetEnv.GetBindingValue(targetName, true)を返す。
  4. envRecord内のnameに対するbindingが未初期化のbindingなら、ReferenceError例外をthrowする。
  5. envRecord内でnameに現在bindされている値を返す。
Note

Moduleは常にstrict mode codeであるため、strictは常にtrueになります。

9.1.1.5.2 DeleteBinding ( name )

Module Environment RecordDeleteBinding concrete methodは、この仕様内では決して使用されません。

Note

Module Environment Recordsはstrict code内でのみ使用され、early error ruleは、strict codeにおいて、Module Environment Record bindingへ解決されるReference Recordにdelete operatorが適用されることを防ぎます。13.5.1.1を参照してください。

9.1.1.5.3 HasThisBinding ( )

The HasThisBinding concrete method of a Module Environment Record envRecord takes no arguments and returns true. It performs the following steps when called:

  1. trueを返す。
Note

Module Environment Recordsは常にthis bindingを提供します。

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of a Module Environment Record envRecord takes no arguments and returns a normal completion containing undefined. It performs the following steps when called:

  1. undefinedを返す。

9.1.1.5.5 CreateImportBinding ( envRecord, name, targetModule, targetName )

The abstract operation CreateImportBinding takes arguments envRecord (a Module Environment Record), name (a String), targetModule (a Module Record), and targetName (a String) and returns unused. これは、名前nameに対して、新しい初期化済みimmutable indirect bindingを作成します。envRecord内にnameに対するbindingが既に存在してはなりません。targetNameは、targetModuleModule Environment Record内に存在するbindingの名前です。新しいbindingの値へのアクセスは、target bindingのbound valueに間接的にアクセスします。 It performs the following steps when called:

  1. Assert: envRecordnameに対するbindingを既に持っていない。
  2. Assert: targetModule.[[Environment]]がinstantiatedされるとき、それはtargetNameに対するdirect bindingを持つ。
  3. envRecord内にnameに対するimmutable indirect bindingを作成し、それがtargetModuleおよびtargetNameをそのtarget bindingとして参照することを記録し、bindingが初期化済みであることを記録する。
  4. unusedを返す。

9.1.2 Environment Record操作

以下の抽象操作は、この仕様においてEnvironment Recordsに対して操作を行うために使用されます:

9.1.2.1 GetIdentifierReference ( envRecord, name, strict )

The abstract operation GetIdentifierReference takes arguments envRecord (an Environment Record or null), name (a String), and strict (a Boolean) and returns either a normal completion containing a Reference Record or a throw completion. It performs the following steps when called:

  1. envRecordnullなら、
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }を返す。
  2. existsを ? envRecord.HasBinding(name) とする。
  3. existstrueなら、
    1. Reference Record { [[Base]]: envRecord, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }を返す。
  4. outerenvRecord.[[OuterEnv]]とする。
  5. GetIdentifierReference(outer, name, strict)を返す。

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

The abstract operation NewDeclarativeEnvironment takes argument outerEnv (an Environment Record or null) and returns a Declarative Environment Record. It performs the following steps when called:

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

9.1.2.3 NewObjectEnvironment ( obj, isWithEnv, outerEnv )

The abstract operation NewObjectEnvironment takes arguments obj (an Object), isWithEnv (a Boolean), and outerEnv (an Environment Record or null) and returns an Object Environment Record. It performs the following steps when called:

  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 )

The abstract operation NewFunctionEnvironment takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns a Function Environment Record. It performs the following steps when called:

  1. envRecord を、束縛を含まない新しい Function Environment Record とする。
  2. envRecord.[[FunctionObject]]func に設定する。
  3. func.[[ThisMode]]lexical である場合、envRecord.[[ThisBindingStatus]]lexical に設定する。
  4. Else, 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 )

The abstract operation NewGlobalEnvironment takes arguments obj (an Object) and thisValue (an Object) and returns a Global Environment Record. It performs the following steps when called:

  1. objRecordNewObjectEnvironment(obj, false, null)とする。
  2. declRecordNewDeclarativeEnvironment(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 )

The abstract operation NewModuleEnvironment takes argument outerEnv (a Global Environment Record) and returns a Module Environment Record. It performs the following steps when called:

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

9.2 PrivateEnvironment Records

PrivateEnvironment Recordは、ECMAScriptコード内のClassDeclarationおよびClassExpressionの字句的な入れ子構造に基づいて、Private Namesを追跡するために使用される仕様上の仕組みです。これらはEnvironment Recordsに似ていますが、それとは異なります。各PrivateEnvironment Recordは、ClassDeclarationまたはClassExpressionに関連付けられます。そのようなclassが評価されるたびに、そのclassによって宣言されたPrivate Namesを記録するため、新しいPrivateEnvironment Recordが作成されます。

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

Table 19: PrivateEnvironment Record Fields
フィールド名 値の型 意味
[[OuterPrivateEnvironment]] PrivateEnvironment Recordまたはnull 最も近い包含classのPrivateEnvironment Record。このPrivateEnvironment Recordに関連付けられたclassが他のclassに含まれていない場合はnull
[[Names]] Private NamesList このclassによって宣言されたPrivate Names

9.2.1 PrivateEnvironment Record操作

以下の抽象操作は、この仕様においてPrivateEnvironment Recordsに対して操作を行うために使用されます:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (a PrivateEnvironment Record or null) and returns a PrivateEnvironment Record. It performs the following steps when called:

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

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:

  1. namesprivateEnv.[[Names]]とする。
  2. namesの各Private Name privateNameについて、以下を行う
    1. privateName.[[Description]]identifierなら、
      1. privateNameを返す。
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]]とする。
  4. Assert: outerPrivateEnvnullでない。
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier)を返す。

9.3 Realms

評価される前に、すべてのECMAScriptコードはrealmに関連付けられていなければなりません。概念的には、realmは、intrinsic objectsの集合、ECMAScript global environment、そのglobal environmentのscope内に読み込まれたすべてのECMAScriptコード、およびその他の関連状態とリソースから構成されます。

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

Table 20: Realm Record Fields
フィールド名 意味
[[AgentSignifier]] agent signifier このrealmを所有するagent
[[Intrinsics]] フィールド名がintrinsic keysであり、その値がobjectsであるRecord このrealmに関連付けられたコードによって使用されるintrinsic values
[[GlobalObject]] Object このrealmglobal object
[[GlobalEnv]] Global Environment Record このrealmのglobal environment
[[TemplateMap]] フィールド[[Site]]TemplateLiteral Parse Node)および[[Array]](Array)を持つRecordsList

Template objectsは、そのRealm Record[[TemplateMap]]を使用して、realmごとに個別にcanonicalizeされます。各[[Site]]値はTemplateLiteralであるParse Nodeです。関連付けられた[[Array]]値は、tag functionに渡される対応するtemplate objectです。

Note 1
Parse Nodeが到達不能になると、対応する[[Array]]も到達不能になり、実装がそのpairを[[TemplateMap]] listから削除しても観測不能です。
[[LoadedModules]] LoadedModuleRequest RecordsList

このrealmによってimportされたspecifier stringsから、解決済みModule Recordへのmap。このlistは、ModuleRequestsEqual(r1, r2)がtrueであるような2つの異なるRecords r1およびr2を含みません。

Note 2
HostLoadImportedModule16.2.1.10 Note 1)で述べたように、Realm Records内の[[LoadedModules]]は、active scriptまたはmoduleが存在しないcontextでimport() expressionを実行する場合にのみ使用されます。
[[HostDefined]] anything(デフォルト値はundefined Realm Recordに追加情報を関連付ける必要があるhostsによる使用のために予約されたフィールド。

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. realmを新しいRealm Recordとする。
  2. CreateIntrinsics(realm)を実行する。
  3. realm.[[AgentSignifier]]AgentSignifier()に設定する。
  4. realm.[[TemplateMap]]を新しい空のListに設定する。
  5. newContextを新しいexecution contextとする。
  6. newContextのFunctionをnullに設定する。
  7. newContextRealmrealmに設定する。
  8. newContextのScriptOrModuleをnullに設定する。
  9. newContextexecution context stackへpushする;newContextは現在running execution contextである。
  10. hostが、realmglobal objectとして機能する特定のオブジェクトの使用を要求するなら、
    1. globalを、host-defined mannerで作成されたそのようなオブジェクトとする。
  11. そうでなければ、
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]])とする。
  12. hostが、realmのglobal scope内のthis bindingにglobal object以外のオブジェクトを返すことを要求するなら、
    1. thisValueを、host-defined mannerで作成されたそのようなオブジェクトとする。
  13. そうでなければ、
    1. thisValueglobalとする。
  14. realm.[[GlobalObject]]globalに設定する。
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue)に設定する。
  16. SetDefaultGlobalBindings(realm)を実行する。
  17. host-defined global object propertiesをglobal上に作成する。
  18. unusedを返す。

9.3.2 CreateIntrinsics ( realmRecord )

The abstract operation CreateIntrinsics takes argument realmRecord (a Realm Record) and returns unused. It performs the following steps when called:

  1. realmRecord.[[Intrinsics]]を新しいRecordに設定する。
  2. realmRecord.[[Intrinsics]]のフィールドを、Table 6に列挙される値で設定する。フィールド名は、その表の“Intrinsic Name”列に列挙される名前です。各フィールドの値は、19節から28節までの各オブジェクトの仕様によって定義されるproperty valuesで完全かつ再帰的にpopulatedされた新しいobject valueです。すべてのobject property valuesは新しく作成されたobject valuesです。built-in function objectsであるすべての値は、CreateBuiltinFunction(steps, length, name, slots, realmRecord, proto, async)を実行することによって作成されます。ここで、stepsはこの仕様によって提供されるその関数の定義、nameはその関数の"name" propertyの初期値、lengthはその関数の"length" propertyの初期値、slotsはその関数の指定されたinternal slotsの名前のlist(もしあれば)、protoはその関数の[[Prototype]] internal slotの指定値、asyncはその関数が“async”として記述されている場合はtrue、そうでない場合はfalseです。intrinsicsおよびそれらのpropertiesの作成は、まだ作成されていないオブジェクトへの依存を避けるように順序付けられていなければなりません。
  3. AddRestrictedFunctionProperties(realmRecord.[[Intrinsics]].[[%Function.prototype%]], realmRecord)を実行する。
  4. unusedを返す。

9.3.3 SetDefaultGlobalBindings ( realmRecord )

The abstract operation SetDefaultGlobalBindings takes argument realmRecord (a Realm Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. globalrealmRecord.[[GlobalObject]]とする。
  2. 19節で指定されるGlobal Objectの各propertyについて、以下を行う
    1. nameproperty nameのString値とする。
    2. propertyDescを、そのpropertyの指定されたattributesを含む、そのpropertyの完全にpopulatedされたdata Property Descriptorとする。19.219.3、または19.4に列挙されるpropertiesについては、[[Value]]属性の値はrealmRecordからの対応するintrinsic objectです。
    3. DefinePropertyOrThrow(global, name, propertyDesc)を実行する。
  3. unusedを返す。

9.4 Execution Contexts

execution contextは、ECMAScript実装によるコードのruntime評価を追跡するために使用される仕様上の装置です。任意の時点で、実際にコードを実行しているexecution contextは、agentごとに最大1つです。これはそのagentrunning execution contextとして知られます。この仕様におけるrunning execution contextへのすべての参照は、周囲のagentrunning execution contextを示します。

execution context stackは、execution contextsを追跡するために使用されます。running execution contextは常にこのstackのtop elementです。現在running execution contextに関連付けられたexecutable codeから、そのexecution contextに関連付けられていないexecutable codeへ制御が移されるたびに、新しいexecution contextが作成されます。新しく作成されたexecution contextはstackへpushされ、running execution contextになります。

execution contextは、それに関連付けられたコードの実行進行を追跡するために必要な実装固有の状態を含みます。各execution contextは、少なくともTable 21に列挙される状態componentsを持ちます。

Table 21: State Components for All Execution Contexts
Component 目的
code evaluation state このexecution contextに関連付けられたコードの評価を実行、一時停止、および再開するために必要な任意の状態。
Function このexecution contextfunction objectのコードを評価している場合、このcomponentの値はそのfunction objectです。contextがScriptまたはModuleのコードを評価している場合、その値はnullです。
Realm 関連付けられたコードがECMAScriptリソースへアクセスする元となるRealm Record
ScriptOrModule 関連付けられたコードの由来となるModule RecordまたはScript RecordInitializeHostDefinedRealmで作成される元のexecution contextの場合のように、由来となるscriptまたはmoduleが存在しない場合、その値はnullです。

running execution contextによるコードの評価は、この仕様内で定義されるさまざまな点で一時停止される場合があります。running execution contextが一時停止されると、別のexecution contextがrunning execution contextになり、そのコードの評価を開始する場合があります。後の時点で、一時停止されたexecution contextが再びrunning execution contextになり、以前に一時停止された点からそのコードの評価を継続する場合があります。execution contexts間でのrunning execution context状態の遷移は、通常stack-like last-in/first-out mannerで発生します。ただし、一部のECMAScript featuresは、running execution contextの非LIFO遷移を必要とします。

running execution contextRealm componentの値は、current Realm Recordとも呼ばれます。running execution contextのFunction componentの値は、active function objectとも呼ばれます。

ECMAScript code execution contextsは、Table 22に列挙される追加の状態componentsを持ちます。

Table 22: Additional State Components for ECMAScript Code Execution Contexts
Component 目的
LexicalEnvironment このexecution context内のコードによって行われるidentifier referencesを解決するために使用されるEnvironment Recordを識別します。
VariableEnvironment このexecution context内のVariableStatementによって作成されたbindingsを保持するEnvironment Recordを識別します。
PrivateEnvironment 最も近い包含class内のClassElementによって作成されたPrivate Namesを保持するPrivateEnvironment Recordを識別します。包含classが存在しない場合はnull

execution contextのLexicalEnvironmentおよびVariableEnvironment componentsは、常にEnvironment Recordsです。

Generatorsの評価を表すexecution contextsは、Table 23に列挙される追加の状態componentsを持ちます。

Table 23: Additional State Components for Generator Execution Contexts
Component 目的
Generator このexecution contextが評価しているGenerator。

ほとんどの状況では、この仕様内のアルゴリズムによって直接操作されるのは、running execution contextexecution context stackのtop)のみです。したがって、“LexicalEnvironment”および“VariableEnvironment”という用語が修飾なしで使用される場合、それらはrunning execution contextのそれらのcomponentsを参照します。

execution contextは純粋に仕様上の仕組みであり、ECMAScript実装の特定のartefactに対応する必要はありません。ECMAScriptコードがexecution contextへ直接アクセスしたり観測したりすることは不可能です。

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. これは、running execution contextに基づいて、running scriptまたはmoduleを決定するために使用されます。 It performs the following steps when called:

  1. execution context stackが空なら、nullを返す。
  2. executionContextを、execution context stack上でScriptOrModule componentがnullでない最上位のexecution contextとする。
  3. そのようなexecution contextが存在しないなら、nullを返す。
  4. executionContextのScriptOrModuleを返す。

9.4.2 ResolveBinding ( name [ , envRecord ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument envRecord (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. これはnameのbindingを決定するために使用されます。envRecordは、bindingを検索するEnvironment Recordを明示的に提供するために使用できます。 It performs the following steps when called:

  1. envRecordが存在しない、またはenvRecordundefinedなら、
    1. envRecordrunning execution contextのLexicalEnvironmentに設定する。
  2. Assert: envRecordEnvironment Recordである。
  3. strictを、評価中のsyntactic productionのIsStrictとする。
  4. GetIdentifierReference(envRecord, name, strict)を返す。
Note

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

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. これは、現在keyword thisのbindingを供給しているEnvironment Recordを見つけます。 It performs the following steps when called:

  1. envRecordrunning execution contextのLexicalEnvironmentとする。
  2. 繰り返す
    1. existsenvRecord.HasThisBinding()とする。
    2. existstrueなら、envRecordを返す。
    3. outerenvRecord.[[OuterEnv]]とする。
    4. Assert: outernullでない。
    5. envRecordouterに設定する。
Note

ステップ2のloopは常に終了します。なぜなら、environmentsのlistは常にthis bindingを持つglobal environmentで終わるからです。

9.4.4 ResolveThisBinding ( )

The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. これは、running execution contextのLexicalEnvironmentを使用して、keyword thisのbindingを決定します。 It performs the following steps when called:

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

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. これは、running execution contextのLexicalEnvironmentを使用して、NewTarget値を決定します。 It performs the following steps when called:

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

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. これは、現在running execution contextによって使用されるglobal objectを返します。 It performs the following steps when called:

  1. currentRealmcurrent Realm Recordとする。
  2. currentRealm.[[GlobalObject]]を返す。

9.4.7 RunSuspendedContext ( context, completionRecord )

The abstract operation RunSuspendedContext takes arguments context (an execution context) and completionRecord (a Completion Record) and returns either a normal completion containing either an ECMAScript language value or unused, or an abrupt completion. これはcontextを再開し(completionRecordを再開値として送信します)、その結果を待ちます。 It performs the following steps when called:

  1. callerContextrunning execution contextとする。
  2. callerContextを一時停止する。
  3. contextexecution context stackへpushする;contextは現在running execution contextである。
  4. contextの一時停止された評価を再開する。このとき、completionRecordを、それを一時停止した操作の結果として使用する。resultを、再開された計算によって返されたCompletion Recordとする。
  5. Assert: このステップに到達したとき、contextはすでにexecution context stackから取り除かれており、callerContextが再びrunning execution contextである。
  6. Completion(result)を返す。

9.4.8 RunCallerContext ( value )

The abstract operation RunCallerContext takes argument value (ECMAScript言語値またはempty) and returns Completion Record. これは呼び出し元コンテキストを再開し(再開値としてvalueを送信する)、もしあればその結果を待つ。 It performs the following steps when called:

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

9.5 JobsおよびJobsをEnqueueするHost Operations

Jobは、他のECMAScript計算が現在進行中でないときにECMAScript計算を開始する、parametersを持たないAbstract Closureです。

Jobsは、特定のagent内のECMAScript host environmentsによって実行のためにscheduleされます。この仕様は、jobsをscheduleするためのhost hooksであるHostEnqueueGenericJobHostEnqueueFinalizationRegistryCleanupJobHostEnqueuePromiseJob、およびHostEnqueueTimeoutJobを記述します。この仕様内のhost hooksは、jobsのschedulingに課される追加制約によって編成されています。Hostsは、jobsをscheduleする追加のabstract operationsを定義できます。そのようなoperationsは、Job Abstract ClosurerealmRealm Recordまたはnull)をparametersとして受け取ります。Realm Recordが提供された場合、これらのoperationsは、realmを所有するagent内で、提供されたrealmにおいて将来のある時点でjobが実行されるようscheduleします。realmとして代わりにnullが提供された場合、そのjobはECMAScriptコードを評価しません。それらの実装は、次の要件に適合しなければなりません:

  • 将来のある時点で、jobがscheduleされたagentにrunning contextが存在せず、そのagentexecution context stackが空であるとき、実装は次を行わなければならない:
    1. 任意のhost-defined準備ステップを実行する。
    2. Job Abstract ClosureInvokeする。
    3. 任意のhost-defined cleanup stepsを実行し、その後execution context stackは空でなければならない。
  • 任意の時点で、agent内でactiveに評価中であるJobは1つだけであってよい。
  • Jobの評価が開始したら、そのagent内で他のJobの評価が開始する前に完了まで実行されなければならない。
  • Abstract Closurenormal completionを返さなければならず、自身でerrorsの処理を実装する。
Note 1
Host environmentsは、schedulingに関してJobsを一律に扱うことを要求されません。たとえば、web browsersおよびNode.jsは、Promise-handling Jobsを他の作業より高いpriorityとして扱います;将来のfeaturesは、そのような高いpriorityとして扱われないJobsを追加する場合があります。

任意の特定の時点で、次の条件のすべてがtrueであるなら、scriptOrModuleScript RecordModule Record、またはnull)はactive script or moduleです:

任意の特定の時点で、次の条件のすべてがtrueであるなら、executionはECMAScriptコードを評価する準備ができているものとします:

Note 2

Host environmentsは、execution contextsexecution context stackへpushすることによって、コードを評価するためのexecutionをprepareする場合があります。具体的なstepsはimplementation-definedです。

Realmの具体的な選択はhost environment次第です。この初期execution contextおよびRealmは、callback functionが呼び出される前にのみ使用されます。Promise handlerのようなJobに関連するcallback functionが呼び出されると、その呼び出しは自身のexecution contextおよびRealmをpushします。

特定の種類のJobsには追加のconformance requirementsがあります。

9.5.1 JobCallback Records

JobCallback Recordは、function objectおよびhost-defined valueを格納するために使用されるRecord値です。hostによってenqueuedされたJobを通じて呼び出されるfunction objectsは、追加のhost-defined contextを持つ場合があります。その状態を伝播するために、Job Abstract Closuresfunction objectsを直接captureしてcallすべきではありません。代わりに、HostMakeJobCallbackおよびHostCallJobCallbackを使用します。

Note

たとえば、WHATWG HTML specification(https://html.spec.whatwg.org/)は、Promise callbacksのincumbent settings objectを伝播するためにhost-defined valueを使用します。

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

Table 24: JobCallback Record Fields
フィールド名 意味
[[Callback]] function object Jobが呼び出されたときに呼び出すfunction。
[[HostDefined]] anything(デフォルト値はempty hostsによる使用のために予約されたフィールド。

9.5.2 HostMakeJobCallback ( callback )

The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record.

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

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

HostMakeJobCallbackのデフォルト実装は、呼び出されたときに次のstepsを実行します:

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

web browsersでないECMAScript hostsは、HostMakeJobCallbackのデフォルト実装を使用しなければなりません。

Note

これは、callbackが最終的にscheduleされ実行されることを担うfunctionに渡された時点で呼び出されます。たとえば、promise.then(thenAction)は、reaction Jobをscheduleする時点ではなく、Promise.prototype.thenを呼び出す時点でthenActionに対してMakeJobCallbackを呼び出します。

9.5.3 HostCallJobCallback ( jobCallback, thisValue, argList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), thisValue (an ECMAScript language value), and argList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion.

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

  • Call(jobCallback.[[Callback]], thisValue, argList)の結果を実行して返さなければならない。
Note

この要件は、hostsがこの仕様で定義されるfunction objects[[Call]] behaviourを変更できないことを意味します。

HostCallJobCallbackのデフォルト実装は、呼び出されたときに次のstepsを実行します:

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

web browsersでないECMAScript hostsは、HostCallJobCallbackのデフォルト実装を使用しなければなりません。

9.5.4 HostEnqueueGenericJob ( job, realm )

The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record) and returns unused. これは、realm.[[AgentSignifier]]によって示されるagent内のrealm realmにおいて、将来のある時点で実行されるようにjobをscheduleします。このalgorithmとともに使用されるAbstract Closuresは、priorityやorderingなどの追加制約なしでscheduleされることを意図しています。

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

9.5.5 HostEnqueuePromiseJob ( job, realm )

The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record or null) and returns unused. これは、将来のある時点で実行されるようにjobをscheduleします。このalgorithmとともに使用されるAbstract Closuresは、Promisesの処理に関連する、またはそれ以外でPromise handling operationsと同じpriorityでscheduleされることを意図しています。

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

  • realmnullでないなら、jobが呼び出されるたびに、jobの呼び出し時点でexecutionがECMAScriptコードを評価する準備ができるように、implementation-defined stepsを実行しなければならない。
  • HostEnqueuePromiseJobが呼び出された時点のGetActiveScriptOrModule()をscriptOrModuleとする。realmnullでないなら、jobが呼び出されるたびに、jobの呼び出し時点でscriptOrModuleactive script or moduleであるように、implementation-defined stepsを実行しなければならない。
  • Jobsは、それらをscheduleしたHostEnqueuePromiseJob呼び出しと同じ順序で実行されなければならない。
Note

NewPromiseResolveThenableJobによって返されるJobsrealmは通常、then function objectに対してGetFunctionRealmを呼び出した結果です。NewPromiseReactionJobによって返されるJobsrealmは通常、handlerがundefinedでない場合、そのhandlerに対してGetFunctionRealmを呼び出した結果です。handlerがundefinedである場合、realmnullです。両方の種類のJobsについて、GetFunctionRealmがabnormallyに完了する場合(すなわちrevoked Proxy上で呼び出された場合)、realmGetFunctionRealm呼び出し時点のcurrent Realm Recordです。realmnullの場合、user ECMAScript codeは評価されず、新しいECMAScript objects(例:Error objects)は作成されません。たとえば、WHATWG HTML specification(https://html.spec.whatwg.org/)は、scriptを実行できる能力およびentry conceptを確認するためにrealmを使用します。

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. これは、realm.[[AgentSignifier]]によって示されるagent内のrealm realmにおいて、少なくともmillisecondsミリ秒後に実行されるようにtimeoutJobをscheduleします。

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

9.6 Agents

agentは、ECMAScript execution contextsの集合、execution context stackrunning execution contextAgent Record、およびexecuting threadから構成されます。executing threadを除き、agentの構成要素はそのagentのみに属します。

agentexecuting threadは、他のagentsから独立して、そのagentexecution contexts上でalgorithmic stepsを実行します。ただし、threadを共有するどのagent[[CanBlock]]フィールドがtrueであるAgent Recordを持たない場合、executing threadは複数のagentsによってexecuting threadとして使用される場合があります。

Note 1

たとえば、一部のweb browsersは、browser windowの複数の無関係なtabs間で単一のexecuting threadを共有します。

agentexecuting threadがalgorithmic stepsを実行している間、そのagentはそれらのstepsに対するsurrounding agentです。stepsは、agent内に保持される仕様レベルのexecution objects、すなわちrunning execution contextexecution context stack、およびAgent Recordのfieldsにアクセスするためにsurrounding agentを使用します。

agent signifierは、Agentを識別するために使用されるglobally-unique opaque valueです。

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

[[LittleEndian]][[Signifier]][[IsLockFree1]][[IsLockFree2]]、および [[IsLockFree8]] の値は変更できない。

[[GlobalSymbolRegistry]] List は追加専用であり、再割り当てされることはない。

Note 2

[[IsLockFree1]][[IsLockFree2]]、および[[IsLockFree8]]の値は、必ずしもhardwareによって決定されるとは限らず、時間の経過やECMAScript実装間で変化し得るimplementation choicesを反映する場合もあります。

[[IsLockFree4]]フィールドはありません:4-byte atomic operationsは常にlock-freeです。

実際には、atomic operationが何らかの種類のlockで実装されている場合、そのoperationはlock-freeではありません。Lock-freeはwait-freeを意味しません:lock-free atomic operationを完了するために必要となるmachine stepsの数に上限はありません。

サイズnのatomic accessがlock-freeであることは、サイズnのnon-atomic accessesの(知覚される)atomicityについて何も意味しません。具体的には、non-atomic accessesは依然として複数の個別memory accessesのsequenceとして実行される場合があります。詳細はReadSharedMemoryおよびWriteSharedMemoryを参照してください。

Note 3

agentは仕様上の仕組みであり、ECMAScript実装の特定のartefactに対応する必要はありません。

9.6.1 AgentSignifier ( )

The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Recordとする。
  2. agentRecord.[[Signifier]]を返す。

9.6.2 AgentCanSuspend ( )

The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Recordとする。
  2. agentRecord.[[CanBlock]]を返す。
Note

一部のenvironmentsでは、特定のagentがsuspendすることが合理的でない場合があります。たとえば、web browser environmentでは、documentのmain event handling threadのsuspendingを許可しない一方で、workersのevent handling threadsがsuspendすることは許可するのが合理的な場合があります。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Recordとする。
  2. countagentRecord.[[ModuleAsyncEvaluationCount]]とする。
  3. agentRecord.[[ModuleAsyncEvaluationCount]]count + 1に設定する。
  4. countを返す。
Note

この値は、pending modules間の相対的なevaluation orderを追跡するためだけに使用されます。実装は、pending modulesが存在しないときはいつでも、観測不能に[[ModuleAsyncEvaluationCount]]を0へresetしてよいです。

9.7 Agent Clusters

agent clusterは、shared memory上で操作することによって通信できるagentsのmaximal setです。

Note 1

異なるagents内のprogramsは、unspecified meansによってmemoryを共有する場合があります。最低限、SharedArrayBuffersのbacking memoryはcluster内のagents間で共有できます。

message passingによって通信できるがmemoryを共有できないagentsが存在する場合があります;それらが同じagent cluster内に入ることは決してありません。

すべてのagentはちょうど1つのagent clusterに属します。

Note 2

cluster内のagentsは、特定の時点で必ずしもすべてaliveである必要はありません。agent Aが別のagent Bを作成し、その後Aが終了し、Bagent Cを作成した場合、Aが何らかのmemoryをBと共有でき、かつBが何らかのmemoryをCと共有できるなら、この3つのagentsは同じcluster内にあります。

cluster内のすべてのagentsは、それぞれのAgent Records内の[[LittleEndian]]フィールドについて同じ値を持たなければなりません。

Note 3

agent cluster内の異なるagents[[LittleEndian]]の異なる値を持つ場合、multi-byte dataにshared memoryを使用することが困難になります。

cluster内のすべてのagentsは、それぞれのAgent Records内の[[IsLockFree1]]フィールドについて同じ値を持たなければなりません;[[IsLockFree2]]および[[IsLockFree8]]フィールドについても同様です。

cluster内のすべてのagentsは、それぞれのAgent Records内の[[Signifier]]フィールドについて異なる値を持たなければなりません。

embeddingは、agentの知識または協力なしに、agentをdeactivate(forward progressを停止)またはactivate(forward progressを再開)する場合があります。embeddingがそうする場合、cluster内の一部のagentsをactiveのままにし、同じcluster内の他のagentsを無期限にdeactivatedにしておいてはなりません。

Note 4

前述の制限の目的は、別のagentがdeactivatedされたためにagentがdeadlockまたはstarveする状況を避けることです。たとえば、任意のwindows内のdocumentsとは独立したlifetimeを持つHTML shared workerが、そのような独立したdocumentのdedicated workerとmemoryを共有することを許可された場合、documentとそのdedicated workerが、dedicated workerがlockを保持している間にdeactivatedされ(たとえば、documentがwindowのhistoryにpushされる)、shared workerがそのlockをacquireしようとすると、そのshared workerはdedicated workerが再びactivatedされるまで、もしされるなら、その間blockedされます。その間、他のwindowsからshared workerへアクセスしようとする他のworkersはstarveします。

この制限の含意は、embedding内で同じsuspend/wake collectiveに属さないagents間ではmemoryを共有できないということです。

embeddingは、agentのcluster内の他のagentsの事前の知識または協力なしに、agentをterminateする場合があります。agentが、自身またはcluster内の別のagentのprogrammatic actionによってではなく、cluster外部の力によってterminatedされる場合、embeddingは2つの戦略のいずれかを選択しなければなりません:cluster内のすべてのagentsをterminateするか、またはcluster内のagentsがcoordinationできるreliable APIsを提供し、clusterの少なくとも1つの残存memberがterminationを検出でき、termination dataがterminatedされたagentを識別するのに十分な情報を含むようにするか、のいずれかです。

Note 5

その種のterminationの例は次のとおりです:operating systemsまたはusersが別processで実行中のagentsをterminateすること;embedding自体が、per-agent resource accountingによりagentがrunawayであると示されたとき、他のagentsと同じprocess内で実行中のagentをterminateすること。

次の仕様値、およびそれらから推移的に到達可能な値は、それぞれちょうど1つのagent clusterに属します。

cluster内の任意のagentによる任意のECMAScriptコードの評価に先立ち、cluster内のすべてのagentsAgent Record[[CandidateExecution]]フィールドは、initial candidate executionに設定されます。initial candidate executionは空のcandidate executionであり、その[[EventsRecords]]フィールドは、各agentについて、そのagentagent signifier[[AgentSignifier]]フィールドに持ち、[[EventList]]および[[AgentSynchronizesWith]]フィールドが空のListsであるAgent Events Recordを含むListです。

Note 6

agent cluster内のすべてのagentsは、そのAgent Record[[CandidateExecution]]フィールド内で同じcandidate executionを共有します。candidate executionmemory modelによって使用される仕様上の仕組みです。

Note 7

agent clusterは仕様上の仕組みであり、ECMAScript実装の特定のartefactに対応する必要はありません。

9.8 Forward Progress

agentforward progressを行うとは、この仕様に従ってevaluation stepを実行することです。

agentは、そのrunning execution contextが外部eventを同期的かつ無期限に待つとき、blockedになります。この意味でblockedになれるのは、そのAgent Record[[CanBlock]]フィールドがtrueであるagentsだけです。unblocked agentとは、blockedでないagentです。

実装は次を保証しなければなりません:

  • dedicated executing threadを持つすべてのunblocked agentは、最終的にforward progressを行う
  • executing threadを共有するagentsの集合では、1つのagentが最終的にforward progressを行う
  • agentは、blockingを提供する明示的なAPIsを通じる場合を除き、別のagentをblockedにさせない。
Note

これは、memory model内のliveness guaranteeとともに、すべてのseq-cst writesが最終的にすべてのagentsに観測可能になることを保証します。

9.9 WeakRefおよびFinalizationRegistry TargetsのProcessing Model

9.9.1 目的

この仕様は、任意のobjectまたはsymbolがgarbage collectedされることについて、いかなる保証も行いません。liveでないobjectsまたはsymbolsは、長期間の後にreleaseされる場合もあれば、まったくreleaseされない場合もあります。この理由により、この仕様はgarbage collectionによってtriggerされるbehaviourを記述するときに“may”という用語を使用します。

WeakRefsおよびFinalizationRegistrysのsemanticsは、特定の時点で発生する2つのoperationsに基づきます:

  • WeakRef.prototype.derefが呼び出されると、referent(undefinedが返されない場合)は、その後の同期的なアクセスも同じ値を返すようにaliveに保持されます。このlistは、ClearKeptObjects abstract operationを使用して同期的な作業が完了したときにresetされます。
  • FinalizationRegistryに登録されたobjectまたはsymbolが到達不能になると、同期的なECMAScript実行が完了した後に、FinalizationRegistryのcleanup callbackの呼び出しが最終的に行われる場合があります。FinalizationRegistry cleanupは、CleanupFinalizationRegistry abstract operationによって実行されます。

これらのactions(ClearKeptObjectsまたはCleanupFinalizationRegistry)のいずれも、同期的なECMAScript実行をinterruptしてはなりません。hostsはより長い同期的なECMAScript実行runsを構成する場合があるため、この仕様はClearKeptObjectsおよびCleanupFinalizationRegistryのschedulingをhost environmentへ委ねます。

一部のECMAScript実装には、ECMAScriptがidleであるときを含め、backgroundで実行されるgarbage collector implementationsが含まれます。host environmentにCleanupFinalizationRegistryをscheduleさせることで、finalizer workを実行するためにECMAScript実行を再開でき、held valuesを解放して全体的なmemory usageを減らせる場合があります。

9.9.2 Liveness

objectsおよび/またはsymbolsの集合objSetについて、objSetに関するhypothetical WeakRef-oblivious executionとは、referentがobjSetの要素であるWeakRefのabstract operation WeakRefDerefが常にundefinedを返すexecutionです。

Note 1
WeakRef-obliviousnessは、livenessとともに、2つの概念を捉えます。1つ目は、WeakRef自体はそのreferentをaliveに保持しないこと。2つ目は、livenessにおけるcyclesが、値がliveであることを意味しないことです。具体的には、vのlivenessの決定がWeakRef referent rのlivenessの決定に依存する場合、rのlivenessはvのlivenessを仮定できません。それは循環推論になるためです。
Note 2
WeakRef-obliviousnessは、cyclesを考慮するため、個別の値ではなくobjectsまたはsymbolsの集合上で定義されます。もし個別の値上で定義されていたなら、cycle内のWeakRef referentは、そのidentityがcycle内の他のWeakRef referentsを通じてのみ観測される場合でもliveとみなされます。
Note 3
口語的には、個々のobjectまたはsymbolは、それを含むすべての集合がliveであるならliveであると言います。

評価中の任意の時点で、objectsおよび/またはsymbolsの集合objSetは、次の条件のいずれかが満たされる場合、liveとみなされます:

  • objSet内の任意の要素が、任意のagent[[KeptAlive]] Listに含まれている。
  • objSetに関するvalid future hypothetical WeakRef-oblivious executionが存在し、そのexecutionがobjSet内の任意の値のidentityを観測する。
Note 4
上記の2番目の条件は、値のidentityがnon-WeakRef手段を通じて観測可能である場合、その値はliveであるという直観を捉えることを意図しています。値のidentityは、strict equality comparisonを観測すること、または値がMap内のkeyとして使用されることを観測することによって観測される場合があります。
Note 5

field、internal slot、またはproperty内にobjectまたはsymbolが存在することは、その値がliveであることを意味しません。たとえば、問題の値がprogramへ返されることがないなら、それは観測できません。

これは、WeakMap内のkeys、WeakSetのmembers、ならびにFinalizationRegistry Cell recordの[[WeakRefTarget]]および[[UnregisterToken]]フィールドに当てはまります。

上記の定義は、WeakMap内のkeyがliveでないなら、その対応するvalueも必ずしもliveではないことを含意します。

Note 6
Livenessは、どのWeakRefsをenginesが空にしてはならないかを保証する下限です。ここで定義されるLivenessは決定不能です。実際には、enginesはreachabilityなどの保守的近似を使用します。かなりのimplementation leewayがあることが期待されます。

9.9.3 Execution

任意の時点で、objectsおよび/またはsymbolsの集合objSetliveでない場合、ECMAScript実装は次のstepsをatomicallyに実行してよいです:

  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のいずれかのimplementation-defined choiceとする。
      3. enqueueCleanuptrueなら、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. 値がvalueであるset.[[WeakSetData]]の要素を、値がemptyである要素で置き換える。
Note 1

livenessの定義とともに、このclauseは、WeakRefsに関して実装が適用してよいoptimizationsを規定します。

objectのidentityを観測せずにそのobjectへアクセスすることは可能です。identityが観測されないnon-escaping objectsのpropertiesに対するdead variable eliminationやscalar replacementなどのoptimizationsは許可されます。したがって、これらのoptimizationsは、そのようなobjectsを指すWeakRefsを観測可能にemptyにすることが許可されます。

一方、objectのidentityが観測可能であり、そのobjectがWeakRef[[WeakRefTarget]] internal slot内にある場合、WeakRefを観測可能にemptyにするrematerializationなどのoptimizationsは禁止されます。

HostEnqueueFinalizationRegistryCleanupJobの呼び出しはoptionalであるため、FinalizationRegistry内のregistered objectsは、そのFinalizationRegistryを必ずしもliveに保持しません。実装は、任意の理由でFinalizationRegistry callbacksを省略してよく、たとえばFinalizationRegistry自体がdeadになる場合、またはapplicationがshutting downする場合があります。

Note 2

実装は、non-live objectsまたはsymbolsのmaximal setsについてWeakRefsをemptyにする義務を負いません。

実装がWeakRefsをemptyにするnon-live set objSetを選択した場合、この定義はobjSet内のすべての値に対するWeakRefsを同時にemptyにすることを要求します。言い換えると、空にされなければvの値を観測するexecutionが生じ得る他のWeakRefsをemptyにせずに、値vを指すWeakRefをemptyにすることは、実装にとってconformantではありません。

9.9.4 Host Hooks

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.

cleanupJobを、finalizationRegistryをcaptureし、呼び出されたときに次のstepsを実行する、parametersを持たない新しいJob Abstract Closureとする:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry))とする。
  2. cleanupResultabrupt completionであるなら、errorをreportするための任意のhost-defined stepsを実行する。
  3. unusedを返す。

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

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript実装は、ECMAScript実行の同期的sequenceが完了したときにClearKeptObjectsを呼び出すことが期待されます。 It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Recordとする。
  2. agentRecord.[[KeptAlive]]を新しい空のListに設定する。
  3. unusedを返す。

9.11 AddToKeptObjects ( value )

The abstract operation AddToKeptObjects takes argument value (an Object or a Symbol) and returns unused. It performs the following steps when called:

  1. agentRecordsurrounding agentAgent Recordとする。
  2. valueagentRecord.[[KeptAlive]]へappendする。
  3. unusedを返す。
Note
abstract operation AddToKeptObjectsがtarget objectまたはsymbolとともに呼び出されると、それはClearKeptObjectsが呼び出されるまでtargetをstronglyに指すlistへtargetを追加します。

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: finalizationRegistry[[Cells]]および[[CleanupCallback]] internal slotsを持つ。
  2. callbackfinalizationRegistry.[[CleanupCallback]]とする。
  3. finalizationRegistry.[[Cells]]cell.[[WeakRefTarget]]emptyであるRecord cellを含む間、実装は次のstepsを実行してよい:
    1. そのようなcellを任意に選択する。
    2. cellfinalizationRegistry.[[Cells]]から削除する。
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] »)を実行する。
  4. unusedを返す。

9.13 CanBeHeldWeakly ( arg )

The abstract operation CanBeHeldWeakly takes argument arg (an ECMAScript language value) and returns a Boolean. これは、argがweak referenceとして使用するのに適している場合に限り、trueを返します。weak referenceとして使用するのに適した値のみが、WeakMapのkey、WeakSetのelement、WeakRefのtarget、またはFinalizationRegistryのtargetsの1つになれます。 It performs the following steps when called:

  1. argがObjectなら、trueを返す。
  2. argがSymbolであり、KeyForSymbol(arg)がundefinedなら、trueを返す。
  3. falseを返す。
Note

language identityを持たないlanguage valueは、事前の参照なしにmanifestでき、weak referenceとして使用するには適していません。Symbol.forによって生成されたSymbol valueは、他のSymbol valuesと異なり、language identityを持たず、weak referenceとして使用するには適していません。Well-known symbolsはcollectionされることがない可能性が高いですが、数が限られており、したがってさまざまなimplementation approachesで管理可能であるため、それでもweak referenceとして使用するのに適しているものとして扱われます。ただし、live WeakMap内でwell-known symbolに関連付けられた任意の値はcollectionされにくく、実装においてmemory resourcesを“leak”する可能性があります。