16 ECMAScript言語:スクリプトとモジュール

16.1 スクリプト

構文

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return]

16.1.1 Static Semantics: 早期エラー

Script : ScriptBody ScriptBody : StatementList

16.1.2 Static Semantics: ScriptIsStrict

The syntax-directed operation ScriptIsStrict takes no arguments and returns Boolean. It is defined piecewise over the following productions:

Script : ScriptBodyopt
  1. ScriptBody が存在し、かつその Directive PrologueUse Strict Directive が含まれている場合、true を返す。
  2. false を返す。

16.1.3 Runtime Semantics: Evaluation

Script : [empty]
  1. undefined を返す。

16.1.4 スクリプトレコード

スクリプトレコードは、評価されるスクリプトに関する情報をカプセル化する。各スクリプトレコードTable 34 に示されるフィールドを含む。

Table 34: スクリプトレコードのフィールド
フィールド名 値の型 意味
[[Realm]] Realm レコード このスクリプトが生成された Realm
[[ECMAScriptCode]] Script パースノード このスクリプトのソーステキストを解析した結果。
[[LoadedModules]] LoadedModuleRequest レコードのリスト このスクリプトによってインポートされた指定子文字列から解決済み Module Record へのマップ。このリストには ModuleRequestsEqual(r1, r2) が true となる異なるレコード r1r2 の組は含まれない。
[[HostDefined]] 任意(デフォルト値は empty ホスト環境がスクリプトに追加情報を関連付けるために予約されたフィールド。

16.1.5 ParseScript ( sourceText, realm, hostDefined )

The abstract operation ParseScript takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm レコード), and hostDefined (任意) and returns Script Record または空でない SyntaxError オブジェクトのリスト. sourceTextScript として解析した結果に基づいて Script Record を生成する。 It performs the following steps when called:

  1. scriptParseText(sourceText, Script) とする。
  2. script がエラーのリストである場合、それを返す。
  3. Script Record { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined } を返す。
Note

実装はスクリプトソーステキストを事前に解析し、ParseScript の評価前に Early Error 条件を検査してもよい。ただし、エラーの報告はこの仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで遅延されなければならない。

16.1.6 ScriptEvaluation ( scriptRecord )

The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record) and returns ECMAScript の値を含む通常完了または異常完了. It performs the following steps when called:

  1. globalEnvscriptRecord.[[Realm]].[[GlobalEnv]] とする。
  2. scriptContext を新しい ECMAScript コード実行コンテキストとする。
  3. scriptContext の Function を null に設定する。
  4. scriptContextRealmscriptRecord.[[Realm]] に設定する。
  5. scriptContext の ScriptOrModule を scriptRecord に設定する。
  6. scriptContext の VariableEnvironment を globalEnv に設定する。
  7. scriptContext の LexicalEnvironment を globalEnv に設定する。
  8. scriptContext の PrivateEnvironment を null に設定する。
  9. 実行中の実行コンテキストを一時停止する。
  10. scriptContext を実行コンテキストスタックにプッシュする;これが現在の実行コンテキストとなる。
  11. scriptscriptRecord.[[ECMAScriptCode]] とする。
  12. resultCompletion(GlobalDeclarationInstantiation(script, globalEnv)) とする。
  13. result が通常完了である場合、
    1. resultCompletion(scriptEvaluation) に設定する。
    2. result が通常完了であり、かつ result.[[Value]]empty の場合、
      1. resultNormalCompletion(undefined) に設定する。
  14. scriptContext を一時停止し、実行コンテキストスタックから削除する。
  15. Assert: 実行コンテキストスタックは空でない。
  16. スタックの最上位のコンテキストを再開し、それを現在の実行コンテキストとする。
  17. result を返す。

16.1.7 GlobalDeclarationInstantiation ( script, env )

The abstract operation GlobalDeclarationInstantiation takes arguments script (Script パースノード) and env (グローバル環境レコード) and returns 通常完了(unused)または throw 完了. script は実行コンテキストが確立される対象の Scriptenv はバインディングが作成されるグローバル環境である。

Note 1

スクリプト評価のための実行コンテキストが確立されるとき、宣言は現在のグローバル環境にインスタンス化される。コード内で宣言されたすべてのグローバルバインディングがインスタンス化される。

この操作は以下の手順を実行する:

  1. lexNamesscriptLexicallyDeclaredNames とする。
  2. varNamesscriptVarDeclaredNames とする。
  3. lexNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(env, name) が true である場合、SyntaxError 例外を投げる。
    2. hasRestrictedGlobal を ? HasRestrictedGlobalProperty(env, name) とする。
    3. NOTE: グローバル var および function 束縛(非 strict の direct eval によって導入されるものを除く)は構成不可であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobaltrue である場合、SyntaxError 例外を投げる。
  4. varNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(env, name) が true である場合、SyntaxError 例外を投げる。
  5. varDeclarationsscriptVarScopedDeclarations とする。
  6. functionsToInitialize を新しい空の List とする。
  7. declaredFunctionNames を新しい空の List とする。
  8. varDeclarations の各要素 varDecl について、List の逆順で、次を行う。
    1. varDeclVariableDeclarationForBinding、または BindingIdentifier のいずれでもない場合、
      1. Assert: varDeclFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. NOTE: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。
      3. fnvarDeclBoundNames の唯一の要素とする。
      4. declaredFunctionNamesfn を含まない場合、
        1. fnDefinable を ? CanDeclareGlobalFunction(env, fn) とする。
        2. fnDefinablefalse である場合、TypeError 例外を投げる。
        3. fndeclaredFunctionNames に追加する。
        4. varDeclfunctionsToInitialize の先頭要素として挿入する。
  9. declaredVarNames を新しい空の List とする。
  10. varDeclarations の各要素 varDecl について、次を行う。
    1. varDeclVariableDeclarationForBinding、または BindingIdentifier のいずれかである場合、
      1. varDeclBoundNames の各 String vn について、次を行う。
        1. declaredFunctionNamesvn を含まない場合、
          1. vnDefinable を ? CanDeclareGlobalVar(env, vn) とする。
          2. vnDefinablefalse である場合、TypeError 例外を投げる。
          3. declaredVarNamesvn を含まない場合、
            1. vndeclaredVarNames に追加する。
  11. NOTE: グローバルオブジェクトordinary object である場合、このアルゴリズムステップ以降に異常終了は発生しない。しかし、グローバルオブジェクトが Proxy exotic object である場合、以降の一部のステップで異常終了を引き起こす振る舞いを示すことがある。
  12. ホストがウェブブラウザであるか、または ブロックレベル Function Declaration の Web レガシー互換性意味論 をサポートする場合、
    1. strictscriptScriptIsStrict とする。
    2. strictfalse である場合、
      1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNameslist-concatenation とする。
      2. script Contains xtrue となるような任意の BlockCaseClause、または DefaultClause xStatementList に直接含まれる各 FunctionDeclaration f について、次を行う。
        1. funcNamefBindingIdentifierStringValue とする。
        2. FunctionDeclaration f を、funcNameBindingIdentifier として持つ VariableStatement に置き換えても script に Early Errors が一切発生しない場合、
          1. HasLexicalDeclaration(env, funcName) が false である場合、
            1. fnDefinable を ? CanDeclareGlobalVar(env, funcName) とする。
            2. fnDefinabletrue である場合、
              1. NOTE: funcName に対する var 束縛は、それが VarDeclaredName でも別の FunctionDeclaration の名前でもない場合にのみ、ここでインスタンス化される。
              2. declaredFunctionOrVarNamesfuncName を含まない場合、
                1. CreateGlobalVarBinding(env, funcName, false) を実行する。
                2. funcNamedeclaredFunctionOrVarNames に追加する。
              3. FunctionDeclaration f が評価されるとき、15.2.6 で与えられる FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。
                1. gEnv を実行中の実行コンテキストの VariableEnvironment とする。
                2. bEnv を実行中の実行コンテキストの LexicalEnvironment とする。
                3. fObj を ! bEnv.GetBindingValue(funcName, false) とする。
                4. gEnv.SetMutableBinding(funcName, fObj, false) を実行する。
                5. unused を返す。
  13. lexDeclarationsscriptLexicallyScopedDeclarations とする。
  14. privateEnvnull とする。
  15. lexDeclarations の各要素 lexDecl について、次を行う。
    1. NOTE: 字句的に宣言された名前はここでインスタンス化されるだけで、初期化はされない。
    2. lexDeclBoundNames の各要素 dn について、次を行う。
      1. lexDeclIsConstantDeclarationtrue である場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. そうでない場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
  16. functionsToInitialize の各 Parse Node f について、次を行う。
    1. fnfBoundNames の唯一の要素とする。
    2. fo を、引数 env および privateEnv での fInstantiateFunctionObject とする。
    3. CreateGlobalFunctionBinding(env, fn, fo, false) を実行する。
  17. declaredVarNames の各 String vn について、次を行う。
    1. CreateGlobalVarBinding(env, vn, false) を実行する。
  18. unused を返す。
Note 2

Early Error は let/const/class と var/function の衝突を防ぐが、複数 Script 間の衝突はここで検出される。

16.2 モジュール

構文

Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral

16.2.1 モジュールのセマンティクス

16.2.1.1 Static Semantics: 早期エラー

ModuleBody : ModuleItemList Note

ExportedNames の重複規則は、ModuleBody 内に複数の export default ExportDeclaration が存在すると Syntax Error になることを意味する。競合または重複する宣言に関する追加のエラー条件は、Module の評価前のモジュールリンク時に検査される。これらのエラーが検出された場合、Module は評価されない。

ModuleExportName : StringLiteral

16.2.1.2 Static Semantics: ImportedLocalNames ( importEntries )

The abstract operation ImportedLocalNames takes argument importEntries (ImportEntry レコードのリスト) and returns 文字列のリスト. importEntries によって定義されるすべてのローカル名バインディングのリストを生成する。 It performs the following steps when called:

  1. localNames を新しい空のリストとする。
  2. importEntries の各 ImportEntry レコード i について、
    1. i.[[LocalName]]localNames に追加する。
  3. localNames を返す。

16.2.1.3 ModuleRequest レコード

ModuleRequest レコードは、指定されたインポート属性を持つモジュールのインポート要求を表す。以下のフィールドで構成される:

Table 35: ModuleRequest レコードのフィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute レコードのリスト インポート属性

LoadedModuleRequest レコードは、モジュールのインポート要求とそれに対応する Module Record を合わせて表す。テーブル Table 35 で定義された同じフィールドに加え、[[Module]] を含む:

Table 36: LoadedModuleRequest レコードのフィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute レコードのリスト インポート属性
[[Module]] Module Record このモジュール要求に対応する読み込まれたモジュール

ImportAttribute レコードは以下のフィールドで構成される:

Table 37: ImportAttribute レコードのフィールド
フィールド名 値の型 意味
[[Key]] 文字列 属性キー
[[Value]] 文字列 属性値

16.2.1.3.1 ModuleRequestsEqual ( left, right )

The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest レコードまたは LoadedModuleRequest レコード) and right (ModuleRequest レコードまたは LoadedModuleRequest レコード) and returns Boolean. It performs the following steps when called:

  1. left.[[Specifier]]right.[[Specifier]] と異なる場合、false を返す。
  2. leftAttrsleft.[[Attributes]] とする。
  3. rightAttrsright.[[Attributes]] とする。
  4. leftAttrsCountleftAttrs の要素数とする。
  5. rightAttrsCountrightAttrs の要素数とする。
  6. leftAttrsCountrightAttrsCount の場合、false を返す。
  7. leftAttrs の各 ImportAttribute レコード l について、
    1. rightAttrsl.[[Key]]r.[[Key]] と等しく、かつ l.[[Value]]r.[[Value]] と等しい ImportAttribute レコード r が存在しない場合、false を返す。
  8. true を返す。

16.2.1.4 Static Semantics: ModuleRequests

The syntax-directed operation ModuleRequests takes no arguments and returns ModuleRequest レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のリストを返す。
ModuleItemList : ModuleItem
  1. ModuleItemModuleRequests を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. requestsModuleItemListModuleRequests とする。
  2. additionalRequestsModuleItemModuleRequests とする。
  3. additionalRequests の各 ModuleRequest レコード mr について、
    1. requestsModuleRequestsEqual(mr, mr2) が true となる ModuleRequest レコード mr2 が含まれていない場合、
      1. mrrequests に追加する。
  4. requests を返す。
ModuleItem : StatementListItem
  1. 新しい空のリストを返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClauseSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClauseSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifierSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifierSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClauseSV とする。
  2. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClauseSV とする。
  2. attributesWithClauseWithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest レコード { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 新しい空のリストを返す。

16.2.1.5 抽象モジュールレコード

モジュールレコードは、単一のモジュールのインポートおよびエクスポートの構造情報をカプセル化します。この情報は、接続されたモジュール群のインポートとエクスポートを連結するために使用されます。モジュールレコードには、モジュールを評価するときのみ使用される4つのフィールドが含まれます。

仕様上、モジュールレコード値はRecord仕様型の値であり、モジュールレコード自体が抽象クラスとして、抽象サブクラス・具象サブクラスの両方を持つ単純なオブジェクト指向の階層に存在すると考えることができます。本仕様は、Cyclic Module Recordという名前の抽象サブクラスと、その具象サブクラスであるSource Text Module Recordを定義します。他の仕様や実装は、独自のモジュール定義機構に対応する追加のモジュールレコードサブクラスを定義しても構いません。

Module Recordは、Table 38に示されるフィールドを定義します。すべてのモジュール定義サブクラスには、少なくともそれらのフィールドが含まれます。Module Recordはまた、Table 39に示される抽象メソッドリストも定義します。すべてのモジュール定義サブクラスは、これらの抽象メソッドに対する具象実装を提供しなければなりません。

Table 38: Module Record Fields
フィールド名 値の型 意味
[[Realm]] Realm Record このモジュールが作成されたRealm
[[Environment]] Module Environment Record または empty このモジュールのトップレベルバインディングを含むEnvironment Record。このフィールドは、モジュールがリンクされた時にセットされます。
[[Namespace]] オブジェクト または empty このモジュールのために作成された場合のモジュール名前空間オブジェクト(28.3)。
[[HostDefined]] 任意(デフォルト値は undefined モジュールに追加情報を関連付ける必要があるホスト環境用に予約されたフィールドです。
Table 39: Abstract Methods of Module Records
メソッド 目的 定義
LoadRequestedModules ( [ hostDefined ] )

The abstract method LoadRequestedModules takes optional argument hostDefined (anything) and returns Promise.

依存関係を再帰的に全てロードすることで、モジュールのリンキング準備を行います。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
GetExportedNames ( [ exportStarSet ] )

The abstract method GetExportedNames takes optional argument exportStarSet (Source Text Module Recordのリスト) and returns 文字列のリスト.

このモジュールから直接あるいは間接的にエクスポートされるすべての名前のリストを返します。

このメソッドを呼び出す前にLoadRequestedModulesが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
ResolveExport ( exportName [ , resolveSet ] )

The abstract method ResolveExport takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

このモジュールによってエクスポートされる名前のバインディングを返します。バインディングは ResolvedBinding Record の形式 { [[Module]]: Module Record, [[BindingName]]: 文字列 | namespace }で表されます。エクスポートがどのモジュールにも直接バインディングされていないモジュール名前空間オブジェクトの場合は[[BindingName]]namespaceに設定されます。名前が解決できない場合はnull、複数バインディングが見つかった場合はambiguousを返します。

この操作は特定のexportName, resolveSet組み合わせに対して常に同じ結果を返さなければなりません。

このメソッドを呼び出す前にLoadRequestedModulesが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:
Evaluate ( )

The abstract method Evaluate takes no arguments and returns Promise.

このモジュールおよびその依存の評価Promiseを返します。評価が正常に終了した場合、またはすでに正常評価済みの場合には解決され、評価エラーの場合またはすでに評価失敗している場合には拒否されます。Promiseが拒否されるとホストはPromise拒否を処理し、評価エラーを再スローすることが期待されます。このモジュールがCyclic Module Recordでない場合、返されたPromiseはすでにsettledされていなければなりません。

このメソッドを呼び出す前にLinkが正常終了している必要があります。

本仕様では以下の型に定義があります。ホストは追加型に独自定義を持たせてもよい:

16.2.1.5.1 EvaluateModuleSync ( module )

The abstract operation EvaluateModuleSync takes argument module (a Module Record) and returns either a normal completion containing unused or a throw completion. 呼び出し側が module の評価が既に確定した Promise を返すことを保証する場合、module を同期的に評価する。 It performs the following steps when called:

  1. Assert: module は Cyclic Module Record ではないこと。
  2. promisemodule.Evaluate() とする。
  3. Assert: promise.[[PromiseState]]fulfilled または rejected である。
  4. もし promise.[[PromiseState]]rejected ならば、
    1. promise.[[PromiseIsHandled]]false の場合、HostPromiseRejectionTracker(promise, "handle") を実行する。
    2. promise.[[PromiseIsHandled]]true に設定する。
    3. promise.[[PromiseResult]] をスローする。
  5. unused を返す。

16.2.1.6 循環モジュールレコード

循環モジュールレコードは、Cyclic Module Record 型のサブクラスである他のモジュールと依存関係の循環に参加できるモジュールに関する情報を表すために使用される。Cyclic Module Record 型のサブクラスでない Module Record は、Source Text Module Record と依存関係の循環に参加してはならない。

Table 38で定義されたフィールドに加えて、循環モジュールレコードTable 40に示された追加フィールドを持つ。

Table 40: 循環モジュールレコードの追加フィールド
フィールド名 値の型 意味
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, または evaluated 初期値は new。モジュールのライフサイクルの進行に応じて、unlinkedlinkinglinkedevaluating、場合によっては evaluating-asyncevaluated(この順序)へ遷移する。evaluating-async は、このモジュールが非同期依存の完了後に実行されるキューに入っているか、または [[HasTLA]] フィールドが true であり実行済みでトップレベル完了待ちであるモジュールであることを示す。
[[EvaluationError]] throw 完了 または empty 評価中に発生した例外を表す throw 完了。例外が発生していない場合、または [[Status]]evaluated でない場合は empty
[[DFSAncestorIndex]] 整数 または empty Link および Evaluate の間のみ使用される補助フィールド。[[Status]]linking または evaluating の場合、これはモジュールの深さ優先探索インデックス、または同じ強連結成分内の「より前」のモジュールのインデックスである。
[[RequestedModules]] ModuleRequest Record のリスト このモジュール内の import に関連付けられた ModuleRequest Record のリスト。リストはソーステキスト内での出現順である。
[[LoadedModules]] LoadedModuleRequest Record のリスト このレコードで表されるモジュールが、解決済み Module Record に対して相対的インポート属性とともにモジュールのインポートを要求するために使用した指定子文字列からのマップ。ModuleRequestsEqual(r1, r2) が true となる異なるレコード r1r2 を同時に含まない。
[[CycleRoot]] 循環モジュールレコード または empty 循環内で最初に訪問されたモジュール、すなわち強連結成分の DFS 祖先のルート。循環に含まれないモジュールの場合は、そのモジュール自身となる。Evaluate 完了後、モジュールの [[DFSAncestorIndex]] はその [[CycleRoot]] の深さ優先探索インデックスとなる。
[[HasTLA]] Boolean このモジュールが個別に非同期であるかどうか(例えば、トップレベル await を含む Source Text Module Record の場合)。非同期依存を持つことは、このフィールドが true であることを意味しない。このフィールドはモジュールの解析後に変更されてはならない。
[[AsyncEvaluationOrder]] unset, 整数, または done このフィールドは初期値が unset であり、完全に同期的なモジュールではそのまま維持される。自身が非同期であるか、または非同期依存を持つモジュールの場合、16.2.1.6.1.3.4 により保留中モジュールの実行順序を決定する整数に設定される。保留中モジュールが正常に実行されると、このフィールドは done に設定される。
[[TopLevelCapability]] PromiseCapability Record または empty このモジュールがある循環の [[CycleRoot]] であり、その循環内のいずれかのモジュールに対して Evaluate() が呼び出された場合、このフィールドにはその評価全体の PromiseCapability Record が含まれる。これは Evaluate() 抽象メソッドから返される Promise オブジェクトを確定するために使用される。このフィールドはそのモジュールの依存関係では empty のままであり、それらの依存関係のいずれかに対してトップレベルの Evaluate() が開始されない限り設定されない。
[[AsyncParentModules]] 循環モジュールレコードのリスト このモジュールまたは依存関係のいずれかが [[HasTLA]] true を持ち、実行が進行中である場合、トップレベル実行ジョブにおけるこのモジュールの親インポーターを追跡する。これらの親モジュールは、このモジュールの実行が正常に完了するまで実行を開始しない。
[[PendingAsyncDependencies]] 整数 または empty このモジュールが非同期依存を持つ場合、このモジュールの実行のために残っている非同期依存モジュールの数を追跡する。非同期依存を持つモジュールは、このフィールドが 0 になり、かつ実行エラーがないときに実行される。

Table 39で定義されたメソッドに加えて、循環モジュールレコードTable 41に示された追加メソッドを持つ:

Table 41: 循環モジュールレコードの追加抽象メソッド
メソッド 目的 定義
InitializeEnvironment ( )

The abstract method InitializeEnvironment takes no arguments and returns unused を含む通常完了 または throw 完了.

モジュールの Environment Record を初期化し、すべてのインポートバインディングの解決を含め、モジュールの実行コンテキストを生成する。
本仕様では以下の型で定義されている。ホストは独自の定義を持つ追加型を提供してもよい:
ExecuteModule ( [ capability ] )

The abstract method ExecuteModule takes optional argument capability (PromiseCapability Record) and returns unused を含む通常完了 または throw 完了.

モジュールのコードをその実行コンテキスト内で評価する。このモジュールの [[HasTLA]]true の場合、PromiseCapability Record が引数として渡され、このメソッドは与えられた capability を解決または拒否することが期待される。この場合、このメソッドは例外を投げてはならず、必要に応じて PromiseCapability Record を拒否する必要がある。
本仕様では以下の型で定義されている。ホストは独自の定義を持つ追加型を提供してもよい:

GraphLoadingState レコードは、モジュールグラフのロード処理に関する情報を含むレコードである。これは HostLoadImportedModule 呼び出し後のロード継続に使用される。各 GraphLoadingState レコードTable 42で定義されたフィールドを持つ:

Table 42: GraphLoadingState レコードのフィールド
フィールド名 値の型 意味
[[PromiseCapability]] PromiseCapability Record ロード処理完了時に解決される Promise。
[[IsLoading]] Boolean ロード処理がまだ完了していない場合(成功でもエラーでもない場合)に true。
[[PendingModulesCount]] 0以上の整数 保留中の HostLoadImportedModule 呼び出し数を追跡する。
[[Visited]] 循環モジュールレコードのリスト 現在のロード処理で既にロードされた循環モジュールレコードのリストであり、循環依存による無限ループを回避するために使用される。
[[HostDefined]] 任意(デフォルト値は empty LoadRequestedModules の呼び出し元から HostLoadImportedModule へ渡されるホスト定義データを含む。

16.2.1.6.1 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義された、対応するモジュールレコード抽象メソッドを実装する循環モジュールレコードの具象メソッドである。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Cyclic Module Record module takes optional argument hostDefined (anything) and returns Promise. これは module の依存関係グラフ内にあるすべてのモジュールレコード[[LoadedModules]] を設定する(作業の大部分は補助関数 InnerModuleLoading によって行われる)。HostLoadImportedModule フックに渡される、省略可能な hostDefined パラメータを受け取る。 It performs the following steps when called:

  1. hostDefined が存在しない場合、hostDefinedempty に設定する。
  2. pc を ! NewPromiseCapability(%Promise%) とする。
  3. stateGraphLoadingState レコード { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: pc, [[HostDefined]]: hostDefined } とする。
  4. InnerModuleLoading(state, module) を実行する。
  5. pc.[[Promise]] を返す。
Note
hostDefined パラメータは、インポートされたモジュールを取得するために必要な追加情報を渡すために使用できる。例えば HTML では、<link rel="preload" as="..."> タグに対して正しい fetch destination を設定するために使用される。 import() 式は hostDefined パラメータを決して設定しない。

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

The abstract operation InnerModuleLoading takes arguments state (GraphLoadingState レコード) and module (モジュールレコード) and returns unused. これは LoadRequestedModules によって使用され、module の依存関係グラフについて実際の読み込み処理を再帰的に実行する。 It performs the following steps when called:

  1. Assert: state.[[IsLoading]]true である。
  2. module循環モジュールレコードであり、module.[[Status]]new であり、かつ state.[[Visited]]module を含まない場合、
    1. modulestate.[[Visited]] に追加する。
    2. requestedModulesCountmodule.[[RequestedModules]] 内の要素数とする。
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCount に設定する。
    4. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
      1. AllImportAttributesSupported(request.[[Attributes]]) が false である場合、
        1. errorThrowCompletion(新しく作成された SyntaxError オブジェクト) とする。
        2. ContinueModuleLoading(state, error) を実行する。
      2. そうでなく、module.[[LoadedModules]] が、ModuleRequestsEqual(record, request) が true であるような LoadedModuleRequest レコード record を含む場合、
        1. InnerModuleLoading(state, record.[[Module]]) を実行する。
      3. それ以外の場合、
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state) を実行する。
        2. NOTE: HostLoadImportedModuleFinishLoadingImportedModule を呼び出し、これは ContinueModuleLoading を通じてグラフ読み込み処理に再入する。
      4. state.[[IsLoading]]false である場合、unused を返す。
  3. Assert: state.[[PendingModulesCount]] ≥ 1。
  4. state.[[PendingModulesCount]]state.[[PendingModulesCount]] - 1 に設定する。
  5. state.[[PendingModulesCount]] = 0 である場合、
    1. state.[[IsLoading]]false に設定する。
    2. state.[[Visited]] の各循環モジュールレコード loaded について、次を行う。
      1. loaded.[[Status]]new である場合、loaded.[[Status]]unlinked に設定する。
    3. Call(state.[[PromiseCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  6. unused を返す。

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

The abstract operation ContinueModuleLoading takes arguments state (GraphLoadingState レコード) and moduleCompletion (モジュールレコードを含む正常完了、または throw 完了) and returns unused. これは HostLoadImportedModule の呼び出し後に読み込み処理へ再入するために使用される。 It performs the following steps when called:

  1. state.[[IsLoading]]false である場合、unused を返す。
  2. moduleCompletion が正常完了である場合、
    1. InnerModuleLoading(state, moduleCompletion.[[Value]]) を実行する。
  3. それ以外の場合、
    1. state.[[IsLoading]]false に設定する。
    2. Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] ») を実行する。
  4. unused を返す。

16.2.1.6.1.2 Link ( )

The Link concrete method of a Cyclic Module Record module takes no arguments and returns unused を含む正常完了、または throw 完了. 成功した場合、Link はこのモジュールの [[Status]]unlinked から linked へ遷移させる。失敗した場合、例外が投げられ、このモジュールの [[Status]]unlinked のままである。(作業の大部分は補助関数 InnerModuleLinking によって行われる。) It performs the following steps when called:

  1. Assert: module.[[Status]]unlinkedlinkedevaluating-async、または evaluated のいずれかである。
  2. stack を新しい空の List とする。
  3. resultCompletion(InnerModuleLinking(module, stack, 0)) とする。
  4. result が中途完了である場合、
    1. stack の各循環モジュールレコード m について、次を行う。
      1. Assert: m.[[Status]]linking である。
      2. m.[[Status]]unlinked に設定する。
    2. Assert: module.[[Status]]unlinked である。
    3. result を返す。
  5. Assert: module.[[Status]]linkedevaluating-async、または evaluated のいずれかである。
  6. Assert: stack は空である。
  7. unused を返す。

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

The abstract operation InnerModuleLinking takes arguments module (モジュールレコード), stack (循環モジュールレコードList), and index (非負整数) and returns 非負整数を含む正常完了、または throw 完了. これは Link によって使用され、module に対する実際のリンク処理、および依存関係グラフ内の他のすべてのモジュールに対する再帰的な処理を実行する。stack および index パラメータ、ならびにモジュールの [[DFSAncestorIndex]] フィールドは、深さ優先探索(DFS)の走査を追跡する。特に、[[DFSAncestorIndex]] は強連結成分(SCC)を発見するために使用され、SCC 内のすべてのモジュールが一緒に linked へ遷移するようにする。 It performs the following steps when called:

  1. module循環モジュールレコードでない場合、
    1. module.Link() を実行する。
    2. index を返す。
  2. module.[[Status]]linkinglinkedevaluating-async、または evaluated のいずれかである場合、
    1. index を返す。
  3. Assert: module.[[Status]]unlinked である。
  4. module.[[Status]]linking に設定する。
  5. moduleIndexindex とする。
  6. module.[[DFSAncestorIndex]]index に設定する。
  7. indexindex + 1 に設定する。
  8. modulestack に追加する。
  9. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleLinking(requiredModule, stack, index) に設定する。
    3. requiredModule循環モジュールレコードである場合、
      1. Assert: requiredModule.[[Status]]linkinglinkedevaluating-async、または evaluated のいずれかである。
      2. Assert: requiredModule.[[Status]]linking であることと、stackrequiredModule を含むことは同値である。
      3. requiredModule.[[Status]]linking である場合、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
  10. module.InitializeEnvironment() を実行する。
  11. Assert: modulestack 内にちょうど 1 回出現する。
  12. Assert: module.[[DFSAncestorIndex]]moduleIndex
  13. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. donefalse とする。
    2. donefalse である間、繰り返す。
      1. requiredModulestack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. Assert: requiredModule循環モジュールレコードである。
      4. requiredModule.[[Status]]linked に設定する。
      5. requiredModulemodule が同じモジュールレコードである場合、donetrue に設定する。
  14. index を返す。

16.2.1.6.1.3 Evaluate ( )

The Evaluate concrete method of a Cyclic Module Record module takes no arguments and returns Promise. Evaluate はこのモジュールの [[Status]]linked から evaluating-async または evaluated へ遷移させる。与えられた強連結成分内のモジュールに対して初めて呼び出されたとき、Evaluate は、モジュールの評価が完了したときに解決される Promise を作成して返す。この Promise は、その成分の [[CycleRoot]][[TopLevelCapability]] フィールドに格納される。その成分内の任意のモジュールに対する将来の Evaluate の呼び出しは、同じ Promise を返す。(作業の大部分は補助関数 InnerModuleEvaluation によって行われる。) It performs the following steps when called:

  1. Assert: この Evaluate の呼び出しは、周囲のエージェント内で別の Evaluate の呼び出しと同時に発生していない。
  2. Assert: module.[[Status]]linkedevaluating-async、または evaluated のいずれかである。
  3. module.[[Status]]evaluating-async または evaluated のいずれかである場合、
    1. module.[[CycleRoot]]empty でない場合、
      1. modulemodule.[[CycleRoot]] に設定する。
    2. それ以外の場合、
      1. Assert: module.[[Status]]evaluated であり、module.[[EvaluationError]] は throw 完了である。
  4. module.[[TopLevelCapability]]empty でない場合、
    1. module.[[TopLevelCapability]].[[Promise]] を返す。
  5. stack を新しい空の List とする。
  6. capability を ! NewPromiseCapability(%Promise%) とする。
  7. module.[[TopLevelCapability]]capability に設定する。
  8. resultCompletion(InnerModuleEvaluation(module, stack, 0)) とする。
  9. result が中途完了である場合、
    1. stack の各循環モジュールレコード m について、次を行う。
      1. Assert: m.[[Status]]evaluating である。
      2. m.[[Status]]evaluated に設定する。
      3. m.[[EvaluationError]]result に設定する。
    2. Assert: module.[[Status]]evaluated である。
    3. Assert: module.[[EvaluationError]]result は同じ Completion レコードである。
    4. Call(capability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
  10. それ以外の場合、
    1. Assert: module.[[Status]]evaluating-async または evaluated のいずれかである。
    2. Assert: module.[[EvaluationError]]empty である。
    3. module.[[Status]]evaluated である場合、
      1. Assert: module.[[AsyncEvaluationOrder]]unset または done のいずれかである。
      2. NOTE: module.[[AsyncEvaluationOrder]]done であることと、module がすでに評価済みであり、その評価が非同期であったことは同値である。
      3. Call(capability.[[Resolve]], undefined, « undefined ») を実行する。
    4. Assert: stack は空である。
  11. capability.[[Promise]] を返す。

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

The abstract operation InnerModuleEvaluation takes arguments module (モジュールレコード), stack (循環モジュールレコードList), and index (非負整数) and returns 非負整数を含む正常完了、または throw 完了. これは Evaluate によって使用され、module に対する実際の評価処理、および依存関係グラフ内の他のすべてのモジュールに対する再帰的な処理を実行する。stack および index パラメータ、ならびに module[[DFSAncestorIndex]] フィールドは、InnerModuleLinking と同じ方法で使用される。 It performs the following steps when called:

  1. module循環モジュールレコードでない場合、
    1. EvaluateModuleSync(module) を実行する。
    2. index を返す。
  2. module.[[Status]]evaluating-async または evaluated のいずれかである場合、
    1. module.[[EvaluationError]]empty である場合、index を返す。
    2. module.[[EvaluationError]] を返す。
  3. module.[[Status]]evaluating である場合、index を返す。
  4. Assert: module.[[Status]]linked である。
  5. module.[[Status]]evaluating に設定する。
  6. moduleIndexindex とする。
  7. module.[[DFSAncestorIndex]]index に設定する。
  8. module.[[PendingAsyncDependencies]] を 0 に設定する。
  9. indexindex + 1 に設定する。
  10. modulestack に追加する。
  11. module.[[RequestedModules]] の各 ModuleRequest レコード request について、次を行う。
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleEvaluation(requiredModule, stack, index) に設定する。
    3. requiredModule循環モジュールレコードである場合、
      1. Assert: requiredModule.[[Status]]evaluatingevaluating-async、または evaluated のいずれかである。
      2. Assert: requiredModule.[[Status]]evaluating であることと、stackrequiredModule を含むことは同値である。
      3. requiredModule.[[Status]]evaluating である場合、
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
      4. それ以外の場合、
        1. requiredModulerequiredModule.[[CycleRoot]] に設定する。
        2. Assert: requiredModule.[[Status]]evaluating-async または evaluated のいずれかである。
        3. requiredModule.[[EvaluationError]]empty でない場合、? requiredModule.[[EvaluationError]] を返す。
      5. requiredModule.[[AsyncEvaluationOrder]] が整数である場合、
        1. module.[[PendingAsyncDependencies]]module.[[PendingAsyncDependencies]] + 1 に設定する。
        2. modulerequiredModule.[[AsyncParentModules]] に追加する。
  12. module.[[PendingAsyncDependencies]] > 0 または module.[[HasTLA]]true である場合、
    1. Assert: module.[[AsyncEvaluationOrder]]unset である。
    2. module.[[AsyncEvaluationOrder]]IncrementModuleAsyncEvaluationCount() に設定する。
    3. module.[[PendingAsyncDependencies]] = 0 である場合、ExecuteAsyncModule(module) を実行する。
  13. それ以外の場合、
    1. module.ExecuteModule() を実行する。
  14. Assert: modulestack 内にちょうど 1 回出現する。
  15. Assert: module.[[DFSAncestorIndex]]moduleIndex
  16. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. donefalse とする。
    2. donefalse である間、繰り返す。
      1. requiredModulestack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. Assert: requiredModule循環モジュールレコードである。
      4. Assert: requiredModule.[[AsyncEvaluationOrder]] は整数または unset のいずれかである。
      5. requiredModule.[[AsyncEvaluationOrder]]unset である場合、requiredModule.[[Status]]evaluated に設定する。
      6. それ以外の場合、requiredModule.[[Status]]evaluating-async に設定する。
      7. requiredModulemodule が同じモジュールレコードである場合、donetrue に設定する。
      8. requiredModule.[[CycleRoot]]module に設定する。
  17. index を返す。
Note 1

モジュールは、InnerModuleEvaluation によって走査されている間は evaluating である。モジュールは、実行完了時に evaluated となるか、またはその [[HasTLA]] フィールドが true である場合、もしくは非同期依存関係を持つ場合、実行中に evaluating-async となる。

Note 2

非同期サイクルのモジュールに依存している任意のモジュールは、そのサイクルが evaluating でないときには、代わりに [[CycleRoot]] を通じてサイクルのルートの実行に依存する。これにより、サイクル状態をそのルートモジュール状態を通じて単一の強連結成分として扱えることが保証される。

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

The abstract operation ExecuteAsyncModule takes argument module (循環モジュールレコード) and returns unused. It performs the following steps when called:

  1. Assert: module.[[Status]]evaluating または evaluating-async のいずれかである。
  2. Assert: module.[[HasTLA]]true である。
  3. capability を ! NewPromiseCapability(%Promise%) とする。
  4. fulfilledClosure を、パラメータを持たず、module をキャプチャし、呼び出されたときに次の手順を実行する新しい抽象クロージャとする。
    1. AsyncModuleExecutionFulfilled(module) を実行する。
    2. NormalCompletion(undefined) を返す。
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
  6. rejectedClosure を、パラメータ (error) を持ち、module をキャプチャし、呼び出されたときに次の手順を実行する新しい抽象クロージャとする。
    1. AsyncModuleExecutionRejected(module, error) を実行する。
    2. NormalCompletion(undefined) を返す。
  7. onRejectedCreateBuiltinFunction(rejectedClosure, 0, "", « ») とする。
  8. PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected) を実行する。
  9. module.ExecuteModule(capability) を実行する。
  10. unused を返す。

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

The abstract operation GatherAvailableAncestors takes arguments module (循環モジュールレコード) and execList (循環モジュールレコードList) and returns unused. It performs the following steps when called:

  1. module.[[AsyncParentModules]] の各循環モジュールレコード m について、次を行う。
    1. execListm を含まず、かつ m.[[CycleRoot]].[[EvaluationError]]empty である場合、
      1. Assert: m.[[Status]]evaluating-async である。
      2. Assert: m.[[EvaluationError]]empty である。
      3. Assert: m.[[AsyncEvaluationOrder]] は整数である。
      4. Assert: m.[[PendingAsyncDependencies]] > 0。
      5. m.[[PendingAsyncDependencies]]m.[[PendingAsyncDependencies]] - 1 に設定する。
      6. m.[[PendingAsyncDependencies]] = 0 である場合、
        1. mexecList に追加する。
        2. m.[[HasTLA]]false である場合、GatherAvailableAncestors(m, execList) を実行する。
  2. unused を返す。
Note

ルート module に対する非同期実行が fulfilled されたとき、この関数は、この完了時に同期的に一緒に実行できるモジュールのリストを決定し、それらを execList に設定する。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

The abstract operation AsyncModuleExecutionFulfilled takes argument module (循環モジュールレコード) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluated である場合、
    1. Assert: module.[[EvaluationError]]empty でない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async である。
  3. Assert: module.[[AsyncEvaluationOrder]] は整数である。
  4. Assert: module.[[EvaluationError]]empty である。
  5. module.[[AsyncEvaluationOrder]]done に設定する。
  6. module.[[Status]]evaluated に設定する。
  7. module.[[TopLevelCapability]]empty でない場合、
    1. Assert: module.[[CycleRoot]]module は同じモジュールレコードである。
    2. Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  8. execList を新しい空の List とする。
  9. GatherAvailableAncestors(module, execList) を実行する。
  10. Assert: execList のすべての要素は、その [[AsyncEvaluationOrder]] フィールドが整数に設定され、[[PendingAsyncDependencies]] フィールドが 0 に設定され、[[EvaluationError]] フィールドが empty に設定されている。
  11. sortedExecList を、execList の要素を [[AsyncEvaluationOrder]] フィールドの昇順でソートした要素からなる List とする。
  12. sortedExecList の各循環モジュールレコード m について、次を行う。
    1. m.[[Status]]evaluated である場合、
      1. Assert: m.[[EvaluationError]]empty でない。
    2. そうでなく、m.[[HasTLA]]true である場合、
      1. ExecuteAsyncModule(m) を実行する。
    3. それ以外の場合、
      1. resultCompletion(m.ExecuteModule()) とする。
      2. result が中途完了である場合、
        1. AsyncModuleExecutionRejected(m, result.[[Value]]) を実行する。
      3. それ以外の場合、
        1. m.[[AsyncEvaluationOrder]]done に設定する。
        2. m.[[Status]]evaluated に設定する。
        3. m.[[TopLevelCapability]]empty でない場合、
          1. Assert: m.[[CycleRoot]]m は同じモジュールレコードである。
          2. Call(m.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  13. unused を返す。

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

The abstract operation AsyncModuleExecutionRejected takes arguments module (循環モジュールレコード) and error (ECMAScript 言語値) and returns unused. It performs the following steps when called:

  1. module.[[Status]]evaluated である場合、
    1. Assert: module.[[EvaluationError]]empty でない。
    2. unused を返す。
  2. Assert: module.[[Status]]evaluating-async である。
  3. Assert: module.[[AsyncEvaluationOrder]] は整数である。
  4. Assert: module.[[EvaluationError]]empty である。
  5. module.[[EvaluationError]]ThrowCompletion(error) に設定する。
  6. module.[[Status]]evaluated に設定する。
  7. module.[[AsyncEvaluationOrder]]done に設定する。
  8. NOTE: module.[[AsyncEvaluationOrder]]AsyncModuleExecutionFulfilled との対称性のために done に設定される。InnerModuleEvaluation では、モジュールの [[AsyncEvaluationOrder]] 内部スロットの値は、その [[EvaluationError]] 内部スロットが empty でない場合には使用されない。
  9. module.[[TopLevelCapability]]empty でない場合、
    1. Assert: module.[[CycleRoot]]module は同じモジュールレコードである。
    2. Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error ») を実行する。
  10. module.[[AsyncParentModules]] の各循環モジュールレコード m について、次を行う。
    1. AsyncModuleExecutionRejected(m, error) を実行する。
  11. unused を返す。

16.2.1.6.2 循環モジュールレコードグラフの例

この非規範的な節では、いくつかの一般的なモジュールグラフのリンクおよび評価について、特にエラーがどのように発生し得るかに焦点を当てて、一連の例を示す。

まず、次の単純なモジュールグラフを考える。

Figure 2: 単純なモジュールグラフ
モジュール A がモジュール B に依存し、モジュール B がモジュール C に依存するモジュールグラフ

まずエラー条件がないと仮定する。ホストが最初に A.LoadRequestedModules() を呼び出すと、仮定によりこれは成功して完了し、B および C の依存関係(それぞれ C となし)も再帰的に読み込み、その後 A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked に設定する。次に、ホストが A.Link() を呼び出すと、これも仮定により成功して完了し、A.[[Status]] = B.[[Status]] = C.[[Status]] = linked となる。これらの準備手順は任意の時点で実行できる。後で、ホストがモジュールのあり得る副作用を引き受ける準備ができたとき、A.Evaluate() を呼び出すことができ、これは成功して完了し、undefined に解決される Promise を返し(これも仮定による)、最初に C、次に B を再帰的に評価している。この時点で各モジュールの [[Status]]evaluated になる。

次に、A.LoadRequestedModules() の呼び出しが成功した後のリンクエラーを含む場合を考える。CInnerModuleLinking が成功したが、その後、例えば BC の提供しないものをインポートするために B で失敗した場合、元の A.Link() は失敗し、AB[[Status]]unlinked のままである。ただし、C[[Status]]linked になっている。

最後に、Link() の呼び出しが成功した後の評価エラーを含む場合を考える。CInnerModuleEvaluation が成功したが、その後、例えば B が例外を投げるコードを含むために B で失敗した場合、元の A.Evaluate() は失敗し、拒否された Promise を返す。結果として生じる例外は AB[[EvaluationError]] フィールドの両方に記録され、それらの [[Status]]evaluated になる。Cevaluated になるが、A および B とは対照的に、評価を正常に完了したため [[EvaluationError]] はないままである。例外を格納することで、ホストが A または B をそれらの Evaluate() メソッドを呼び出して再利用しようとするたびに、同じ例外に遭遇することが保証される。(ホストは循環モジュールレコードを再利用することを要求されない。同様に、ホストはこれらのメソッドによって投げられた例外オブジェクトを公開することを要求されない。しかし、この仕様はそのような使用を可能にしている。)

次に、別の種類のエラー条件を考える。

Figure 3: 解決不能なモジュールを持つモジュールグラフ
モジュール A が欠落した(解決不能な)モジュールに依存しており、それが ??? で表されているモジュールグラフ

このシナリオでは、モジュール A は他のあるモジュールへの依存関係を宣言しているが、そのモジュールのモジュールレコードは存在しない。すなわち、HostLoadImportedModule はそれを要求されたとき、例外とともに FinishLoadingImportedModule を呼び出す。これは、対応するリソースが存在しない、またはリソースは存在するが結果のソーステキストを解析しようとしたときに ParseModule が何らかのエラーを返す、などさまざまな理由で起こり得る。ホストは、FinishLoadingImportedModule に渡す完了を通じて失敗の原因を公開することを選択できる。いずれの場合でも、この例外は読み込み失敗を引き起こし、その結果 A[[Status]]new のままとなる。

ここでの読み込み、リンク、評価エラーの違いは、次の特性による。

  • 評価は副作用を引き起こし得るため、一度だけ実行されなければならない。したがって、たとえ失敗したとしても、評価がすでに実行されたかどうかを記憶することが重要である。(エラーの場合、例外も記憶するのが理にかなっている。そうしなければ、後続の Evaluate() 呼び出しが新しい例外を合成しなければならなくなるためである。)
  • 一方、リンクには副作用がないため、失敗しても、後の時点で問題なく再試行できる。
  • 読み込みはホストと密接に相互作用するため、ホストによっては、失敗した読み込みをユーザーが再試行できるようにすることが望ましい場合がある(例えば、一時的に悪いネットワーク状態によって失敗が引き起こされた場合)。

次に、サイクルを持つモジュールグラフを考える。

Figure 4: 循環モジュールグラフ
モジュール A がモジュール B および C に依存するが、モジュール B もモジュール A に依存するモジュールグラフ

ここではエントリポイントがモジュール A であると仮定するため、ホストは A.LoadRequestedModules() を呼び出して進み、これは A に対して InnerModuleLoading を実行する。これはさらに B および C に対して InnerModuleLoading を呼び出す。サイクルのため、これにより再び A に対して InnerModuleLoading が起動されるが、この時点では A の依存関係の読み込みはこの LoadRequestedModules 処理中にすでに起動されているため、これは no-op である。グラフ内のすべてのモジュールが正常に読み込まれると、それらの [[Status]] は同時に new から unlinked へ遷移する。

次にホストは A.Link() を呼び出して進み、これは A に対して InnerModuleLinking を実行する。これはさらに B に対して InnerModuleLinking を呼び出す。サイクルのため、これにより再び A に対して InnerModuleLinking が起動されるが、この時点では A.[[Status]] がすでに linking であるため、これは no-op である。制御が A に戻り、InnerModuleLinkingC に対して起動されるとき、B.[[Status]] 自体は linking のままである。これが C.[[Status]]linked で返った後、AB は一緒に linking から linked へ遷移する。これは設計によるものであり、それらが強連結成分を形成しているためである。この段階ではモジュールグラフが深さ優先探索で走査されるため、同じ SCC 内のモジュールの状態を同時に遷移させることが可能である。

循環モジュールグラフの評価段階についても、成功の場合には同様の話が成り立つ。

ここで、A にリンクエラーがある場合を考える。例えば、C に存在しない束縛をインポートしようとする場合である。その場合、A に対する InnerModuleLinking の 2 回目の呼び出しからの早期 return を含め、上記の手順は依然として発生する。しかし、元の A に対する InnerModuleLinking まで巻き戻ると、InitializeEnvironment 中、すなわち C.ResolveExport() の直後に失敗する。投げられた SyntaxError 例外は A.Link まで伝播し、現在その stack 上にあるすべてのモジュール(これらは常にまだ linking であるモジュールに正確に一致する)をリセットする。したがって、AB はともに unlinked になる。Clinked のまま残されることに注意。

あるいは、A に評価エラーがある場合を考える。例えば、そのソースコードが例外を投げる場合である。その場合、上記の手順の評価時の類似物は、A に対する InnerModuleEvaluation の 2 回目の呼び出しからの早期 return を含め、依然として発生する。しかし、元の A に対する InnerModuleEvaluation まで巻き戻ると、仮定により失敗する。投げられた例外は A.Evaluate() まで伝播し、現在その stack 上にあるすべてのモジュール(すなわち、まだ evaluating であるモジュール)に加え、[[AsyncParentModules]] を介してもエラーを記録する。[[AsyncParentModules]] は、top-level await を含む、またはそれに依存するモジュールについて、AsyncModuleExecutionRejected アルゴリズムを通じて依存関係グラフ全体にわたる連鎖を形成する。したがって、AB はともに evaluated となり、例外は AB[[EvaluationError]] フィールドの両方に記録される一方、C[[EvaluationError]] なしで evaluated のまま残される。

最後に、すべてのモジュールが非同期に完了する、サイクルを持つモジュールグラフを考える。

Figure 5: 非同期循環モジュールグラフ
モジュール A がモジュール B および C に依存し、モジュール B がモジュール D に依存し、モジュール C がモジュール D および E に依存し、モジュール D がモジュール A に依存するモジュールグラフ

読み込みおよびリンクは以前と同様に発生し、すべてのモジュールは [[Status]]linked に設定された状態になる。

A.Evaluate() を呼び出すと、AB、および D に対して InnerModuleEvaluation が呼び出され、これらはすべて evaluating へ遷移する。次に A に対して再び InnerModuleEvaluation が呼び出されるが、すでに evaluating であるためこれは no-op である。この時点で D.[[PendingAsyncDependencies]] は 0 であるため、ExecuteAsyncModule(D) が呼び出され、D の非同期実行を追跡する新しい PromiseCapability とともに D.ExecuteModule を呼び出す。B に対する InnerModuleEvaluation へ巻き戻り、B.[[PendingAsyncDependencies]] を 1 に、B.[[AsyncEvaluationOrder]] を 1 に設定する。元の A に対する InnerModuleEvaluation へ巻き戻り、A.[[PendingAsyncDependencies]] を 1 に設定する。A の依存関係をたどるループの次の反復で、C に対して、そしてそれによって D(再び no-op)および E に対して InnerModuleEvaluation を呼び出す。E は依存関係を持たず、サイクルの一部でもないため、D と同じ方法で ExecuteAsyncModule(E) を呼び出し、E は直ちにスタックから削除される。さらに C に対する InnerModuleEvaluation へ巻き戻り、C.[[AsyncEvaluationOrder]] を 3 に設定する。ここで A の依存関係をたどるループを終了し、A.[[AsyncEvaluationOrder]] を 4 に設定し、強連結成分全体をスタックから削除して、すべてのモジュールを一度に evaluating-async へ遷移させる。この時点で、モジュールのフィールドは Table 43 に示すとおりである。

Table 43: 初回 Evaluate() 呼び出し後のモジュールフィールド
フィールド
モジュール
A B C D E
[[DFSAncestorIndex]] 0 0 0 0 4
[[Status]] evaluating-async evaluating-async evaluating-async evaluating-async evaluating-async
[[AsyncEvaluationOrder]] 4 1 3 0 2
[[AsyncParentModules]] « » « A » « A » « B, C » « C »
[[PendingAsyncDependencies]] 2(B および C 1(D 2(D および E 0 0

E が最初に実行を完了すると仮定する。それが起こると、AsyncModuleExecutionFulfilled が呼び出され、E.[[Status]]evaluated に設定され、C.[[PendingAsyncDependencies]] は 1 になるよう減算される。更新されたモジュールのフィールドは Table 44 に示すとおりである。

Table 44: モジュール E の実行完了後のモジュールフィールド
フィールド
モジュール
C E
[[DFSAncestorIndex]] 0 4
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 3 done
[[AsyncParentModules]] « A » « C »
[[PendingAsyncDependencies]] 1(D 0

次に D が完了する(まだ実行中だった唯一のモジュールであったため)。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、D.[[Status]]evaluated に設定される。実行可能なその祖先は B(その [[AsyncEvaluationOrder]] は 1)および C(その [[AsyncEvaluationOrder]] は 3)であるため、B が先に処理される。すなわち、B.[[PendingAsyncDependencies]] は 0 になるよう減算され、ExecuteAsyncModuleB に対して呼び出され、実行を開始する。C.[[PendingAsyncDependencies]] も 0 になるよう減算され、C が実行を開始する(Bawait を含む場合、B と並行する可能性がある)。更新されたモジュールのフィールドは Table 45 に示すとおりである。

Table 45: モジュール D の実行完了後のモジュールフィールド
フィールド
モジュール
B C D
[[DFSAncestorIndex]] 0 0 0
[[Status]] evaluating-async evaluating-async evaluated
[[AsyncEvaluationOrder]] 1 3 done
[[AsyncParentModules]] « A » « A » « B, C »
[[PendingAsyncDependencies]] 0 0 0

次に C が実行を完了すると仮定する。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、C.[[Status]]evaluated に設定され、A.[[PendingAsyncDependencies]] は 1 になるよう減算される。更新されたモジュールのフィールドは Table 46 に示すとおりである。

Table 46: モジュール C の実行完了後のモジュールフィールド
フィールド
モジュール
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1(B 0

その後、B が実行を完了する。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、B.[[Status]]evaluated に設定される。A.[[PendingAsyncDependencies]] は 0 になるよう減算されるため、ExecuteAsyncModule が呼び出され、実行を開始する。更新されたモジュールのフィールドは Table 47 に示すとおりである。

Table 47: モジュール B の実行完了後のモジュールフィールド
フィールド
モジュール
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0

最後に、A が実行を完了する。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、A.[[Status]]evaluated に設定される。この時点で、A.[[TopLevelCapability]] 内の Promise(A.Evaluate() から返されたもの)は解決され、これでこのモジュールグラフの処理は終了する。更新されたモジュールのフィールドは Table 48 に示すとおりである。

Table 48: モジュール A の実行完了後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

あるいは、B が実行を完了する前に C が実行に失敗してエラーを返す失敗の場合を考える。それが起こると、AsyncModuleExecutionRejected が呼び出され、C.[[Status]]evaluated に設定し、C.[[EvaluationError]] をそのエラーに設定する。その後、各 AsyncParentModules に対して AsyncModuleExecutionRejected を実行することで、このエラーをすべての AsyncParentModules に伝播する。更新されたモジュールのフィールドは Table 49 に示すとおりである。

Table 49: モジュール C がエラーで完了した後のモジュールフィールド
フィールド
モジュール
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1(B 0
[[EvaluationError]] empty C の評価エラー

CC のエラーで A に対して AsyncModuleExecutionRejected を呼び出すため、AC と同じエラーで拒否される。A.[[Status]]evaluated に設定される。この時点で、A.[[TopLevelCapability]] 内の Promise(A.Evaluate() から返されたもの)は拒否される。更新されたモジュールのフィールドは Table 50 に示すとおりである。

Table 50: モジュール A が拒否された後のモジュールフィールド
フィールド
モジュール
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C の評価エラー

その後、B はエラーなしで実行を完了する。それが起こると、AsyncModuleExecutionFulfilled が再び呼び出され、B.[[Status]]evaluated に設定される。GatherAvailableAncestorsB に対して呼び出される。しかし、A.[[CycleRoot]]A であり、評価エラーを持つため、返される sortedExecList には追加されず、AsyncModuleExecutionFulfilled は追加処理なしで返る。B の将来のインポーターは、サイクルルート A に設定された C からの評価エラーによる B.[[CycleRoot]].[[EvaluationError]] の拒否を解決する。更新されたモジュールのフィールドは Table 51 に示すとおりである。

Table 51: エラー中のグラフでモジュール B の実行完了後のモジュールフィールド
フィールド
モジュール
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C の評価エラー empty

16.2.1.7 ソーステキストモジュールレコード

ソーステキストモジュールレコードは、目標記号 Module を用いて解析された ECMAScript ソーステキスト11)から定義されたモジュールに関する情報を表すために使用される。そのフィールドは、そのモジュールによってインポートおよびエクスポートされる名前に関する要約情報を含み、その具象メソッドはこれらの要約情報を使用してモジュールをリンクおよび評価する。

ソーステキストモジュールレコードは、抽象モジュールレコード型の他のサブクラスとともにモジュールグラフ内に存在でき、循環モジュールレコード型の他のサブクラスとともにサイクルに参加できる。

Table 40で定義されるフィールドに加えて、ソーステキストモジュールレコードTable 52に列挙される追加フィールドを持つ。これらの各フィールドは、ParseModule で初期設定される。

Table 52: ソーステキストモジュールレコードの追加フィールド
フィールド名 値の型 意味
[[ECMAScriptCode]] Parse Node 目標記号として Module を用いて、このモジュールのソーステキストを解析した結果。
[[Context]] ECMAScript コード実行コンテキストまたは empty このモジュールに関連付けられた実行コンテキスト。モジュールの環境が初期化されるまでは empty である。
[[ImportMeta]] Object または empty import.meta メタプロパティを通じて公開されるオブジェクト。ECMAScript コードからアクセスされるまでは empty である。
[[ImportEntries]] ImportEntry レコードList このモジュールのコードから導出された ImportEntry レコードList
[[LocalExportEntries]] ExportEntry レコードList モジュール内で出現する宣言に対応する、このモジュールのコードから導出された ExportEntry レコードList
[[IndirectExportEntries]] ExportEntry レコードList モジュール内で出現する再エクスポートされたインポート、または export * as namespace 宣言からのエクスポートに対応する、このモジュールのコードから導出された ExportEntry レコードList
[[StarExportEntries]] ExportEntry レコードList モジュール内で出現する export * 宣言に対応する、このモジュールのコードから導出された ExportEntry レコードList。ただし export * as namespace 宣言は含まない。

ImportEntry レコードは、単一の宣言的インポートに関する情報を要約するレコードである。各 ImportEntry レコードは、Table 53で定義されるフィールドを持つ。

Table 53: ImportEntry レコードフィールド
フィールド名 値の型 意味
[[ModuleRequest]] ModuleRequest レコード ImportDeclarationModuleSpecifier およびインポート属性を表す ModuleRequest レコード
[[ImportName]] String または namespace [[ModuleRequest]] によって識別されるモジュールによって、目的の束縛がエクスポートされている名前。値 namespace は、インポート要求が対象モジュールの名前空間オブジェクトに対するものであることを示す。
[[LocalName]] String インポートするモジュール内で、インポートされた値にローカルにアクセスするために使用される名前。
Note 1

Table 54は、構文上のインポート形式を表すために使用される ImportEntry レコードフィールドの例を示す。

Table 54 (Informative): インポート形式から ImportEntry レコードへの対応
インポート文形式 [[ModuleRequest]] [[ImportName]] [[LocalName]]
import v from "mod"; "mod" "default" "v"
import * as ns from "mod"; "mod" namespace "ns"
import {x} from "mod"; "mod" "x" "x"
import {x as v} from "mod"; "mod" "x" "v"
import "mod"; ImportEntry レコードは作成されない。

ExportEntry レコードは、単一の宣言的エクスポートに関する情報を要約するレコードである。各 ExportEntry レコードは、Table 55で定義されるフィールドを持つ。

Table 55: ExportEntry レコードフィールド
フィールド名 値の型 意味
[[ExportName]] String または null このモジュールによってこの束縛をエクスポートするために使用される名前。
[[ModuleRequest]] ModuleRequest レコードまたは null ExportDeclarationModuleSpecifier およびインポート属性を表す ModuleRequest レコードExportDeclarationModuleSpecifier を持たない場合は null
[[ImportName]] String、nullnamespace、または all-but-default [[ModuleRequest]] によって識別されるモジュールによって、目的の束縛がエクスポートされている名前。ExportDeclarationModuleSpecifier を持たない場合は nullnamespaceexport * as ns from "mod" 宣言に使用される。all-but-defaultexport * from "mod" 宣言に使用される。
[[LocalName]] String または null インポートするモジュール内で、エクスポートされた値にローカルにアクセスするために使用される名前。エクスポートされた値がモジュール内からローカルにアクセス可能でない場合は null
Note 2

Table 56は、構文上のエクスポート形式を表すために使用される ExportEntry レコードフィールドの例を示す。

Table 56 (Informative): エクスポート形式から ExportEntry レコードへの対応
エクスポート文形式 [[ExportName]] [[ModuleRequest]] [[ImportName]] [[LocalName]]
export var v; "v" null null "v"
export default function f() {} "default" null null "f"
export default function () {} "default" null null "*default*"
export default 42; "default" null null "*default*"
export {x}; "x" null null "x"
export {v as x}; "x" null null "v"
export {x} from "mod"; "x" "mod" "x" null
export {v as x} from "mod"; "x" "mod" "v" null
export * from "mod"; null "mod" all-but-default null
export * as ns from "mod"; "ns" "mod" namespace null

以下の定義は、ソーステキストモジュールレコードに必要な具象メソッドおよびその他の抽象操作を規定する。

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

The abstract operation ParseModule takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm レコード), and hostDefined (anything) and returns ソーステキストモジュールレコード、または SyntaxError オブジェクトの空でない List. これは sourceTextModule として解析した結果に基づいて、ソーステキストモジュールレコードを作成する。 It performs the following steps when called:

  1. bodyParseText(sourceText, Module) とする。
  2. body がエラーの List である場合、body を返す。
  3. requestedModulesbodyModuleRequests とする。
  4. importEntriesbodyImportEntries とする。
  5. importedBoundNamesImportedLocalNames(importEntries) とする。
  6. indirectExportEntries を新しい空の List とする。
  7. localExportEntries を新しい空の List とする。
  8. starExportEntries を新しい空の List とする。
  9. exportEntriesbodyExportEntries とする。
  10. exportEntries の各 ExportEntry レコード ee について、次を行う。
    1. ee.[[ModuleRequest]]null である場合、
      1. importedBoundNamesee.[[LocalName]] を含まない場合、
        1. eelocalExportEntries に追加する。
      2. それ以外の場合、
        1. NOTE: もともと別のモジュールからインポートされた束縛または名前空間オブジェクトをエクスポートする場合、ExportEntry レコードは、その束縛または名前空間オブジェクトがインポートされてからエクスポートされたのではなく、元のモジュールから直接再エクスポートされた場合に持つであろう形式に一致するように書き換えられる。これにより、export * from を通じて同じ束縛または名前空間を同じ名前で二重にエクスポートすることから生じる競合は、ソーステキストモジュールレコードの ResolveExport 具象メソッドのステップ 9.e.iii で曖昧として扱われるのではなく、無視できるようになる。
        2. ie を、[[LocalName]]ee.[[LocalName]] である importEntries の要素とする。
        3. ExportEntry レコード { [[ModuleRequest]]: ie.[[ModuleRequest]], [[ImportName]]: ie.[[ImportName]], [[LocalName]]: null, [[ExportName]]: ee.[[ExportName]] } を indirectExportEntries に追加する。
    2. そうでなく、ee.[[ImportName]]all-but-default である場合、
      1. Assert: ee.[[ExportName]]null である。
      2. eestarExportEntries に追加する。
    3. それ以外の場合、
      1. eeindirectExportEntries に追加する。
  11. asyncbody Contains await とする。
  12. Source Text Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[CycleRoot]]: empty, [[HasTLA]]: async, [[AsyncEvaluationOrder]]: unset, [[TopLevelCapability]]: empty, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]: empty, [[Status]]: new, [[EvaluationError]]: empty, [[HostDefined]]: hostDefined, [[ECMAScriptCode]]: body, [[Context]]: empty, [[ImportMeta]]: empty, [[RequestedModules]]: requestedModules, [[LoadedModules]]: « », [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[IndirectExportEntries]]: indirectExportEntries, [[StarExportEntries]]: starExportEntries, [[DFSAncestorIndex]]: empty } を返す。
Note

実装は、そのモジュールソーステキストに対する ParseModule の評価より前に、モジュールソーステキストを解析し、早期エラー条件について解析してもよい。ただし、いかなるエラーの報告も、この仕様が実際にそのソーステキストに対して ParseModule を実行する時点まで延期されなければならない。

16.2.1.7.2 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義される対応するモジュールレコード抽象メソッドを実装する、ソーステキストモジュールレコードの具象メソッドである。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Source Text Module Record module takes optional argument exportStarSet (ソーステキストモジュールレコードList) and returns String の List. It performs the following steps when called:

  1. Assert: module.[[Status]]new ではない。
  2. exportStarSet が存在しない場合、exportStarSet を新しい空の List に設定する。
  3. exportStarSetmodule を含む場合、
    1. Assert: export * 循環の開始点に到達している。
    2. 新しい空の List を返す。
  4. moduleexportStarSet に追加する。
  5. exportedNames を新しい空の List とする。
  6. module.[[LocalExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: module はこのエクスポートの直接束縛を提供する。
    2. Assert: e.[[ExportName]]null ではない。
    3. e.[[ExportName]]exportedNames に追加する。
  7. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: module はこのエクスポートのために特定の束縛をインポートする。
    2. Assert: e.[[ExportName]]null ではない。
    3. e.[[ExportName]]exportedNames に追加する。
  8. module.[[StarExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ModuleRequest]]null ではない。
    2. requestedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
    3. starNamesrequestedModule.GetExportedNames(exportStarSet) とする。
    4. starNames の各要素 n について、次を行う。
      1. n"default" でない場合、
        1. exportedNamesn を含まない場合、
          1. nexportedNames に追加する。
  9. exportedNames を返す。
Note

GetExportedNames は、曖昧なスターエクスポート束縛を持つ名前を除外したり、例外を投げたりしない。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Source Text Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous.

ResolveExport は、インポートされた束縛を、実際の定義モジュールおよびローカル束縛名に解決しようとする。定義モジュールは、このメソッドが呼び出されたモジュールレコードによって表されるモジュールである場合も、そのモジュールによってインポートされる他のモジュールである場合もある。パラメータ resolveSet は、未解決の循環インポート/エクスポート経路を検出するために使用される。特定のモジュールレコードexportName からなる組で、すでに resolveSet 内にあるものに到達した場合、インポート循環が発生している。ResolveExport を再帰的に呼び出す前に、moduleexportName からなる組が resolveSet に追加される。

定義モジュールが見つかった場合、ResolvedBinding レコード { [[Module]], [[BindingName]] } が返される。このレコードは、もともと要求されたエクスポートの解決済み束縛を識別する。ただし、これがローカル束縛を持たない名前空間のエクスポートである場合を除く。この場合、[[BindingName]]namespace に設定される。定義が見つからなかった場合、または要求が循環していることが判明した場合は、null が返される。要求が曖昧であることが判明した場合は、ambiguous が返される。

It performs the following steps when called:

  1. Assert: module.[[Status]]new ではない。
  2. resolveSet が存在しない場合、resolveSet を新しい空の List に設定する。
  3. resolveSet の各 Record { [[Module]], [[ExportName]] } r について、次を行う。
    1. moduler.[[Module]] が同じモジュールレコードであり、かつ exportNamer.[[ExportName]] である場合、
      1. Assert: これは循環インポート要求である。
      2. null を返す。
  4. Record { [[Module]]: module, [[ExportName]]: exportName } を resolveSet に追加する。
  5. module.[[LocalExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. e.[[ExportName]]exportName である場合、
      1. Assert: module はこのエクスポートの直接束縛を提供する。
      2. ResolvedBinding レコード { [[Module]]: module, [[BindingName]]: e.[[LocalName]] } を返す。
  6. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. e.[[ExportName]]exportName である場合、
      1. Assert: e.[[ModuleRequest]]null ではない。
      2. importedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
      3. e.[[ImportName]]namespace である場合、
        1. Assert: module はこのエクスポートの直接束縛を提供しない。
        2. ResolvedBinding レコード { [[Module]]: importedModule, [[BindingName]]: namespace } を返す。
      4. Assert: module はこのエクスポートのために特定の束縛をインポートする。
      5. Assert: e.[[ImportName]] は String である。
      6. importedModule.ResolveExport(e.[[ImportName]], resolveSet) を返す。
  7. exportName"default" である場合、
    1. Assert: default エクスポートはこのモジュールによって明示的には定義されていなかった。
    2. null を返す。
    3. NOTE: default エクスポートは export * from "mod" 宣言によって提供されることはできない。
  8. starResolutionnull とする。
  9. module.[[StarExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ModuleRequest]]null ではない。
    2. importedModuleGetImportedModule(module, e.[[ModuleRequest]]) とする。
    3. resolutionimportedModule.ResolveExport(exportName, resolveSet) とする。
    4. resolutionambiguous である場合、ambiguous を返す。
    5. resolutionnull でない場合、
      1. Assert: resolution は ResolvedBinding レコードである。
      2. starResolutionnull である場合、
        1. starResolutionresolution に設定する。
      3. それ以外の場合、
        1. Assert: 要求された名前を含む * エクスポートが複数存在する。
        2. resolution.[[Module]]starResolution.[[Module]] が同じモジュールレコードでない場合、ambiguous を返す。
        3. resolution.[[BindingName]]starResolution.[[BindingName]] でない場合、ambiguous を返す。
  10. starResolution を返す。

16.2.1.7.3 循環モジュールレコード抽象メソッドの実装

以下は、Table 41で定義される対応する循環モジュールレコード抽象メソッドを実装する、ソーステキストモジュールレコードの具象メソッドである。

16.2.1.7.3.1 InitializeEnvironment ( )

The InitializeEnvironment concrete method of a Source Text Module Record module takes no arguments and returns unused を含む正常完了、または throw 完了. It performs the following steps when called:

  1. module.[[IndirectExportEntries]] の各 ExportEntry レコード e について、次を行う。
    1. Assert: e.[[ExportName]]null ではない。
    2. resolutionmodule.ResolveExport(e.[[ExportName]]) とする。
    3. resolutionnull または ambiguous のいずれかである場合、SyntaxError 例外を投げる。
    4. Assert: resolution は ResolvedBinding レコードである。
  2. Assert: module からのすべての名前付きエクスポートは解決可能である。
  3. realmmodule.[[Realm]] とする。
  4. Assert: realmundefined ではない。
  5. envNewModuleEnvironment(realm.[[GlobalEnv]]) とする。
  6. module.[[Environment]]env に設定する。
  7. module.[[ImportEntries]] の各 ImportEntry レコード in について、次を行う。
    1. importedModuleGetImportedModule(module, in.[[ModuleRequest]]) とする。
    2. in.[[ImportName]]namespace である場合、
      1. namespaceGetModuleNamespace(importedModule) とする。
      2. env.CreateImmutableBinding(in.[[LocalName]], true) を実行する。
      3. env.InitializeBinding(in.[[LocalName]], namespace) を実行する。
    3. それ以外の場合、
      1. Assert: in.[[ImportName]] は String である。
      2. resolutionimportedModule.ResolveExport(in.[[ImportName]]) とする。
      3. resolutionnull または ambiguous のいずれかである場合、SyntaxError 例外を投げる。
      4. resolution.[[BindingName]]namespace である場合、
        1. namespaceGetModuleNamespace(resolution.[[Module]]) とする。
        2. env.CreateImmutableBinding(in.[[LocalName]], true) を実行する。
        3. env.InitializeBinding(in.[[LocalName]], namespace) を実行する。
      5. それ以外の場合、
        1. CreateImportBinding(env, in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]]) を実行する。
  8. moduleContext を新しい ECMAScript コード実行コンテキストとする。
  9. moduleContext の Function を null に設定する。
  10. Assert: module.[[Realm]]undefined ではない。
  11. moduleContextRealmmodule.[[Realm]] に設定する。
  12. moduleContext の ScriptOrModule を module に設定する。
  13. moduleContext の VariableEnvironment を module.[[Environment]] に設定する。
  14. moduleContext の LexicalEnvironment を module.[[Environment]] に設定する。
  15. moduleContext の PrivateEnvironment を null に設定する。
  16. module.[[Context]]moduleContext に設定する。
  17. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
  18. codemodule.[[ECMAScriptCode]] とする。
  19. varDeclarationscodeVarScopedDeclarations とする。
  20. declaredVarNames を新しい空の List とする。
  21. varDeclarations の各要素 d について、次を行う。
    1. dBoundNames の各要素 dn について、次を行う。
      1. declaredVarNamesdn を含まない場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
        2. env.InitializeBinding(dn, undefined) を実行する。
        3. dndeclaredVarNames に追加する。
  22. lexDeclarationscodeLexicallyScopedDeclarations とする。
  23. privateEnvnull とする。
  24. lexDeclarations の各要素 d について、次を行う。
    1. dBoundNames の各要素 dn について、次を行う。
      1. dIsConstantDeclarationtrue である場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. それ以外の場合、
        1. env.CreateMutableBinding(dn, false) を実行する。
      3. dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである場合、
        1. fo を、引数 env および privateEnv を伴う dInstantiateFunctionObject とする。
        2. env.InitializeBinding(dn, fo) を実行する。
  25. 実行コンテキストスタックから moduleContext を削除する。
  26. unused を返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

The ExecuteModule concrete method of a Source Text Module Record module takes optional argument capability (PromiseCapability レコード) and returns unused を含む正常完了、または throw 完了. It performs the following steps when called:

  1. Assert: module はリンク済みであり、そのモジュール環境内の宣言はインスタンス化済みである。
  2. moduleContextmodule.[[Context]] とする。
  3. module.[[HasTLA]]false である場合、
    1. Assert: capability は存在しない。
    2. 実行中の実行コンテキストを中断する。
    3. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
    4. resultCompletion(module.[[ECMAScriptCode]]Evaluation) とする。
    5. moduleContext を中断し、実行コンテキストスタックから削除する。
    6. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。
    7. result が中途完了である場合、
      1. result を返す。
  4. それ以外の場合、
    1. Assert: capability は PromiseCapability レコードである。
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行する。
  5. unused を返す。

16.2.1.8 合成モジュールレコード

合成モジュールレコードは、仕様によって定義されたモジュールに関する情報を表すために使用される。そのエクスポート名は作成時に静的に定義されるが、それに対応する値は SetSyntheticModuleExport を用いて時間の経過とともに変更できる。インポートや依存関係は持たない。

Note
合成モジュールレコードは、さまざまな種類のモジュールを定義するために使用できる。例えば、JSON モジュールや CSS モジュールなどである。

Table 38で定義されるフィールドに加えて、合成モジュールレコードはTable 57に列挙される追加フィールドを持つ。

Table 57: 合成モジュールレコードの追加フィールド
フィールド名 値の型 意味
[[ExportNames]] String の List このモジュールのエクスポート名。このリストには重複は含まれない。
[[EvaluationSteps]] 抽象クロージャ モジュール評価時に実行される初期化ロジックであり、唯一の引数として合成モジュールレコードを受け取る。[[ExportNames]] を変更してはならない。中途完了を返すことがある。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 言語値) and returns 合成モジュールレコード. デフォルトエクスポートが defaultExport である合成モジュールレコードを作成する。 It performs the following steps when called:

  1. realm を現在の Realm レコードとする。
  2. setDefaultExport を、引数 (module) を取り defaultExport をキャプチャする新しい抽象クロージャとし、呼び出されたときに以下を実行する:
    1. SetSyntheticModuleExport(module, "default", defaultExport) を実行する。
    2. NormalCompletion(unused) を返す。
  3. 合成モジュールレコード { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport } を返す。

16.2.1.8.2 ParseJSONModule ( source )

The abstract operation ParseJSONModule takes argument source (String) and returns 合成モジュールレコードを含む正常完了、または throw 完了. It performs the following steps when called:

  1. parseResult を ? ParseJSON(source) とする。
  2. CreateDefaultExportSyntheticModule(parseResult.[[Value]]) を返す。

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

The abstract operation SetSyntheticModuleExport takes arguments module (合成モジュールレコード), exportName (String), and exportValue (ECMAScript 言語値) and returns unused. 合成モジュールレコードの既存のエクスポートに対して、エクスポート値を設定または変更するために使用できる。 It performs the following steps when called:

  1. Assert: module.[[ExportNames]]exportName を含む。
  2. envRecmodule.[[Environment]] とする。
  3. Assert: envRecempty ではない。
  4. envRec.SetMutableBinding(exportName, exportValue, true) を実行する。
  5. unused を返す。

16.2.1.8.4 モジュールレコード抽象メソッドの実装

以下は、Table 39で定義される対応するモジュールレコード抽象メソッドを実装する、合成モジュールレコードの具象メソッドである。

16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of a Synthetic Module Record module takes optional argument hostDefined (anything) and returns Promise. It performs the following steps when called:

  1. NOTE: この LoadRequestedModules の実装は hostDefined を使用しない。
  2. PromiseResolve(%Promise%, undefined) を返す。
Note
合成モジュールレコードは依存関係を持たない。

16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of a Synthetic Module Record module takes optional argument exportStarSet (ソーステキストモジュールレコードList) and returns String の List. It performs the following steps when called:

  1. NOTE: この GetExportedNames の実装は exportStarSet を使用しない。
  2. module.[[ExportNames]] を返す。

16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of a Synthetic Module Record module takes argument exportName (a String) and optional argument resolveSet (a List of Records with fields [[Module]] (a Module Record) and [[ExportName]] (a String)) and returns a ResolvedBinding Record, null, or ambiguous. It performs the following steps when called:

  1. NOTE: この ResolveExport の実装は resolveSet を使用しない。
  2. module.[[ExportNames]]exportName を含まない場合、null を返す。
  3. ResolvedBinding レコード { [[Module]]: module, [[BindingName]]: exportName } を返す。

16.2.1.8.4.4 Link ( )

The Link concrete method of a Synthetic Module Record module takes no arguments and returns unused を含む正常完了. It performs the following steps when called:

  1. realmmodule.[[Realm]] とする。
  2. envNewModuleEnvironment(realm.[[GlobalEnv]]) とする。
  3. module.[[Environment]]env に設定する。
  4. module.[[ExportNames]] の各 String exportName について、次を行う。
    1. env.CreateMutableBinding(exportName, false) を実行する。
    2. env.InitializeBinding(exportName, undefined) を実行する。
  5. NormalCompletion(unused) を返す。

16.2.1.8.4.5 Evaluate ( )

The Evaluate concrete method of a Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:

  1. moduleContext を新しい ECMAScript コード実行コンテキストとする。
  2. moduleContext の Function を null に設定する。
  3. moduleContextRealmmodule.[[Realm]] に設定する。
  4. moduleContext の ScriptOrModule を module に設定する。
  5. moduleContext の VariableEnvironment を module.[[Environment]] に設定する。
  6. moduleContext の LexicalEnvironment を module.[[Environment]] に設定する。
  7. 実行中の実行コンテキストを中断する。
  8. moduleContext を実行コンテキストスタックにプッシュする。moduleContext は現在の実行中の実行コンテキストである。
  9. stepsmodule.[[EvaluationSteps]] とする。
  10. resultCompletion(steps(module)) とする。
  11. moduleContext を中断し、実行コンテキストスタックから削除する。
  12. 実行コンテキストスタックの最上位にあるコンテキストを実行中の実行コンテキストとして再開する。
  13. pc を ! NewPromiseCapability(%Promise%) とする。
  14. IfAbruptRejectPromise(result, pc)。
  15. Call(pc.[[Resolve]], undefined, « undefined ») を実行する。
  16. pc.[[Promise]] を返す。

16.2.1.9 GetImportedModule ( referrer, request )

The abstract operation GetImportedModule takes arguments referrer (循環モジュールレコード) and request (ModuleRequest レコード) and returns モジュールレコード. It performs the following steps when called:

  1. records を、referrer.[[LoadedModules]] の各 LoadedModuleRequest レコード r のうち ModuleRequestsEqual(r, request) が true であるものからなる List とする。
  2. Assert: この抽象操作を呼び出す前に referrer に対して LoadRequestedModules が正常に完了しているため、records はちょうど 1 要素を持つ。
  3. recordrecords の唯一の要素とする。
  4. record.[[Module]] を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

The host-defined abstract operation HostLoadImportedModule takes arguments referrer (スクリプトレコード循環モジュールレコード、または Realm レコード), moduleRequest (ModuleRequest レコード), hostDefined (anything), and payload (GraphLoadingState レコードまたは PromiseCapability レコード) and returns unused.

Note 1

referrerRealm レコードとなり得る例として、Web ブラウザホストがある。例えば、ユーザーが以下のようなコントロールをクリックした場合:

<button type="button" onclick="import('./foo.mjs')">Click me</button>

import() 式が実行される時点では、アクティブなスクリプトやモジュールは存在しない。より一般的には、これはホストが ScriptOrModule コンポーネントが null の実行コンテキストを実行コンテキストスタックにプッシュする状況で発生し得る。

HostLoadImportedModule の実装は、以下の要件に従わなければならない:

  • ホスト環境は FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行しなければならない。ここで result は、ロードされたモジュールレコードを含む正常完了、または throw 完了のいずれかであり、同期または非同期で行われ得る。
  • この操作が、次の条件を満たす 2 つの (referrer, moduleRequest) の組に対して複数回呼び出される場合:

    • 最初の referrer が 2 番目の referrer と同一である;
    • ModuleRequestsEqual(最初の moduleRequest, 2 番目の moduleRequest) が true である;

    そして FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行し、result が正常完了である場合、毎回同じ result を用いて FinishLoadingImportedModule を実行しなければならない。

  • moduleRequest.[[Attributes]] において、entry.[[Key]]"type" かつ entry.[[Value]]"json" であるエントリ entry が存在する場合、ホスト環境が FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行する際、resultParseJSONModule の呼び出しによって返された Completion Record、または throw 完了のいずれかでなければならない。

  • この操作は、payload を不透明な値として扱い、そのまま FinishLoadingImportedModule に渡さなければならない。

実際に行われる処理はホスト定義であるが、通常は適切なモジュールレコードをロードするために必要な I/O 操作を実行することからなる。複数の (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) の組が同一のモジュールレコードインスタンスに対応する場合がある。実際の対応付けの意味論はホスト定義であるが、通常は対応付けの過程で specifier に対して正規化処理が適用される。典型的な正規化処理には、相対パスや省略されたパス指定子の展開などが含まれる。

Note 2

上記のテキストは、type: "json" でインポートされた場合にホストが JSON モジュールをサポートすること(かつ HostLoadImportedModule が正常完了すること)を要求しているが、type: "json" を指定せずにインポートされた場合に JSON モジュールをサポートすることを禁止するものではない。

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

The abstract operation FinishLoadingImportedModule takes arguments referrer (スクリプトレコード循環モジュールレコード、または Realm レコード), moduleRequest (ModuleRequest レコード), payload (GraphLoadingState レコードまたは PromiseCapability レコード), and result (モジュールレコードを含む正常完了、または throw 完了) and returns unused. It performs the following steps when called:

  1. result が正常完了である場合、
    1. referrer.[[LoadedModules]] において、ModuleRequestsEqual(record, moduleRequest) が true である LoadedModuleRequest レコード record が含まれている場合、
      1. Assert: record.[[Module]]result.[[Value]] は同一のモジュールレコードである。
    2. それ以外の場合、
      1. LoadedModuleRequest レコード { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } を referrer.[[LoadedModules]] に追加する。
  2. payloadGraphLoadingState レコードである場合、
    1. ContinueModuleLoading(payload, result) を実行する。
  3. それ以外の場合、
    1. ContinueDynamicImport(payload, result) を実行する。
  4. unused を返す。

16.2.1.12 AllImportAttributesSupported ( attributes )

The abstract operation AllImportAttributesSupported takes argument attributes (ImportAttribute レコードList) and returns Boolean. It performs the following steps when called:

  1. supportedHostGetSupportedImportAttributes() とする。
  2. attributes の各 ImportAttribute レコード attribute について、次を行う。
    1. supportedattribute.[[Key]] を含まない場合、false を返す。
  3. true を返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns String の List. ホスト環境がサポートするインポート属性を指定できるようにする。サポートされているキーを持つ属性のみがホストに提供される。

HostGetSupportedImportAttributes の実装は、以下の要件に従わなければならない:

  • 各要素がサポートされる属性を示す String である List を返さなければならない。
  • この操作が呼び出されるたびに、同じ内容を同じ順序で持つ同一の List を返さなければならない。

HostGetSupportedImportAttributes のデフォルト実装は、新しい空の List を返すことである。

Note
ホストにすべての属性を渡してどれを処理するか選択させるのではなく、サポートするインポート属性をホストに明示させる目的は、未サポートの属性が異なるホスト間で一貫した方法で処理されることを保証するためである。

16.2.1.13 GetModuleNamespace ( module )

The abstract operation GetModuleNamespace takes argument module (Module Record の具体的サブクラスのインスタンス) and returns モジュール名前空間オブジェクト. module のエクスポートを表すモジュール名前空間オブジェクトを取得し、最初に要求されたときに遅延生成し、将来の取得のために module.[[Namespace]] に保存する。 It performs the following steps when called:

  1. Assert: module循環モジュールレコードである場合、module.[[Status]]new または unlinked ではない。
  2. namespacemodule.[[Namespace]] とする。
  3. namespaceempty である場合、
    1. exportedNamesmodule.GetExportedNames() とする。
    2. unambiguousNames を新しい空の List とする。
    3. exportedNames の各要素 name について、次を行う。
      1. resolutionmodule.ResolveExport(name) とする。
      2. resolution が ResolvedBinding レコードである場合、nameunambiguousNames に追加する。
    4. namespaceModuleNamespaceCreate(module, unambiguousNames) とする。
  4. namespace を返す。
Note

GetModuleNamespace は決して例外を投げない。その代わり、この時点では解決不能な名前は単に名前空間から除外される。それらは、どこからも明示的に要求されていない曖昧なスターエクスポートのみでない限り、後に実際のリンクエラーを引き起こす。

16.2.1.14 Runtime Semantics: 評価

Module : [empty]
  1. undefined を返す。
ModuleBody : ModuleItemList
  1. resultCompletion(ModuleItemListEvaluation) とする。
  2. result が正常完了であり、かつ result.[[Value]]empty の場合、
    1. undefined を返す。
  3. result を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. sl を ? ModuleItemListEvaluation とする。
  2. sCompletion(ModuleItemEvaluation) とする。
  3. UpdateEmpty(s, sl) を返す。
Note

ModuleItemList の値は、その中の最後の値を生成する項目の値である。

ModuleItem : ImportDeclaration
  1. empty を返す。

16.2.2 インポート

構文

ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral

16.2.2.1 Static Semantics: 早期エラー

ModuleItem : ImportDeclaration WithClause : with { WithEntries ,opt }
  • WithClauseWithClauseToAttributes に、a.[[Key]]b.[[Key]] であるような2つの異なるエントリ ab がある場合、これは Syntax Error である。

16.2.2.2 Static Semantics: ImportEntries

The syntax-directed operation ImportEntries takes no arguments and returns ImportEntry レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListImportEntries とする。
  2. entries2ModuleItemImportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空の List を返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleImportDeclarationModuleRequests の唯一の要素とする。
  2. 引数 module を用いた ImportClauseImportEntriesForModule を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空の List を返す。

16.2.2.3 Static Semantics: ImportEntriesForModule

The syntax-directed operation ImportEntriesForModule takes argument module (ModuleRequest レコード) and returns ImportEntry レコードのリスト. It is defined piecewise over the following productions:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1 を、引数 module を用いた ImportedDefaultBindingImportEntriesForModule とする。
  2. entries2 を、引数 module を用いた NameSpaceImportImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1 を、引数 module を用いた ImportedDefaultBindingImportEntriesForModule とする。
  2. entries2 を、引数 module を用いた NamedImportsImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
  1. localNameImportedBindingBoundNames の唯一の要素とする。
  2. defaultEntryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } とする。
  3. « defaultEntry » を返す。
NameSpaceImport : * as ImportedBinding
  1. localNameImportedBindingStringValue とする。
  2. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: localName } とする。
  3. « entry » を返す。
NamedImports : { }
  1. 新しい空の List を返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1 を、引数 module を用いた ImportsListImportEntriesForModule とする。
  2. specs2 を、引数 module を用いた ImportSpecifierImportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
  1. localNameImportedBindingBoundNames の唯一の要素とする。
  2. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } とする。
  3. « entry » を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameModuleExportNameStringValue とする。
  2. localNameImportedBindingStringValue とする。
  3. entryImportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } とする。
  4. « entry » を返す。

16.2.2.4 Static Semantics: WithClauseToAttributes

The syntax-directed operation WithClauseToAttributes takes no arguments and returns ImportAttribute レコードのリスト. It is defined piecewise over the following productions:

WithClause : with { }
  1. 新しい空の List を返す。
WithClause : with { WithEntries ,opt }
  1. attributesWithEntriesWithClauseToAttributes とする。
  2. attributes をそれらの [[Key]] フィールドの辞書式順序に従ってソートし、そのような各フィールドの値を UTF-16 コード単位値のシーケンスとして扱う。注: このソートが観測可能なのは、ホストが属性の列挙順序に基づいて振る舞いを変更することを禁止されているという点に限られる。
  3. attributes を返す。
WithEntries : AttributeKey : StringLiteral
  1. keyAttributeKeyPropName とする。
  2. entryImportAttribute レコード { [[Key]]: key, [[Value]]: StringLiteralSV } とする。
  3. « entry » を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyAttributeKeyPropName とする。
  2. entryImportAttribute レコード { [[Key]]: key, [[Value]]: StringLiteralSV } とする。
  3. restWithEntriesWithClauseToAttributes とする。
  4. « entry » と rest のリスト連結を返す。

16.2.3 エクスポート

構文

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 Static Semantics: 早期エラー

ExportDeclaration : export NamedExports ; Note

上記の規則は、NamedExports の各 ReferencedBindingsIdentifierReference として扱われることを意味する。

16.2.3.2 Static Semantics: ExportedBindings

The syntax-directed operation ExportedBindings takes no arguments and returns String のリスト.

Note

ExportedBindings は、ModuleExportedNames と明示的に関連付けられるローカル束縛名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedBindings とする。
  2. names2ModuleItemExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空の List を返す。
ExportDeclaration : export NamedExports ;
  1. NamedExportsExportedBindings を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNames を返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. この ExportDeclarationBoundNames を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedBindings とする。
  2. names2ExportSpecifierExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportNameStringValue を唯一の要素とする List を返す。

16.2.3.3 Static Semantics: ExportedNames

The syntax-directed operation ExportedNames takes no arguments and returns String のリスト.

Note

ExportedNames は、Module がそのローカル名束縛の1つに明示的に対応付ける、外部から見える名前である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemListExportedNames とする。
  2. names2ModuleItemExportedNames とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclarationExportedNames を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClauseExportedNames を返す。
ExportFromClause : *
  1. 新しい空の List を返す。
ExportFromClause : * as ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportFromClause : NamedExports
  1. NamedExportsExportedNames を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementBoundNames を返す。
ExportDeclaration : export Declaration
  1. DeclarationBoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListExportedNames とする。
  2. names2ExportSpecifierExportedNames とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 2番目の ModuleExportNameStringValue を唯一の要素とする List を返す。

16.2.3.4 Static Semantics: ExportEntries

The syntax-directed operation ExportEntries takes no arguments and returns ExportEntry レコードのリスト. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemListExportEntries とする。
  2. entries2ModuleItemExportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleExportDeclarationModuleRequests の唯一の要素とする。
  2. 引数 module を用いた ExportFromClauseExportEntriesForModule を返す。
ExportDeclaration : export NamedExports ;
  1. 引数 null を用いた NamedExportsExportEntriesForModule を返す。
ExportDeclaration : export VariableStatement
  1. entries を新しい空の List とする。
  2. namesVariableStatementBoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export Declaration
  1. entries を新しい空の List とする。
  2. namesDeclarationBoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export default HoistableDeclaration
  1. namesHoistableDeclarationBoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 新しい ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } を唯一の要素とする List を返す。
ExportDeclaration : export default ClassDeclaration
  1. namesClassDeclarationBoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 新しい ExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } を唯一の要素とする List を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry レコード { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } とする。
  2. « entry » を返す。
Note

"*default*" は、匿名 default export 値の合成名として、この仕様内で使用される。詳細はこの注記を参照。

16.2.3.5 Static Semantics: ExportEntriesForModule

The syntax-directed operation ExportEntriesForModule takes argument module (ModuleRequest レコードまたは null) and returns ExportEntry レコードのリスト. It is defined piecewise over the following productions:

ExportFromClause : *
  1. entryExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } とする。
  2. « entry » を返す。
ExportFromClause : * as ModuleExportName
  1. exportNameModuleExportNameStringValue とする。
  2. entryExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: null, [[ExportName]]: exportName } とする。
  3. « entry » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1 を、引数 module を用いた ExportsListExportEntriesForModule とする。
  2. specs2 を、引数 module を用いた ExportSpecifierExportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. sourceNameModuleExportNameStringValue とする。
  2. modulenull である場合、
    1. localNamesourceName とする。
    2. importNamenull とする。
  3. それ以外の場合、
    1. localNamenull とする。
    2. importNamesourceName とする。
  4. 新しい ExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } を唯一の要素とする List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName を最初の ModuleExportNameStringValue とする。
  2. exportName を2番目の ModuleExportNameStringValue とする。
  3. modulenull である場合、
    1. localNamesourceName とする。
    2. importNamenull とする。
  4. それ以外の場合、
    1. localNamenull とする。
    2. importNamesourceName とする。
  5. 新しい ExportEntry レコード { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } を唯一の要素とする List を返す。

16.2.3.6 Static Semantics: ReferencedBindings

The syntax-directed operation ReferencedBindings takes no arguments and returns Parse Node のリスト. It is defined piecewise over the following productions:

NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsListReferencedBindings とする。
  2. names2ExportSpecifierReferencedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportNameReferencedBindings を返す。
ModuleExportName : IdentifierName
  1. IdentifierName を唯一の要素とする List を返す。
ModuleExportName : StringLiteral
  1. StringLiteral を唯一の要素とする List を返す。

16.2.3.7 Runtime Semantics: Evaluation

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. empty を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatementEvaluation を ? で返す。
ExportDeclaration : export Declaration
  1. DeclarationEvaluation を ? で返す。
ExportDeclaration : export default HoistableDeclaration
  1. HoistableDeclarationEvaluation を ? で返す。
ExportDeclaration : export default ClassDeclaration
  1. valueClassDeclarationBindingClassDeclarationEvaluation の ? 結果とする。
  2. classNameClassDeclarationBoundNames の唯一の要素とする。
  3. className"*default*" である場合、
    1. env を実行中の実行コンテキストの LexicalEnvironment とする。
    2. InitializeBoundName("*default*", value, env) を ? で実行する。
  4. empty を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression) が true である場合、
    1. value を、引数 "default" を用いた AssignmentExpressionNamedEvaluation の ? 結果とする。
  2. それ以外の場合、
    1. rhsAssignmentExpressionEvaluation の ? 結果とする。
    2. valueGetValue(rhs) の ? 結果とする。
  3. env を実行中の実行コンテキストの LexicalEnvironment とする。
  4. InitializeBoundName("*default*", value, env) を ? で実行する。
  5. empty を返す。