9 実行可能コードと実行コンテキスト (Executable Code and Execution Contexts)

9.1 環境レコード (Environment Records)

Environment Record は、ECMAScript コードの字句上の入れ子(レキシカル)構造に基づいて Identifier と特定の変数・関数との関連付けを定義するために用いられる仕様上の型である。通常、Environment Record は FunctionDeclarationBlockStatement、または TryStatementCatch 節といった 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 型階層 (The Environment Record Type Hierarchy)

Environment Record は、Environment Record が抽象クラスであり 3 つの具象サブクラス(Declarative Environment RecordObject Environment RecordGlobal Environment Record)を持つ、単純なオブジェクト指向階層に存在するものと考えられる。Function Environment RecordModule Environment RecordDeclarative Environment Record のサブクラスである。

Environment Record 抽象クラスは、Table 14 に定義される抽象仕様メソッドを含む。これらの抽象メソッドは、各具象サブクラスに固有の具体的アルゴリズムを持つ。

Table 14: 環境レコードの抽象メソッド (Abstract Methods of Environment Records)
メソッド (Method) 目的 (Purpose)
HasBinding(N) Environment Record が文字列値 N の束縛を持つか判定する。持つなら true、持たないなら false を返す。
CreateMutableBinding(N, D) Environment Record に新しい未初期化の可変束縛を作成する。文字列値 N は束縛名のテキスト。Boolean 引数 Dtrue の場合、その束縛は後で削除可能。
CreateImmutableBinding(N, S) Environment Record に新しい未初期化の不変束縛を作成する。文字列値 N は束縛名のテキスト。Strue の場合、初期化後に設定しようとすると、参照する操作の strict モード設定に関わらず常に例外を投げる。
InitializeBinding(N, V) 既に存在し未初期化の束縛の値を設定する。文字列値 N は束縛名のテキスト。V は任意の ECMAScript 言語型の値。
SetMutableBinding(N, V, S) 既存の可変束縛の値を設定する。N は束縛名。V は任意の ECMAScript 言語型の値。Strue で束縛を設定できない場合 TypeError を投げる。
GetBindingValue(N, S) 既存束縛の値を返す。N は束縛名。S は strict モードコード(または strict セマンティクスが必要な参照)を識別する。Strue で束縛が存在しないなら ReferenceError。束縛が存在するが未初期化なら S に関係なく ReferenceError を投げる。
DeleteBinding(N) 束縛を削除する。存在し削除成功なら true、削除できなければ false。存在しないなら true
HasThisBinding() this 束縛を確立するか判定。確立するなら true、しないなら false
HasSuperBinding() super メソッド束縛を確立するか判定。確立するなら true、しないなら falsetrue の場合、その Environment RecordFunction Environment Record であることを含意する(逆は必ずしも成立しない)。
WithBaseObject() この Environment Recordwith 文に関連付くなら with オブジェクトを返し、それ以外は undefined を返す。

9.1.1.1 宣言的環境レコード (Declarative Environment Records)

Declarative Environment Record は、変数、定数、let、class、module、import、および / または function 宣言を含む ECMAScript プログラムスコープに関連付けられる。Declarative Environment Record は、そのスコープ内の宣言によって定義される識別子集合を束縛する。

9.1.1.1.1 HasBinding ( N )

The HasBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 引数の識別子がそのレコードで束縛される識別子の一つかどうかを判定する。 It performs the following steps when called:

  1. envRecN の束縛を持つなら true を返す。
  2. false を返す。

9.1.1.1.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了. 未初期化の新しい可変束縛 N を作成する。envRecN の既存束縛があってはならない。Dtrue の場合、その新しい束縛は削除対象としてマークされる。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. envRecN の未初期化可変束縛を作成する。Dtrue なら、後続の DeleteBinding 呼び出しで削除可能であることを記録する。
  3. unused を返す。

9.1.1.1.3 CreateImmutableBinding ( N, S )

The CreateImmutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了. 未初期化の新しい不変束縛 N を作成する。既存束縛は存在してはならない。Strue の場合、新しい束縛を strict 束縛としてマークする。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. envRecN の未初期化不変束縛を作成する。Strue なら strict 束縛であることを記録する。
  3. unused を返す。

9.1.1.1.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Declarative Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了. 名前 N を持つ識別子の現在の未初期化束縛に値 V を設定するために使用される。未初期化束縛が既に存在しなければならない。 It performs the following steps when called:

  1. アサート: envRecN の未初期化束縛を持つ。
  2. envRec における N の束縛値を V に設定する。
  3. Record その束縛が初期化されたことを記録する。
  4. unused を返す。

9.1.1.1.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Declarative Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の可変束縛値を V に変更しようとする。通常束縛は既存だが、まれに存在しない場合がある。束縛が不変束縛で Strue のとき TypeError を投げる。 It performs the following steps when called:

  1. envRecN の束縛を持たない場合、
    1. Strue なら ReferenceError 例外を投げる。
    2. envRec.CreateMutableBinding(N, true) を実行。
    3. envRec.InitializeBinding(N, V) を実行。
    4. unused を返す。
  2. envRec における N の束縛が strict 束縛なら Strue に設定。
  3. envRec における N の束縛が未初期化なら
    1. ReferenceError 例外を投げる。
  4. そうでなく envRec における N が可変束縛なら
    1. その束縛値を V に変更する。
  5. それ以外
    1. アサート: 不変束縛の値を変更しようとしている。
    2. Strue なら TypeError 例外を投げる。
  6. unused を返す。
Note

ステップ 1 で束縛が存在しない状況を生む ECMAScript コード例:

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

9.1.1.1.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Declarative Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が存在し未初期化である場合は、S の値に関わらず ReferenceError を投げる。 It performs the following steps when called:

  1. アサート: envRecN の束縛を持つ。
  2. envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。
  3. 現在 envRecN に束縛されている値を返す。

9.1.1.1.7 DeleteBinding ( N )

The DeleteBinding concrete method of Declarative Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:

  1. アサート: envRecN の束縛を持つ。
  2. envRec における N の束縛が削除不可なら false を返す。
  3. envRec から N の束縛を除去する。
  4. true を返す。

9.1.1.1.8 HasThisBinding ( )

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

  1. false を返す。
Note

通常の Declarative Environment RecordFunction Environment Record でも Module Environment Record でもないもの)は this 束縛を提供しない。

9.1.1.1.9 HasSuperBinding ( )

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

  1. false を返す。
Note

通常の Declarative Environment Recordsuper 束縛を提供しない。

9.1.1.1.10 WithBaseObject ( )

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

  1. undefined を返す。

9.1.1.2 オブジェクト環境レコード (Object Environment Records)

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

with 文(14.11)のために作成される Object Environment Record は、関数呼び出しで使用する暗黙の this 値として binding object を提供できる。この能力は Boolean フィールド [[IsWithEnvironment]] によって制御される。

Object Environment Record は Table 15 に列挙される追加状態フィールドを持つ。

Table 15: Object Environment Record の追加フィールド (Additional Fields of Object Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[BindingObject]] Object この Environment Record の binding object。
[[IsWithEnvironment]] Boolean この Environment Recordwith 文のために作成されたかどうかを示す。

9.1.1.2.1 HasBinding ( N )

The HasBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 関連付けられた binding object が名前 N のプロパティを持つか判定する。 It performs the following steps when called:

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

9.1.1.2.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Object Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. Environment Record の binding object に名前 N のプロパティを作成し、その値を undefined に初期化する。Dtrue なら新プロパティの [[Configurable]]true にし、そうでなければ false にする。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. DefinePropertyOrThrow(bindingObject, N, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }) を実行。
  3. unused を返す。
Note

通常 envRecN の束縛を持たないが、持つ場合には DefinePropertyOrThrow のセマンティクスにより既存束縛が置換・シャドウされるか、または急な完了が返ることがある。

9.1.1.2.3 CreateImmutableBinding ( N, S )

Object Environment Record の CreateImmutableBinding 具体メソッドは本仕様では使用されない。

9.1.1.2.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Object Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に設定する。 It performs the following steps when called:

  1. envRec.SetMutableBinding(N, V, false) を実行。
  2. unused を返す。
Note

本仕様では Object Environment Record に対する CreateMutableBinding の全使用は直後に同じ名前で InitializeBinding を呼び出す。したがって初期化状態は明示的に追跡しない。

9.1.1.2.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Object Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 関連する binding object のプロパティ N の値を V に設定しようとする。通常 N のプロパティは既に存在するが、存在しないか書き込み不可の場合、エラー処理は S に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. stillExists を ? HasProperty(bindingObject, N) とする。
  3. stillExistsfalse かつ Strue なら ReferenceError 例外を投げる。
  4. Set(bindingObject, N, V, S) を実行。
  5. unused を返す。

9.1.1.2.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Object Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 関連 binding object のプロパティ N の値を返す。プロパティは存在するはずだが存在しない場合、結果は S に依存する。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. value を ? HasProperty(bindingObject, N) とする。
  3. valuefalse なら
    1. Sfalse なら undefined を返し、そうでなければ ReferenceError 例外を投げる。
  4. Get(bindingObject, N) を返す。

9.1.1.2.7 DeleteBinding ( N )

The DeleteBinding concrete method of Object Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. [[Configurable]] 属性が true の環境オブジェクトプロパティに対応する束縛のみ削除できる。 It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]] とする。
  2. bindingObject.[[Delete]](N) を返す。

9.1.1.2.8 HasThisBinding ( )

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

  1. false を返す。
Note

Object Environment Recordthis 束縛を提供しない。

9.1.1.2.9 HasSuperBinding ( )

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

  1. false を返す。
Note

Object Environment Recordsuper 束縛を提供しない。

9.1.1.2.10 WithBaseObject ( )

The WithBaseObject concrete method of Object Environment Record envRec takes no arguments and returns Object または undefined. It performs the following steps when called:

  1. envRec.[[IsWithEnvironment]]true なら envRec.[[BindingObject]] を返す。
  2. そうでなければ undefined を返す。

9.1.1.3 関数環境レコード (Function Environment Records)

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

Function Environment Record は Table 16 に列挙される追加状態フィールドを持つ。

Table 16: Function Environment Record の追加フィールド (Additional Fields of Function Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[ThisValue]] ECMAScript 言語値 この関数呼び出しで使用される this 値。
[[ThisBindingStatus]] lexical, initialized, または uninitialized 値が lexical の場合、これは ArrowFunction でありローカルな this 値を持たない。
[[FunctionObject]] ECMAScript 関数オブジェクト この Environment Record を生成した呼び出し元の関数オブジェクト
[[NewTarget]] コンストラクタまたは undefined この Environment Record[[Construct]] 内部メソッドで作成された場合、[[NewTarget]] はその [[Construct]] newTarget パラメータの値。それ以外は undefined

Function Environment Record は Table 14 に挙げる Declarative Environment Record メソッドすべてをサポートし、HasThisBinding と HasSuperBinding を除き同一の仕様を共有する。さらに Table 17 に示すメソッドをサポートする:

Table 17: Function Environment Record の追加メソッド (Additional Methods of Function Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛の値を返す。未初期化なら ReferenceError を投げる。

9.1.1.3.1 BindThisValue ( envRec, V )

The abstract operation BindThisValue takes arguments envRec (Function Environment Record) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. envRec.[[ThisValue]] を設定し初期化済みであることを記録する。 It performs the following steps when called:

  1. アサート: envRec.[[ThisBindingStatus]]lexical ではない。
  2. envRec.[[ThisBindingStatus]]initialized なら ReferenceError 例外を投げる。
  3. envRec.[[ThisValue]]V に設定する。
  4. envRec.[[ThisBindingStatus]]initialized に設定する。
  5. unused を返す。

9.1.1.3.2 HasThisBinding ( )

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

  1. envRec.[[ThisBindingStatus]]lexical なら false、そうでなければ true を返す。

9.1.1.3.3 HasSuperBinding ( )

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

  1. envRec.[[ThisBindingStatus]]lexical なら false を返す。
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined なら false、そうでなければ true を返す。

9.1.1.3.4 GetThisBinding ( )

The GetThisBinding concrete method of Function Environment Record envRec takes no arguments and returns ECMAScript 言語値を含む正常完了または throw 完了. It performs the following steps when called:

  1. アサート: envRec.[[ThisBindingStatus]]lexical ではない。
  2. envRec.[[ThisBindingStatus]]uninitialized なら ReferenceError 例外を投げる。
  3. envRec.[[ThisValue]] を返す。

9.1.1.3.5 GetSuperBase ( envRec )

The abstract operation GetSuperBase takes argument envRec (Function Environment Record) and returns Object, null, または undefined. envRec に束縛された super プロパティアクセスの基底オブジェクトを返す。値 undefined はそうしたアクセスが実行時エラーになることを示す。 It performs the following steps when called:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]] とする。
  2. homeundefined なら undefined を返す。
  3. アサート: home は ordinary object。
  4. home.[[GetPrototypeOf]]() を返す。

9.1.1.4 グローバル環境レコード (Global Environment Records)

Global Environment Record は、共通の realm で処理されるすべての ECMAScript Script 要素に共有される最も外側のスコープを表す。Global Environment Record は組み込みグローバル(19)、グローバルオブジェクトのプロパティ、および Script 内に現れるすべてのトップレベル宣言(8.2.9, 8.2.11)に束縛を提供する。

Global Environment Record は論理的には単一のレコードだが、Object Environment RecordDeclarative Environment Record を包含する合成体として仕様化される。Object Environment Record の基底オブジェクトは関連する Realm Recordグローバルオブジェクトであり、これは Global Environment Record の GetThisBinding 具体メソッドが返す値である。Global Environment Record の Object Environment Record 部分は、すべての組み込みグローバル(19)およびグローバルコード内の FunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclarationVariableStatement によって導入される束縛を含む。それ以外のグローバルコード内の ECMAScript 宣言による束縛は Global Environment Record の Declarative Environment Record 部分に含まれる。

プロパティはグローバルオブジェクト上に直接作成され得る。したがって Global Environment Record の Object Environment Record 部分は、宣言(FunctionDeclaration 等)によって明示的に作成された束縛と、グローバルオブジェクトのプロパティとして暗黙に作成された束縛の両方を含み得る。どの束縛が宣言によって明示的に作成されたものか識別するため、Global Environment Record は CreateGlobalVarBindingCreateGlobalFunctionBinding 抽象操作で束縛された名前のリストを保持する。

Global Environment Record は Table 18 に挙げる追加フィールドおよび Table 19 に挙げる追加メソッドを持つ。

Table 18: Global Environment Record の追加フィールド (Additional Fields of Global Environment Records)
フィールド名 (Field Name) 値 (Value) 意味 (Meaning)
[[ObjectRecord]] Object Environment Record Binding object はグローバルオブジェクト。組み込みグローバルの束縛と、グローバルコード内の FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 束縛を含む。
[[GlobalThisValue]] Object グローバルスコープで this が返す値。ホストは任意の ECMAScript Object を提供可能。
[[DeclarativeRecord]] Declarative Environment Record Contains グローバルコード内の全宣言(ただし FunctionDeclaration など一部を除く)の束縛。
Table 19: Global Environment Record の追加メソッド (Additional Methods of Global Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛値を返す。

9.1.1.4.1 HasBinding ( N )

The HasBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子がこのレコードで束縛される一つか判定する。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら true を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.HasBinding(N) を返す。

9.1.1.4.2 CreateMutableBinding ( N, D )

The CreateMutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and D (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい可変束縛 N を作成する。束縛は関連 DeclarativeRecord に作成される。N の束縛は既に存在してはならない。Dtrue の場合、削除対象としてマークされる。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら TypeError 例外を投げる。
  3. DclRec.CreateMutableBinding(N, D) を返す。

9.1.1.4.3 CreateImmutableBinding ( N, S )

The CreateImmutableBinding concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns unused を含む正常完了または throw 完了. 未初期化の新しい不変束縛 N を作成する。N の既存束縛は存在してはならない。Strue なら strict 束縛としてマーク。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら TypeError 例外を投げる。
  3. DclRec.CreateImmutableBinding(N, S) を返す。

9.1.1.4.4 InitializeBinding ( N, V )

The InitializeBinding concrete method of Global Environment Record envRec takes arguments N (String) and V (ECMAScript 言語値) and returns unused を含む正常完了または throw 完了. 名前 N の未初期化束縛値を V に設定する。未初期化束縛が既に存在する必要がある。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.InitializeBinding(N, V) を返す。
  3. アサート: 束縛が存在するなら Object Environment Record にある。
  4. ObjRecenvRec.[[ObjectRecord]] とする。
  5. ObjRec.InitializeBinding(N, V) を返す。

9.1.1.4.5 SetMutableBinding ( N, V, S )

The SetMutableBinding concrete method of Global Environment Record envRec takes arguments N (String), V (ECMAScript 言語値), and S (Boolean) and returns unused を含む正常完了または throw 完了. 名前 N の現在の束縛値を V に変更しようとする。不変束縛で Strue なら TypeError。プロパティ N が存在しないか書き込み不可の場合の処理は S に依存。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.SetMutableBinding(N, V, S) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.SetMutableBinding(N, V, S) を返す。

9.1.1.4.6 GetBindingValue ( N, S )

The GetBindingValue concrete method of Global Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。束縛が未初期化なら ReferenceError。プロパティ N の存在や書き込み可否に関連するエラー処理は S に依存。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.GetBindingValue(N, S) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. ObjRec.GetBindingValue(N, S) を返す。

9.1.1.4.7 DeleteBinding ( N )

The DeleteBinding concrete method of Global Environment Record envRec takes argument N (String) and returns Boolean を含む正常完了または throw 完了. 削除対象として明示的に指定された束縛のみ削除できる。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) が true なら
    1. DclRec.DeleteBinding(N) を返す。
  3. ObjRecenvRec.[[ObjectRecord]] とする。
  4. globalObjectObjRec.[[BindingObject]] とする。
  5. existingProp を ? HasOwnProperty(globalObject, N) とする。
  6. existingProptrue なら
    1. ObjRec.DeleteBinding(N) を返す。
  7. true を返す。

9.1.1.4.8 HasThisBinding ( )

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

  1. true を返す。
Note

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

9.1.1.4.9 HasSuperBinding ( )

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

  1. false を返す。
Note

Global Environment Recordsuper 束縛を提供しない。

9.1.1.4.10 WithBaseObject ( )

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

  1. undefined を返す。

9.1.1.4.11 GetThisBinding ( )

The GetThisBinding concrete method of Global Environment Record envRec takes no arguments and returns Object を含む正常完了. It performs the following steps when called:

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

9.1.1.4.12 HasLexicalDeclaration ( envRec, N )

The abstract operation HasLexicalDeclaration takes arguments envRec (Global Environment Record) and N (String) and returns Boolean. 引数の識別子が、LexicalDeclarationClassDeclaration のようなレキシカル宣言で envRec に作成された束縛を持つか判定する。 It performs the following steps when called:

  1. DclRecenvRec.[[DeclarativeRecord]] とする。
  2. DclRec.HasBinding(N) を返す。

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, N )

The abstract operation HasRestrictedGlobalProperty takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 引数の識別子が、グローバルレキシカル束縛によってシャドウされてはならないグローバルオブジェクトプロパティ名か判定する。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined なら false を返す。
  5. existingProp.[[Configurable]]true なら false を返す。
  6. true を返す。
Note

グローバルオブジェクト上には var や function 宣言ではなく直接作成されたプロパティが存在し得る。非 configurable なグローバルオブジェクトのプロパティと同名のグローバルレキシカル束縛は作成できない。"undefined" はその例である。

9.1.1.4.14 CanDeclareGlobalVar ( envRec, N )

The abstract operation CanDeclareGlobalVar takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 NCreateGlobalVarBinding 呼び出しが成功するか判定する。冗長な var 宣言や既存グローバルオブジェクトプロパティに対する var 宣言は許可される。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, N) とする。
  4. hasPropertytrue なら true を返す。
  5. IsExtensible(globalObject) を返す。

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, N )

The abstract operation CanDeclareGlobalFunction takes arguments envRec (Global Environment Record) and N (String) and returns Boolean を含む正常完了または throw 完了. 同じ引数 NCreateGlobalFunctionBinding 呼び出しが成功するか判定する。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined なら ? IsExtensible(globalObject) を返す。
  5. existingProp.[[Configurable]]true なら true を返す。
  6. IsDataDescriptor(existingProp) が true かつ existingProp が属性 { [[Writable]]: true, [[Enumerable]]: true } を持つなら true を返す。
  7. false を返す。

9.1.1.4.16 CreateGlobalVarBinding ( envRec, N, D )

The abstract operation CreateGlobalVarBinding takes arguments envRec (Global Environment Record), N (String), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば再利用され初期化済みとみなされる。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. hasProperty を ? HasOwnProperty(globalObject, N) とする。
  4. extensible を ? IsExtensible(globalObject) とする。
  5. hasPropertyfalse かつ extensibletrue なら
    1. ObjRec.CreateMutableBinding(N, D) を実行。
    2. ObjRec.InitializeBinding(N, undefined) を実行。
  6. unused を返す。

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, N, V, D )

The abstract operation CreateGlobalFunctionBinding takes arguments envRec (Global Environment Record), N (String), V (ECMAScript 言語値), and D (Boolean) and returns unused を含む正常完了または throw 完了. 関連する Object Environment Record に可変束縛を作成・初期化する。既存束縛があれば置き換える。 It performs the following steps when called:

  1. ObjRecenvRec.[[ObjectRecord]] とする。
  2. globalObjectObjRec.[[BindingObject]] とする。
  3. existingProp を ? globalObject.[[GetOwnProperty]](N) とする。
  4. existingPropundefined または existingProp.[[Configurable]]true なら
    1. desc を PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D } とする。
  5. それ以外
    1. desc を PropertyDescriptor { [[Value]]: V } とする。
  6. DefinePropertyOrThrow(globalObject, N, desc) を実行。
  7. Set(globalObject, N, V, false) を実行。
  8. unused を返す。
Note

グローバル関数宣言は常にグローバルオブジェクトの自身プロパティとして表現される。可能であれば既存の自身プロパティは標準的な属性値集合に再設定される。ステップ 7 は InitializeBinding 具体メソッド呼び出しと等価であり、globalObject が Proxy の場合同じ Proxy トラップ呼び出し列を生成する。

9.1.1.5 モジュール環境レコード (Module Environment Records)

Module Environment Record は ECMAScript Module の外側スコープを表す Declarative Environment Record である。通常の可変・不変束縛に加え、他の Environment Record に存在する対象束縛への間接アクセスを提供する不変の import 束縛も提供する。

Module Environment Record は Table 14 に挙げる Declarative Environment Record メソッドのすべてをサポートし、GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding を除き同じ仕様を共有する。さらに Table 20 に示すメソッドをサポートする:

Table 20: Module Environment Record の追加メソッド (Additional Methods of Module Environment Records)
メソッド (Method) 目的 (Purpose)
GetThisBinding() この Environment Recordthis 束縛値を返す。

9.1.1.5.1 GetBindingValue ( N, S )

The GetBindingValue concrete method of Module Environment Record envRec takes arguments N (String) and S (Boolean) and returns ECMAScript 言語値を含む正常完了または throw 完了. 名前 N の束縛値を返す。ただし束縛が間接束縛なら対象束縛値を返す。束縛が未初期化なら ReferenceError を投げる。 It performs the following steps when called:

  1. アサート: Strue
  2. アサート: envRecN の束縛を持つ。
  3. N の束縛が間接束縛なら
    1. MN2 をこの束縛作成時に提供された間接化値とする。
    2. targetEnvM.[[Environment]] とする。
    3. targetEnvempty なら ReferenceError 例外を投げる。
    4. targetEnv.GetBindingValue(N2, true) を返す。
  4. envRec における N の束縛が未初期化なら ReferenceError 例外を投げる。
  5. 現在 envRecN に束縛されている値を返す。
Note

S は常に trueModule は常に strict モードコードだからである。

9.1.1.5.2 DeleteBinding ( N )

Module Environment Record の DeleteBinding 具体メソッドは本仕様では使用されない。

Note

Module Environment Record は strict コード内のみで使用され、strict コードでは delete 演算子が Module Environment Record 束縛へ解決される Reference Record に適用されることを早期エラー規則が防ぐ。13.5.1.1 参照。

9.1.1.5.3 HasThisBinding ( )

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

  1. true を返す。
Note

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

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of Module Environment Record envRec takes no arguments and returns undefined を含む正常完了. It performs the following steps when called:

  1. undefined を返す。

9.1.1.5.5 CreateImportBinding ( envRec, N, M, N2 )

The abstract operation CreateImportBinding takes arguments envRec (Module Environment Record), N (String), M (Module Record), and N2 (String) and returns unused. 名前 N の新しい初期化済み不変間接束縛を作成する。envRecN の束縛は存在してはならない。N2MModule Environment Record に存在する束縛名。新束縛の値へのアクセスは対象束縛値を間接的にアクセスする。 It performs the following steps when called:

  1. アサート: envRec はまだ N の束縛を持たない。
  2. アサート: M.[[Environment]] のインスタンス化時、N2 の直接束縛を持つ。
  3. envRecM, N2 を対象とする N の不変間接束縛を(初期化済みとして)作成する。
  4. unused を返す。

9.1.2 環境レコード操作 (Environment Record Operations)

以下の抽象操作は本仕様で Environment Record を操作するために使用される:

9.1.2.1 GetIdentifierReference ( env, name, strict )

The abstract operation GetIdentifierReference takes arguments env (Environment Record または null), name (String), and strict (Boolean) and returns Reference Record を含む正常完了または throw 完了. It performs the following steps when called:

  1. envnull なら
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  2. exists を ? env.HasBinding(name) とする。
  3. existstrue なら
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } を返す。
  4. それ以外
    1. outerenv.[[OuterEnv]] とする。
    2. GetIdentifierReference(outer, name, strict) を返す。

9.1.2.2 NewDeclarativeEnvironment ( E )

The abstract operation NewDeclarativeEnvironment takes argument E (Environment Record または null) and returns Declarative Environment Record. It performs the following steps when called:

  1. 绑定を含まない新しい Declarative Environment Record env を生成する。
  2. env.[[OuterEnv]]E に設定。
  3. env を返す。

9.1.2.3 NewObjectEnvironment ( O, W, E )

The abstract operation NewObjectEnvironment takes arguments O (Object), W (Boolean), and E (Environment Record または null) and returns Object Environment Record. It performs the following steps when called:

  1. 新しい Object Environment Record env を生成する。
  2. env.[[BindingObject]]O に設定。
  3. env.[[IsWithEnvironment]]W に設定。
  4. env.[[OuterEnv]]E に設定。
  5. env を返す。

9.1.2.4 NewFunctionEnvironment ( F, newTarget )

The abstract operation NewFunctionEnvironment takes arguments F (ECMAScript 関数オブジェクト) and newTarget (Object または undefined) and returns Function Environment Record. It performs the following steps when called:

  1. 束縛を含まない新しい Function Environment Record env を生成。
  2. env.[[FunctionObject]]F に設定。
  3. F.[[ThisMode]]lexical なら env.[[ThisBindingStatus]]lexical に設定。
  4. それ以外なら env.[[ThisBindingStatus]]uninitialized に設定。
  5. env.[[NewTarget]]newTarget に設定。
  6. env.[[OuterEnv]]F.[[Environment]] に設定。
  7. env を返す。

9.1.2.5 NewGlobalEnvironment ( G, thisValue )

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

  1. objRecNewObjectEnvironment(G, false, null) とする。
  2. dclRecNewDeclarativeEnvironment(null) とする。
  3. 新しい Global Environment Record env を生成。
  4. env.[[ObjectRecord]]objRec に設定。
  5. env.[[GlobalThisValue]]thisValue に設定。
  6. env.[[DeclarativeRecord]]dclRec に設定。
  7. env.[[OuterEnv]]null に設定。
  8. env を返す。

9.1.2.6 NewModuleEnvironment ( E )

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

  1. 束縛を含まない新しい Module Environment Record env を生成する。
  2. env.[[OuterEnv]]E に設定。
  3. env を返す。

9.2 PrivateEnvironment レコード

PrivateEnvironment Record は、ECMAScript コード内の ClassDeclaration および ClassExpression の字句上の入れ子構造に基づいて Private Name を追跡するための仕様上のメカニズムである。Environment Record に類似しているが別個のものである。各 PrivateEnvironment Record は 1 つの ClassDeclaration または ClassExpression に関連付けられる。そのようなクラスが評価されるたびに、そのクラスで宣言された Private Name を記録する新たな PrivateEnvironment Record が生成される。

PrivateEnvironment RecordTable 21 で定義されるフィールドを持つ。

Table 21: PrivateEnvironment Record のフィールド (PrivateEnvironment Record Fields)
フィールド名 値の型 意味
[[OuterPrivateEnvironment]] PrivateEnvironment Record または null 最も近い外側にあるクラスの PrivateEnvironment Record。関連付けられているクラスが他のいかなるクラスにも内包されていない場合は null
[[Names]] Private NameList このクラスによって宣言された Private Name 群。

9.2.1 PrivateEnvironment Record の操作

本仕様で PrivateEnvironment Record を操作するために以下の抽象操作を用いる:

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 pn について、
    1. pn.[[Description]]identifier であるなら
      1. pn を返す。
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]] とする。
  4. アサート: outerPrivateEnvnull ではない。
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) を返す。

9.3 Realm

評価される前に、すべての ECMAScript コードは realm に関連付けられなければならない。概念的には realm は一連の組み込みオブジェクト、ECMAScript のグローバル環境、そのグローバル環境のスコープ内で読み込まれるすべての ECMAScript コード、及びその他関連する状態とリソースから構成される。

realm は本仕様では Table 22 に示すフィールドを持つ Realm Record として表現される:

Table 22: Realm Record のフィールド (Realm Record Fields)
フィールド名 意味
[[AgentSignifier]] agent signifier この realm を所有する agent
[[Intrinsics]] フィールド名が intrinsic key で値がオブジェクトである Record この realm に関連付けられたコードが使用する intrinsic 値
[[GlobalObject]] Object この realm の global object
[[GlobalEnv]] Global Environment Record この realm のグローバル環境
[[TemplateMap]] [[Site]] (TemplateLiteral Parse Node) と [[Array]] (Array) を持つ RecordList

テンプレートオブジェクトは各 realm ごとにその Realm Record[[TemplateMap]] を用いて正規化される。各 [[Site]]TemplateLiteral である Parse Node。対応する [[Array]] はタグ関数へ渡されるテンプレートオブジェクト。

Note 1
Parse Node が到達不能となった場合、対応する [[Array]] も到達不能となり、実装がその組を [[TemplateMap]] から除去しても観測不可能である。
[[LoadedModules]] LoadedModuleRequest RecordList

この realm が import した specifier 文字列から解決済み Module Record への写像。ModuleRequestsEqual(r1, r2) が true となる異なる Record r1r2 を 2 つ含まない。

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

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. realm を新しい Realm Record とする。
  2. CreateIntrinsics(realm) を実行。
  3. realm.[[AgentSignifier]]AgentSignifier() に設定。
  4. realm.[[TemplateMap]] を新しい空の List に設定。
  5. newContext を新しい実行コンテキストとする。
  6. newContext の Function を null に設定。
  7. newContextRealmrealm に設定。
  8. newContext の ScriptOrModule を null に設定。
  9. 実行コンテキストスタックに newContext を push する; newContext が現在の実行コンテキストとなる。
  10. ホストrealm の global object として奇異 (exotic) オブジェクトを要求する場合、
    1. globalホスト定義の方法で作成されたそのようなオブジェクトとする。
  11. それ以外、
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) とする。
  12. ホストrealm のグローバルスコープにおける this 束縛が global object とは異なるオブジェクトを返すことを要求する場合、
    1. thisValueホスト定義の方法で作成されたそのようなオブジェクトとする。
  13. それ以外、
    1. thisValueglobal とする。
  14. realm.[[GlobalObject]]global に設定。
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue) に設定。
  16. SetDefaultGlobalBindings(realm) を実行。
  17. ホスト定義グローバルオブジェクトプロパティを global 上に作成する。
  18. unused を返す。

9.3.2 CreateIntrinsics ( realmRec )

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

  1. realmRec.[[Intrinsics]] を新しい Record に設定。
  2. realmRec.[[Intrinsics]] のフィールドを Table 6 に列挙される値で設定する。フィールド名は表の第 1 列の名前。各フィールドの値は、19 から 28 の各節で定義されたとおりのプロパティ値で完全かつ再帰的に埋められた新しいオブジェクト値。すべてのオブジェクトプロパティ値は新たに作成されるオブジェクト値。ビルトイン関数オブジェクトとなる値はすべて CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype) を実行して作成される。ここで steps は本仕様で提供されるその関数の定義、name は関数の "name" プロパティの初期値、length"length" プロパティの初期値、slots はその関数に指定された内部スロット名(存在する場合)のリスト、prototype はその関数の [[Prototype]] 内部スロットの指定値。intrinsic とそのプロパティの生成順序は未生成のオブジェクトに依存しないよう配慮しなければならない。
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec) を実行。
  4. unused を返す。

9.3.3 SetDefaultGlobalBindings ( realmRec )

The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns unused を含む正常完了または throw 完了. It performs the following steps when called:

  1. globalrealmRec.[[GlobalObject]] とする。
  2. 19 で指定される Global Object の各プロパティについて、
    1. nameプロパティ名の String 値とする。
    2. desc をそのプロパティに対して指定された属性を含む、完全に埋められたデータ Property Descriptor とする。19.219.3、または 19.4 に列挙されたプロパティについては [[Value]] 属性の値は realmRec から対応する intrinsic オブジェクト。
    3. DefinePropertyOrThrow(global, name, desc) を実行。
  3. unused を返す。

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

execution context は、ECMAScript 実装によるコードの実行時評価を追跡するために用いられる仕様デバイスである。任意の時点で、実際にコードを実行している agent ごとに高々 1 つの実行コンテキストが存在する。これをその agent実行中実行コンテキスト (running execution context) と呼ぶ。本仕様中で実行中実行コンテキストへの参照は常に囲んでいる agent の実行中実行コンテキストを指す。

実行コンテキストスタック (execution context stack) は実行コンテキストを追跡するために使用される。実行中実行コンテキストは常にこのスタックの最上位要素である。現在の実行中実行コンテキストに関連付く実行可能コードから、関連付いていない別の実行可能コードへ制御が移るたびに新しい実行コンテキストが生成される。新たな実行コンテキストはスタックに push され、実行中実行コンテキストとなる。

実行コンテキストは、関連コードの実行進行状況を追跡するために必要な実装依存状態を保持する。各実行コンテキストは少なくとも Table 23 に列挙される状態コンポーネントを持つ。

Table 23: すべての実行コンテキストに共通の状態コンポーネント (State Components for All Execution Contexts)
コンポーネント 目的
code evaluation state この実行コンテキストに関連するコードの評価・一時停止・再開を行うために必要なあらゆる状態。
Function この実行コンテキストが関数オブジェクトのコードを評価しているなら、値はその関数オブジェクトScript または Module のコードを評価しているなら値は null
Realm 関連コードが ECMAScript リソースにアクセスする際の Realm Record
ScriptOrModule 関連コードの起源となる Module Record または Script Record。起源となる script / module が存在しない (InitializeHostDefinedRealm で生成された元の実行コンテキスト等) 場合は null

実行中実行コンテキストによるコード評価は本仕様で定義された様々な地点で一時停止され得る。一度一時停止されると別の実行コンテキストが実行中実行コンテキストとなり自身のコード評価を開始し得る。後で一時停止中の実行コンテキストが再び実行中となり、以前に一時停止された地点から評価を継続し得る。実行中実行コンテキストの状態移行は通常スタック的 (LIFO) に行われるが、いくつかの ECMAScript 機能では非 LIFO の遷移が必要である。

実行中実行コンテキストの Realm コンポーネントの値は current Realm Record とも呼ばれる。Function コンポーネントの値は active function object とも呼ばれる。

ECMAScript コード実行コンテキストTable 24 に列挙される追加状態コンポーネントを持つ。

Table 24: ECMAScript コード実行コンテキストの追加状態コンポーネント (Additional State Components for ECMAScript Code Execution Contexts)
コンポーネント 目的
LexicalEnvironment この実行コンテキスト内のコードが識別子参照を解決するために使用する Environment Record
VariableEnvironment この実行コンテキスト内の VariableStatement によって作成された束縛を保持する Environment Record
PrivateEnvironment 最も近い外側のクラス内で ClassElement により生成された Private Name を保持する PrivateEnvironment Record。内包するクラスが無ければ null

実行コンテキストの LexicalEnvironment および VariableEnvironment コンポーネントは常に Environment Record である。

Generator の評価を表す実行コンテキストは Table 25 に示す追加状態コンポーネントを持つ。

Table 25: Generator 実行コンテキストの追加状態コンポーネント (Additional State Components for Generator Execution Contexts)
コンポーネント 目的
Generator この実行コンテキストが評価している Generator。

ほとんどの場合、本仕様のアルゴリズムが直接操作するのは実行中実行コンテキスト(スタック頂上)のみである。したがって「LexicalEnvironment」や「VariableEnvironment」という語が修飾なしに使われるとき、それは実行中実行コンテキストのそれらを指す。

実行コンテキストは純粋に仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。ECMAScript コードから実行コンテキストへ直接アクセスや観測を行うことは不可能である。

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. 実行中実行コンテキストに基づき、実行中の script または module を決定するために用いられる。 It performs the following steps when called:

  1. 実行コンテキストスタックが空なら null を返す。
  2. ec を、実行コンテキストスタック上で最上位から見て ScriptOrModule コンポーネントが null でない最初の実行コンテキストとする。
  3. そのような実行コンテキストが存在しなければ null を返し、存在するなら ec の ScriptOrModule を返す。

9.4.2 ResolveBinding ( name [ , env ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. name の束縛を決定するために用いられる。env は探索対象の Environment Record を明示的に与えるために使用できる。 It performs the following steps when called:

  1. env が与えられていない、または envundefined なら
    1. env を実行中実行コンテキストの LexicalEnvironment に設定する。
  2. アサート: envEnvironment Record である。
  3. strict を評価されつつある構文生成規則に対する IsStrict の結果とする。
  4. GetIdentifierReference(env, name, strict) を返す。
Note

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

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. 現在 this の束縛を提供している Environment Record を見つける。 It performs the following steps when called:

  1. env を実行中実行コンテキストの LexicalEnvironment とする。
  2. 繰り返し:
    1. existsenv.HasThisBinding() とする。
    2. existstrue なら env を返す。
    3. outerenv.[[OuterEnv]] とする。
    4. アサート: outernull ではない。
    5. envouter に設定する。
Note

ステップ 2 のループは、連鎖が常に this 束縛を持つグローバル環境で終わるため必ず停止する。

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. 実行中実行コンテキストの LexicalEnvironment を用いてキーワード this の束縛を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. envRec.GetThisBinding() を返す。

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. 実行中実行コンテキストの LexicalEnvironment を用いて NewTarget 値を決定する。 It performs the following steps when called:

  1. envRecGetThisEnvironment() とする。
  2. アサート: envRec[[NewTarget]] フィールドを持つ。
  3. envRec.[[NewTarget]] を返す。

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. 現在実行中の実行コンテキストが使用するグローバルオブジェクトを返す。 It performs the following steps when called:

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

9.5 Job と Job をキューに入れるためのホスト操作 (Jobs and Host Operations to Enqueue Jobs)

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

Job は特定の agent 内で ECMAScript ホスト環境によって実行がスケジュールされる。本仕様は、HostEnqueueGenericJobHostEnqueueFinalizationRegistryCleanupJobHostEnqueuePromiseJob、および HostEnqueueTimeoutJob というホストフックを記述し、Job をスケジュールする。これらのホストフックは、Job のスケジューリングに課される追加制約によって整理されている。ホストは追加で Job をスケジュールする抽象操作を定義してよい。そのような操作は Job Abstract ClosurerealmRealm Record または null)を引数に取る。Realm Record が与えられた場合、これらの操作は、その realm を所有する agent において、指定された将来時点でその realm において Job を実行するようスケジュールする。realmnull が与えられた場合、その Job は ECMAScript コードを評価しない。実装は以下の要件に従わなければならない:

  • 将来のある時点で、Job がスケジュールされた agent に実行中コンテキストが無く、その agent の実行コンテキストスタックが空であるとき、実装は以下を行わなければならない:
    1. ホスト定義の準備ステップを実行する。
    2. Invoke して Job Abstract Closure を呼び出す。
    3. ホスト定義の後片付けステップを実行し、その後で実行コンテキストスタックは空でなければならない。
  • 任意の時点で 1 つの agent では同時に評価進行中となれる Job は高々 1 つである。
  • ある Job の評価が開始したら、その agent で他のどの Job の評価が開始するよりも前に完了まで走り切らなければならない。
  • Abstract Closure は正常完了を返さなければならず、エラー処理は自身で実装する。
Note 1
ホスト環境はスケジューリングに関して Job を一様に扱う必要はない。例えば、Web ブラウザや Node.js は Promise 処理の Job を他の作業より高優先度で扱う。将来の機能追加により、必ずしも高優先度で扱われない新たな Job が追加されるかもしれない。

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

  • GetActiveScriptOrModule() が scriptOrModule である。
  • scriptOrModuleScript Record または Module Record の場合、ec を実行コンテキストスタック上で ScriptOrModule コンポーネントが scriptOrModule である最上位の実行コンテキストとする。ecRealm コンポーネントは scriptOrModule.[[Realm]] である。

任意の時点で、次の条件をすべて満たすとき、その実行は prepared to evaluate ECMAScript code である:

  • 実行コンテキストスタックは空ではない。
  • 実行コンテキストスタック上で最上位の実行コンテキストの Realm コンポーネントは Realm Record である。
Note 2

ホスト環境は実行コンテキストを実行コンテキストスタックに push することでコード評価の準備を行うことができる。具体的な手順は実装定義である。

Realm の具体的選択はホスト環境次第である。この初期実行コンテキストと Realm は、任意のコールバック関数が呼ばれる前にのみ使用される。Promise ハンドラのような Job 関連のコールバック関数が呼び出されると、その呼び出しは独自の実行コンテキストと Realm を push する。

特定種類の Job には追加の適合要件が存在する。

9.5.1 JobCallback Record

JobCallback Record関数オブジェクトホスト定義値を格納するための Record 値である。ホストによってキューに入れられた Job を通じて呼び出される関数オブジェクトは追加のホスト定義コンテキストを持ち得る。その状態を伝播するために、Job Abstract Closure関数オブジェクトを直接捕捉して呼び出すべきではない。代わりに HostMakeJobCallbackHostCallJobCallback を用いる。

Note

例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/) は、ホスト定義値を用いて Promise コールバック用の incumbent settings object を伝播する。

JobCallback Record は Table 26 に列挙するフィールドを持つ。

Table 26: JobCallback Record のフィールド (JobCallback Record Fields)
Field Name Value Meaning
[[Callback]] a function object Job が呼び出されたときに実行する関数。
[[HostDefined]] anything (default value is empty) ホストが使用するために予約されたフィールド。

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 のデフォルト実装は呼び出されたとき次を行う:

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

Web ブラウザではない ECMAScript ホストは HostMakeJobCallback のデフォルト実装を使用しなければならない。

Note

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

9.5.3 HostCallJobCallback ( jobCallback, V, argumentsList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), V (an ECMAScript language value), and argumentsList (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]], V, argumentsList) を実行しその結果を返さなければならない。
Note

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

HostCallJobCallback のデフォルト実装は呼び出されたとき次を行う:

  1. アサート: IsCallable(jobCallback.[[Callback]]) is true.
  2. ? Call(jobCallback.[[Callback]], V, argumentsList) を返す。

Web ブラウザではない ECMAScript ホストは 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 をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、優先度や順序付けといった追加制約なくスケジュールされることを意図している。

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 をスケジュールする。このアルゴリズムと共に用いられる Abstract Closure は、Promise の処理に関連するか、さもなくば Promise 処理操作と同等の優先度でスケジュールされることを意図している。

HostEnqueuePromiseJob の実装は 9.5 の要件に加えて以下に従わなければならない:

  • realmnull でないなら、job が呼び出されるたびに、その時点で ECMAScript コードを評価する準備が整うよう実装定義ステップを実行しなければならない。
  • scriptOrModule を HostEnqueuePromiseJob が呼び出された時点での GetActiveScriptOrModule() とする。realmnull でないなら、job が呼び出されるたびに、その呼び出しの時点で scriptOrModuleactive script or module であるよう実装定義ステップを実行しなければならない。
  • Job はそれらをスケジュールした HostEnqueuePromiseJob 呼び出しと同じ順序で実行されなければならない。
Note

NewPromiseResolveThenableJob が返す Jobrealm は通常 then 関数オブジェクトに対して GetFunctionRealm を呼び出した結果である。NewPromiseReactionJob が返す Jobrealm は、ハンドラが undefined でない場合そのハンドラに対して GetFunctionRealm を呼び出した結果が通常使われる。ハンドラが undefined の場合、realmnull。どちらの種類の Job でも、GetFunctionRealm が異常終了する(例: revoke 済み Proxy に対して呼び出された)とき、realm はその GetFunctionRealm 呼び出し時の現在の Realm Record となる。realmnull の場合、ユーザ ECMAScript コードは評価されず、新しい ECMAScript オブジェクト(例えば Error オブジェクト)は生成されない。例えば WHATWG HTML 仕様 (https://html.spec.whatwg.org/) はスクリプト実行可能性の確認および entry の概念のために 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]] で示される agentrealm realm において、少なくとも milliseconds ミリ秒後に timeoutJob を実行するようスケジュールする。

HostEnqueueTimeoutJob の実装は 9.5 の要件に従わなければならない。

9.6 Agent

agent は一組の ECMAScript 実行コンテキスト、実行コンテキストスタック、実行中実行コンテキスト、Agent Record、および executing thread から構成される。executing thread を除き、agent の構成要素はその agent にのみ属する。

agentexecuting thread は他の agent と独立してその agent の実行コンテキスト上でアルゴリズムステップを実行する。ただし、[[CanBlock]] フィールドが true である Agent Record を持つ agent が共有していない限り、1 つの executing thread を複数の agent で共有してもよい。

Note 1

例えば一部の Web ブラウザでは、ブラウザウィンドウの複数の無関係なタブ間で単一の executing thread を共有する。

agentexecuting thread がアルゴリズムステップを実行している間、その agent はそれらのステップにとっての surrounding agent である。ステップは surrounding agent を用いて、agent 内に保持された仕様レベルの実行オブジェクト(実行中実行コンテキスト、実行コンテキストスタック、Agent Record のフィールド)へアクセスする。

agent signifierAgent を識別するために用いられるグローバル一意の不透明値である。

Table 27: Agent Record のフィールド (Agent Record Fields)
Field Name Value Meaning
[[LittleEndian]] a Boolean アルゴリズム GetValueFromBufferSetValueInBuffer で必要なときに isLittleEndian 引数の既定値として計算される値。選択は実装定義であり、実装にとって最も効率的な方を選ぶべき。この値が一度観測された後は変更できない。
[[CanBlock]] a Boolean その agent がブロック可能かどうかを決定する。
[[Signifier]] an agent signifier agent クラスタ内で agent を一意に識別する。
[[IsLockFree1]] a Boolean true の場合 1 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[IsLockFree2]] a Boolean true の場合 2 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[IsLockFree8]] a Boolean true の場合 8 byte 値 上のアトミック操作は lock-free、そうでなければ false
[[CandidateExecution]] a candidate execution Record メモリモデル参照。
[[KeptAlive]] a List of either Objects or Symbols 初期状態は空の新しい List。現在の Job の終了まで生存させるオブジェクトやシンボルのリスト。
[[ModuleAsyncEvaluationCount]] an integer 初期値 0。非同期または非同期依存を持つモジュールの [[AsyncEvaluationOrder]] フィールドに一意の増加値を割り当てるために用いられる。

[[Signifier]][[IsLockFree1]][[IsLockFree2]] の値は、一度クラスタ内のいずれかの agent により観測された後は変更できない。

Note 2

[[IsLockFree1]][[IsLockFree2]] の値は必ずしもハードウェアだけで決定されるわけではなく、時間経過や ECMAScript 実装間で異なりうる実装上の選択を反映することがある。

[[IsLockFree4]] フィールドは存在しない: 4 バイトのアトミック操作は常に lock-free である。

実際には、アトミック操作が何らかのロックを用いて実装されているなら、その操作は lock-free ではない。lock-free は wait-free を意味しない: lock-free なアトミック操作を完了するのに必要なマシンステップ数に上限はない。

サイズ n のアトミックアクセスが lock-free であることは、同サイズの非アトミックアクセスの(知覚される)アトミシティについて何も意味しない。具体的には、非アトミックアクセスは複数のメモリアクセス列として実行され得る。詳細は ReadSharedMemory および WriteSharedMemory を参照。

Note 3

agent は仕様上のメカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。

9.6.1 AgentSignifier ( )

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

  1. ARsurrounding agentAgent Record とする。
  2. AR.[[Signifier]] を返す。

9.6.2 AgentCanSuspend ( )

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

  1. ARsurrounding agentAgent Record とする。
  2. AR.[[CanBlock]] を返す。
Note

環境によっては、特定の agent をサスペンドすることが妥当でない場合がある。例えば Web ブラウザ環境では、ドキュメントのメインイベントハンドリングスレッドのサスペンドを禁止しつつ、worker のイベントハンドリングスレッドはサスペンドを許容することが妥当かもしれない。

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns an integer. It performs the following steps when called:

  1. ARsurrounding agentAgent Record とする。
  2. countAR.[[ModuleAsyncEvaluationCount]] とする。
  3. AR.[[ModuleAsyncEvaluationCount]]count + 1 に設定。
  4. count を返す。
Note

この値は保留中モジュール間の相対評価順を追跡するためだけに使用される。実装は、保留中モジュールが無いときは [[ModuleAsyncEvaluationCount]] を観測不能な形で 0 にリセットしてよい。

9.7 Agent Cluster

agent cluster とは、共有メモリ操作によって通信可能な agent の極大集合である。

Note 1

異なる agent 内のプログラムは未規定の手段によってメモリを共有しうる。最小でも SharedArrayBuffer の裏付けメモリはクラスタ内の agent 間で共有可能である。

メッセージパッシングで通信可能だがメモリを共有できない agent が存在するかもしれない。そのような agent は同じ agent cluster にはならない。

すべての agent は正確に 1 つの agent cluster に属する。

Note 2

クラスタ内の agent が特定時点で全て生存している必要はない。agent Aagent B を生成し、その後 A が終了し Bagent C を生成した場合、AB とメモリを共有し得て、BC とメモリを共有し得るなら、3 つの agent は同一クラスタである。

クラスタ内のすべての agent は、それぞれの Agent Record[[LittleEndian]] フィールドについて同じ値を持たなければならない。

Note 3

クラスタ内で異なる [[LittleEndian]] 値を持つ agent があると、マルチバイトデータに対し共有メモリを使うのが困難になる。

クラスタ内のすべての agent は、それぞれの Agent Record[[IsLockFree1]] フィールドについて同じ値を持たなければならない; [[IsLockFree2]] フィールドについても同様。

クラスタ内のすべての agent は、それぞれの Agent Record[[Signifier]] フィールドについて互いに異なる値を持たなければならない。

埋め込み環境 (embedding) は agent の知識や協力なしに agent を非アクティブ化(進行停止)またはアクティブ化(進行再開)してよい。埋め込み環境がそれを行う場合、クラスタ内で一部の agent を非アクティブ化したまま他を無期限にアクティブにしてはならない。

Note 4

上記制約の目的は、他の agent が非アクティブ化されたために agent がデッドロックまたはスターブする状況を避けることである。例えば、HTML shared worker がウィンドウ内ドキュメントと独立したライフタイムを持ち、その shared worker がそのような独立ドキュメントの dedicated worker とメモリ共有を許される場合、ドキュメントとその dedicated worker が dedicated worker がロックを保持した状態で非アクティブ化され(例えばドキュメントが履歴に保存される等)、shared worker がそのロック取得を試みた場合、shared worker は dedicated worker が再びアクティブ化されるまでブロックされる(場合によっては永久に)。その間、他ウィンドウから shared worker へアクセスしようとする他の worker はスターブする。

この制約の含意は、埋め込み環境内で同一のサスペンド/ウェイク集団に属さない agent 同士ではメモリ共有が不可能になるということである。

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

Note 5

その種の終了例: 別プロセスで動作する agent を OS またはユーザが終了させる; per-agent リソース計測が runaway と示したときに、他の agent と同一プロセスで動作する agent を埋め込み環境自身が終了させる、等。

以下の仕様値およびそれらから推移的に到達可能な値はそれぞれ正確に 1 つの agent cluster に属する。

クラスタ内の任意の agent が ECMAScript コードを評価する前に、クラスタ内すべての agentAgent Record[[CandidateExecution]] フィールドは初期 candidate execution に設定される。初期 candidate execution は空の candidate execution で、[[EventsRecords]] フィールドは各 agent について、その [[AgentSignifier]] フィールドがその agentagent signifier で、[[EventList]][[AgentSynchronizesWith]] フィールドが空の List である Agent Events Record を含む List である。

Note 6

agent cluster 内のすべての agentAgent Record[[CandidateExecution]] フィールド内で同じ candidate execution を共有する。candidate execution はメモリモデルで使用される仕様メカニズムである。

Note 7

agent cluster は仕様メカニズムであり、ECMAScript 実装の特定成果物に対応する必要はない。

9.8 Forward Progress

agentforward progress を行う (make forward progress) とは、本仕様に従って評価ステップを 1 つ実行することである。

agent の実行中実行コンテキストが外部イベントを同期的かつ無期限に待機すると、その agentblocked になる。この意味で blocked になり得るのは Agent Record[[CanBlock]] フィールドが trueagent のみである。unblocked agent とは blocked でない agent である。

実装は以下を保証しなければならない:

  • 専用 executing thread を持つ全ての unblocked agent は最終的に forward progress を行う
  • executing thread を共有する agent の集合では、いずれか 1 つの agent が最終的に forward progress を行う
  • agent はブロッキングを提供する明示的 API を通じて以外には、他の agent を blocked にしてはならない
Note

これは、メモリモデルの liveness 保証と共に、すべての seq-cst write が最終的に全 agent に観測されることを保証する。

9.9 WeakRef と FinalizationRegistry ターゲットの処理モデル (Processing Model of WeakRef and FinalizationRegistry Targets)

9.9.1 Objectives

本仕様は、任意のオブジェクトまたはシンボルがガーベジコレクトされることを保証しない。生存していないオブジェクトやシンボルは長時間後に解放されるか、全く解放されない可能性がある。このため、本仕様はガーベジコレクションによってトリガーされる挙動を記述する際に「may」という語を使用する。

WeakRef および FinalizationRegistry のセマンティクスは、特定の時点で発生する 2 つの操作に基づいている:

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

これら(ClearKeptObjectsCleanupFinalizationRegistry)のいずれの動作も同期 ECMAScript 実行を割り込まない。ホストはより長い同期 ECMAScript 実行を組み立てる可能性があるため、本仕様は ClearKeptObjects および CleanupFinalizationRegistry のスケジューリングをホスト環境に委ねる。

一部 ECMAScript 実装は、ECMAScript がアイドルである間も含め、バックグラウンドでガーベジコレクタを走らせる。ホスト環境CleanupFinalizationRegistry のスケジューリングを任せることで、ホストは最終化作業を行うために ECMAScript 実行を再開し、保持された値を解放して全体的なメモリ使用量を削減し得る。

9.9.2 Liveness

オブジェクトやシンボルの集合 S に対し、S に関して hypothetical WeakRef-oblivious な実行とは、参照先が S の要素である WeakRef抽象操作 WeakRefDeref が常に undefined を返すような実行である。

Note 1
WeakRef-obliviousness と liveness は 2 つの概念を捉える。(1) WeakRef 自体は参照対象を生存させない。(2) liveness に循環が存在しても値が生存であることを意味しない。具体的には v の liveness 判定が WeakRef 参照先 r の liveness 判定に依存する場合、r の liveness は v の liveness を仮定できず、そうすると循環的推論になる。
Note 2
WeakRef-obliviousness が個々の値ではなく値の集合に対して定義されるのは循環を考慮するためである。個々の値に対して定義すると、循環内の WeakRef 参照先は、その同一性が循環内の他の WeakRef 参照先を介してのみ観測されるにもかかわらず、生存と考えられてしまう。
Note 3
口語的には、個々のオブジェクトまたはシンボルは、それを含むすべての集合が live であれば live であると言う。

評価中の任意の時点で、オブジェクトやシンボルの集合 S は以下の条件のいずれかを満たす場合 live と見なされる:

  • S の任意の要素が任意の agent[[KeptAlive]] List に含まれている。
  • S に関して WeakRef-oblivious である有効な将来の仮想実行が存在し、その実行が S 内の任意の値の同一性を観測する。
Note 4
上記 2 番目の条件は、値の同一性が非 WeakRef 手段で観測可能であれば値は live であるという直感を捉える。値の同一性は厳密等価比較の観測や、値が Map のキーとして使用されることの観測によって観測され得る。
Note 5

値がフィールド、内部スロット、またはプロパティに存在するという事実は、その値が live であることを意味しない。例えば、その値がプログラムに返されることが一度も無いなら観測できない。

これは WeakMap のキー、WeakSet のメンバ、そして FinalizationRegistry Cell record の [[WeakRefTarget]] および [[UnregisterToken]] フィールドについても同様である。

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

Note 6
Liveness はエンジンが空にしてはならない WeakRef を保証するための下限である。ここで定義する Liveness は決定不能である。実際にはエンジンは到達可能性などの保守的近似を用いる。実装には大きな裁量が期待される。

9.9.3 Execution

任意の時点で、オブジェクトやシンボルの集合 Slive でない場合、ECMAScript 実装は以下のステップをアトミックに実行してもよい:

  1. S の各要素 value について
    1. ref.[[WeakRefTarget]]value である各 WeakRef ref について
      1. ref.[[WeakRefTarget]]empty に設定する。
    2. fg.[[Cells]]Record cell を含み、cell.[[WeakRefTarget]]value である各 FinalizationRegistry fg について
      1. cell.[[WeakRefTarget]]empty に設定する。
      2. 任意で HostEnqueueFinalizationRegistryCleanupJob(fg) を実行する。
    3. map.[[WeakMapData]]Record r を含み、r.[[Key]]value である各 WeakMap map について
      1. r.[[Key]]empty に設定する。
      2. r.[[Value]]empty に設定する。
    4. set.[[WeakSetData]]value を含む各 WeakSet set について
      1. 値が value の要素を、値が empty の要素に置き換える。
Note 1

Liveness の定義と合わせて、本節は実装が WeakRef に関して適用してよい最適化を規定する。

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

一方、オブジェクトの同一性が観測可能で、そのオブジェクトが WeakRef[[WeakRefTarget]] 内部スロットにある場合、WeakRef を観測可能に空にしてしまう再物質化 (rematerialization) などの最適化は禁じられる。

HostEnqueueFinalizationRegistryCleanupJob の呼び出しは任意であるため、FinalizationRegistry に登録されたオブジェクトがその FinalizationRegistry 自体を生存保持するとは限らない。実装は、FinalizationRegistry 自体が死んだ場合やアプリケーション終了中など、任意の理由で FinalizationRegistry コールバックを省略してよい。

Note 2

実装は、非 live オブジェクトやシンボルの極大集合に対して WeakRef を必ずしも空にする義務はない。

実装が WeakRef を空にするために非 live 集合 S を選ぶ場合、本定義は S 内のすべての値に対する WeakRef を同時に空にすることを要求する。言い換えると、値 v を指す WeakRef を空にしながら、v の値を観測しうる他の WeakRef を空にしないままにするのは非適合である。

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 を捕捉し、呼び出されたとき次のステップを実行する新しい Job Abstract Closure とする:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry)) とする。
  2. cleanupResultabrupt completion であるなら、エラー報告のためのホスト定義ステップを実行する。
  3. unused を返す。

HostEnqueueFinalizationRegistryCleanupJob の実装は、可能なら cleanupJob を将来時点で実行するようスケジュールする。また 9.5 の要件にも従わなければならない。

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 実装は同期的な ECMAScript 実行列が完了した際に 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. agentRecord.[[KeptAlive]]value を追加する。
  3. unused を返す。
Note
抽象操作 AddToKeptObjects が対象となるオブジェクトまたはシンボルを引数に呼び出されると、その対象は ClearKeptObjects が呼び出されるまで対象を強参照し続けるリストに追加される。

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. アサート: finalizationRegistry[[Cells]] および [[CleanupCallback]] 内部スロットを持つ。
  2. callbackfinalizationRegistry.[[CleanupCallback]] とする。
  3. finalizationRegistry.[[Cells]]Record cell を含み、かつ cell.[[WeakRefTarget]]empty であるものが存在する間、実装は以下のステップを(任意のタイミングで)実行してよい:
    1. そのような cell のいずれかを選ぶ。
    2. finalizationRegistry.[[Cells]] から cell を取り除く。
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») を実行する。
  4. unused を返す。

9.13 CanBeHeldWeakly ( v )

The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. v が弱参照として利用に適している場合に限り true を返す。弱参照として利用に適した値のみが WeakMap のキー、WeakSet の要素、WeakRef の target、あるいは FinalizationRegistry の targets の 1 つになれる。 It performs the following steps when called:

  1. v が Object であるなら true を返す。
  2. v が Symbol でかつ KeyForSymbol(v) が undefined であるなら true を返す。
  3. false を返す。
Note

言語同一性 (language identity) を持たない言語値は、事前の参照なしに生成し得るため弱参照としては不適切である。Symbol.for により生成された Symbol 値は他の Symbol と異なり言語同一性を持たず、弱参照として不適切である。Well-known symbols は収集されない可能性が高いが、数が限定され多様な実装手法で管理可能であるため、弱参照として利用に適したものとして扱われる。しかし、live な WeakMap 内で well-known symbol に関連付けられた任意の値は収集されにくく、実装においてメモリ資源を「リーク」させる可能性がある。