ページ表示設定

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

構文指向操作 ScriptIsStrict。引数なし。戻り値:Boolean。 次の生成規則ごとに定義される。

Script : ScriptBodyopt
  1. ScriptBody が存在し、ScriptBody のディレクティブプロローグが Use Strict ディレクティブを含む場合、true を返す。
  2. false を返す。

16.1.3 Runtime Semantics: Evaluation

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

16.1.4 Script Record

Script Record は、評価されるスクリプトに関する情報をカプセル化します。各 script record は 表 35 に列挙されたフィールドを含みます。

表 35: Script Record のフィールド
フィールド名 値の型 意味
[[Realm]] a Realm Record このスクリプトが作成された realm。
[[ECMAScriptCode]] a Script Parse Node このスクリプトのソーステキストを構文解析した結果。
[[LoadedModules]] a List of LoadedModuleRequest Records このスクリプトによってインポートされた指定子文字列から、解決された Module Record への対応付け。このリストには、ModuleRequestsEqual(r1, r2) が true となる2つの異なる Record r1 と r2 は含まれません。
[[HostDefined]] anything (default value is empty) スクリプトに追加情報を関連付ける必要があるホスト環境が使用するために予約されたフィールド。

16.1.5 ParseScript ( sourceText, realm, hostDefined )

抽象操作 ParseScript。引数 sourceText ((String または a sequence of Unicode code points))、realm (Realmレコード) および hostDefined (任意の値)。戻り値:(Scriptレコード または a non-empty List of SyntaxError objects)。 sourceText を Script として構文解析した結果に基づいて Script Record を作成します。 呼び出されると、次の手順を実行する。

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

実装は、あるスクリプトソーステキストについて ParseScript を評価する前に、そのソーステキストを構文解析し、早期エラー条件について解析してもかまいません。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して ParseScript を実行する時点まで延期しなければなりません。

16.1.6 ScriptEvaluation ( scriptRecord )

抽象操作 ScriptEvaluation。引数 scriptRecord (Scriptレコード)。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 呼び出されると、次の手順を実行する。

  1. globalEnv を scriptRecord.[[Realm]].[[GlobalEnv]] とする。
  2. scriptContext を新しい ECMAScript コード実行コンテキストとする。
  3. scriptContext の Function を null に設定する。
  4. scriptContext の Realm を scriptRecord.[[Realm]] に設定する。
  5. scriptContext の ScriptOrModule を scriptRecord に設定する。
  6. scriptContext の VariableEnvironment を globalEnv に設定する。
  7. scriptContext の LexicalEnvironment を globalEnv に設定する。
  8. scriptContext の PrivateEnvironment を null に設定する。
  9. 実行中の実行コンテキストを一時停止する。
  10. scriptContext を実行コンテキストスタックにプッシュする。これで scriptContext が実行中の実行コンテキストになる。
  11. scriptNode を scriptRecord.[[ECMAScriptCode]] とする。
  12. result を Completion(GlobalDeclarationInstantiation(scriptNode, globalEnv)) とする。
  13. result が正常完了である場合、
    1. result を Completion(scriptNode の Evaluation) に設定する。
    2. result が正常完了であり、result.[[Value]] が empty である場合、
      1. result を NormalCompletion(undefined) に設定する。
  14. scriptContext を一時停止し、実行コンテキストスタックから削除する。
  15. 表明: 実行コンテキストスタックは空ではない。
  16. 現在実行コンテキストスタックの先頭にあるコンテキストを、実行中の実行コンテキストとして再開する。
  17. ? result を返す。

16.1.7 GlobalDeclarationInstantiation ( script, envRecord )

抽象操作 GlobalDeclarationInstantiation。引数 script (a Script Parse Node) および envRecord (Global Environmentレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。 script は、実行コンテキストが確立される対象の Script です。envRecord は、束縛が作成されるグローバル環境です。

注 1

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

呼び出されたとき、次の手順を実行します。

  1. lexicalNames を script の LexicallyDeclaredNames とする。
  2. variableNames を script の VarDeclaredNames とする。
  3. lexicalNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(envRecord, name) が true である場合、SyntaxError 例外をスローする。
    2. hasRestrictedGlobal を ? HasRestrictedGlobalProperty(envRecord, name) とする。
    3. 注記: グローバル var および function 束縛(非 strict direct eval によって導入されるものを除く)は構成不可であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobal が true である場合、SyntaxError 例外をスローする。
  4. variableNames の各要素 name について、次を行う。
    1. HasLexicalDeclaration(envRecord, name) が true である場合、SyntaxError 例外をスローする。
  5. variableDecls を script の VarScopedDeclarations とする。
  6. funcsToInitialize を新しい空の List とする。
  7. declaredFuncNames を新しい空の List とする。
  8. variableDecls の各要素 variableDecl について、List の逆順で次を行う。
    1. variableDecl が VariableDeclaration、ForBinding、または BindingIdentifier のいずれでもない場合、
      1. 表明: variableDecl は FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. 注記: 同じ名前について複数の関数宣言がある場合、最後の宣言が使用される。
      3. funcName を variableDecl の BoundNames の唯一の要素とする。
      4. declaredFuncNames が funcName を含まない場合、
        1. funcDefinable を ? CanDeclareGlobalFunction(envRecord, funcName) とする。
        2. funcDefinable が false である場合、TypeError 例外をスローする。
        3. funcName を declaredFuncNames に追加する。
        4. variableDecl を funcsToInitialize の最初の要素として挿入する。
  9. declaredVariableNames を新しい空の List とする。
  10. variableDecls の各要素 variableDecl について、次を行う。
    1. variableDecl が VariableDeclaration、ForBinding、または BindingIdentifier のいずれかである場合、
      1. variableDecl の BoundNames の各 String name について、次を行う。
        1. declaredFuncNames が name を含まない場合、
          1. variableDefinable を ? CanDeclareGlobalVar(envRecord, name) とする。
          2. variableDefinable が false である場合、TypeError 例外をスローする。
          3. declaredVariableNames が name を含まない場合、
            1. name を declaredVariableNames に追加する。
  11. 注記: グローバルオブジェクトが通常オブジェクトである場合、このアルゴリズムのこの手順以降では異常終了は発生しない。ただし、グローバルオブジェクトが Proxy 特殊オブジェクトである場合、後続の手順の一部で異常終了を引き起こす動作を示す可能性がある。
  12. Normative Optional
    ホストが Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、
    1. strict を script の ScriptIsStrict とする。
    2. strict が false である場合、
      1. declaredFuncOrVariableNames を declaredFuncNames と declaredVariableNames のリスト連結とする。
      2. script Contains x が true となる任意の Block、CaseClause、または DefaultClause x の StatementList に直接含まれる各 FunctionDeclaration funcDecl について、次を行う。
        1. funcName を funcDecl の BindingIdentifier の StringValue とする。
        2. FunctionDeclaration funcDecl を、funcName を BindingIdentifier として持つ VariableStatement に置き換えても script に早期エラーが生じない場合、
          1. HasLexicalDeclaration(envRecord, funcName) が false である場合、
            1. funcDefinable を ? CanDeclareGlobalVar(envRecord, funcName) とする。
            2. funcDefinable が true である場合、
              1. 注記: funcName の var 束縛がここでインスタンス化されるのは、それが VarDeclaredName でも別の FunctionDeclaration の名前でもない場合だけである。
              2. declaredFuncOrVariableNames が funcName を含まない場合、
                1. ? CreateGlobalVarBinding(envRecord, funcName, false) を実行する。
                2. funcName を declaredFuncOrVariableNames に追加する。
              3. FunctionDeclaration funcDecl が評価されるとき、15.2.6 で提供される FunctionDeclaration Evaluation アルゴリズムの代わりに、次の手順を実行する。
                1. globalEnv を実行中の実行コンテキストの VariableEnvironment とする。
                2. blockEnv を実行中の実行コンテキストの LexicalEnvironment とする。
                3. funcObj を ! blockEnv.GetBindingValue(funcName, false) とする。
                4. ? globalEnv.SetMutableBinding(funcName, funcObj, false) を実行する。
                5. unused を返す。
  13. lexicalDecls を script の LexicallyScopedDeclarations とする。
  14. privateEnv を null とする。
  15. lexicalDecls の各要素 lexicalDecl について、次を行う。
    1. 注記: レキシカルに宣言された名前はここではインスタンス化されるだけで、初期化はされない。
    2. lexicalDecl の BoundNames の各要素 name について、次を行う。
      1. lexicalDecl の IsConstantDeclaration が true である場合、
        1. ? envRecord.CreateImmutableBinding(name, true) を実行する。
      2. そうでない場合、
        1. ? envRecord.CreateMutableBinding(name, false) を実行する。
  16. funcsToInitialize の各 Parse Node funcDecl について、次を行う。
    1. funcName を funcDecl の BoundNames の唯一の要素とする。
    2. funcObj を、引数 envRecord および privateEnv を指定した funcDecl の InstantiateFunctionObject とする。
    3. ? CreateGlobalFunctionBinding(envRecord, funcName, funcObj, false) を実行する。
  17. declaredVariableNames の各 String variableName について、次を行う。
    1. ? CreateGlobalVarBinding(envRecord, variableName, false) を実行する。
  18. unused を返す。
注 2

16.1.1 で規定される早期エラーは、単一の Script 内に含まれる宣言について、function/var 宣言と let/const/class 宣言との名前衝突、および let/const/class 束縛の再宣言を防止します。ただし、複数の Script にまたがるこのような衝突および再宣言は、GlobalDeclarationInstantiation 中に実行時エラーとして検出されます。このようなエラーが検出された場合、そのスクリプトについて束縛は一切インスタンス化されません。ただし、グローバルオブジェクトが Proxy 特殊オブジェクトを使用して定義されている場合、競合する宣言に対する実行時検査が信頼できず、中断完了となり、一部のグローバル宣言がインスタンス化されない可能性があります。この場合、Script のコードは評価されません。

明示的な var または function 宣言とは異なり、グローバルオブジェクト上に直接作成されたプロパティから生じるグローバル束縛は、let/const/class 宣言によって隠蔽される場合があります。

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 注

ExportedNames の重複規則により、ModuleBody 内に複数の export default ExportDeclaration 項目がある場合は Syntax Error になります。競合または重複する宣言に関する追加のエラー条件は、Module の評価前のモジュールリンク中に検査されます。このようなエラーが検出された場合、Module は評価されません。

ModuleExportName : StringLiteral

16.2.1.2 Static Semantics: ImportedLocalNames ( importEntries )

抽象操作 ImportedLocalNames。引数 importEntries (リスト (要素:ImportEntryレコード))。戻り値:リスト (要素:String)。 importEntries によって定義されるすべてのローカル名束縛の List を作成します。 呼び出されると、次の手順を実行する。

  1. localNames を新しい空の List とする。
  2. importEntries の各 ImportEntry Record importEntry について、次を行う。
    1. importEntry.[[LocalName]] を localNames に追加する。
  3. localNames を返す。

16.2.1.3 ModuleRequest Record

ModuleRequest Record は、指定されたインポート属性を持つモジュールをインポートする要求を表します。これは次のフィールドで構成されます。

表 36: ModuleRequest Record のフィールド
フィールド名 値の型 意味
[[Specifier]] a String モジュール指定子
[[Attributes]] a List of ImportAttribute Records インポート属性

LoadedModuleRequest Record は、モジュールをインポートする要求と、その結果として得られる Module Record を表します。これは 表 36 の表で定義されるものと同じフィールドに加えて、[[Module]] を持ちます。

表 37: LoadedModuleRequest Record のフィールド
フィールド名 値の型 意味
[[Specifier]] a String モジュール指定子
[[Attributes]] a List of ImportAttribute Records インポート属性
[[Module]] a Module Record このモジュール要求に対応する、読み込まれたモジュール

ImportAttribute Record は次のフィールドで構成されます。

表 38: ImportAttribute Record のフィールド
フィールド名 値の型 意味
[[Key]] a String 属性キー
[[Value]] a String 属性値

16.2.1.3.1 ModuleRequestsEqual ( x, y )

抽象操作 ModuleRequestsEqual。引数 x ((ModuleRequestレコード または LoadedModuleRequestレコード)) および y ((ModuleRequestレコード または LoadedModuleRequestレコード))。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. x.[[Specifier]] が y.[[Specifier]] でない場合、false を返す。
  2. xAttrs を x.[[Attributes]] とする。
  3. yAttrs を y.[[Attributes]] とする。
  4. xAttrsCount を xAttrs の要素数とする。
  5. yAttrsCount を yAttrs の要素数とする。
  6. xAttrsCount ≠ yAttrsCount である場合、false を返す。
  7. xAttrs の各 ImportAttribute Record xAttr について、次を行う。
    1. yAttrs が、xAttr.[[Key]] が yAttr.[[Key]] であり、かつ xAttr.[[Value]] が yAttr.[[Value]] である ImportAttribute Record yAttr を含まない場合、false を返す。
  8. true を返す。

16.2.1.4 Static Semantics: ModuleRequests

構文指向操作 ModuleRequests。引数なし。戻り値:リスト (要素:ModuleRequestレコード)。 次の生成規則ごとに定義される。

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItem
  1. ModuleItem の ModuleRequests を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. requests を ModuleItemList の ModuleRequests とする。
  2. additionalRequests を ModuleItem の ModuleRequests とする。
  3. additionalRequests の各 ModuleRequest Record moduleRequest について、次を行う。
    1. requests が、ModuleRequestsEqual(moduleRequest, otherModuleRequest) が true である ModuleRequest Record otherModuleRequest を含まない場合、
      1. moduleRequest を requests に追加する。
  4. requests を返す。
ModuleItem : StatementListItem
  1. 新しい空の List を返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifier を FromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } である List を返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifier を FromClause の SV とする。
  2. attrs を WithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs } である List を返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifier を ModuleSpecifier の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } である List を返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifier を ModuleSpecifier の SV とする。
  2. attrs を WithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs } である List を返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifier を FromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } である List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifier を FromClause の SV とする。
  2. attrs を WithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attrs } である List を返す。
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 新しい空の List を返す。

16.2.1.5 抽象 Module Record

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

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

Module Record は 表 39 に列挙されるフィールドを定義します。すべての Module Definition サブクラスは少なくともこれらのフィールドを含みます。Module Record はさらに、表 40 にある抽象メソッドのリストを定義します。すべての Module 定義サブクラスは、これらの抽象メソッドの具象実装を提供しなければなりません。

表 39: Module Record のフィールド
フィールド名 値の型 意味
[[Realm]] a Realm Record このモジュールが作成された Realm。
[[Environment]] a Module Environment Record or empty このモジュールのトップレベル束縛を含む Environment Record。このフィールドはモジュールがリンクされたときに設定されます。
[[Namespace]] an Object or empty このモジュールについて作成されている場合、その Module Namespace Object(28.3)。
[[HostDefined]] anything (default value is undefined) モジュールに追加情報を関連付ける必要があるホスト環境が使用するために予約されたフィールド。
表 40: Module Recordsの抽象メソッド
メソッド 目的 定義
LoadRequestedModules ( [ hostDefined ] )

抽象メソッド LoadRequestedModules。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。

すべての依存関係を再帰的に読み込むことによって、モジュールをリンクするための準備を行います。

この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
GetExportedNames ( [ exportStarSet ] )

抽象メソッド GetExportedNames。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード))。戻り値:リスト (要素:String)。

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

このメソッドを呼び出す前に、LoadRequestedModules が正常に完了していなければなりません。

この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
ResolveExport ( exportName [ , resolveSet ] )

抽象メソッド ResolveExport。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード、null または ambiguous)。

このモジュールによってエクスポートされた名前の束縛を返します。束縛は、{ [[Module]]: Module Record, [[BindingName]]: String | namespace } という形式の ResolvedBinding Record によって表されます。エクスポートがどのモジュールにも直接束縛を持たない Module Namespace Object である場合、[[BindingName]] は namespace に設定されます。名前を解決できない場合は null、複数の束縛が見つかった場合は ambiguous を返します。

この操作が特定の exportName、resolveSet の組を引数として呼び出されるたびに、同じ結果を返さなければなりません。

このメソッドを呼び出す前に、LoadRequestedModules が正常に完了していなければなりません。

この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
Evaluate ( )

抽象メソッド Evaluate。引数なし。戻り値:Promise。

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

このメソッドを呼び出す前に、Link が正常に完了していなければなりません。

この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。

16.2.1.5.1 EvaluateModuleSync ( module )

抽象操作 EvaluateModuleSync。引数 module (Moduleレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼出し元が module の評価によってすでに決定済みの promise が返されることを保証する場合、module を同期的に評価します。 呼び出されると、次の手順を実行する。

  1. 表明: module は Cyclic Module Record ではない。
  2. promise を module.Evaluate() とする。
  3. 表明: 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 は、Cyclic Module Record 型のサブクラスである他のモジュールとの依存関係サイクルに参加できるモジュールに関する情報を表すために使用されます。Cyclic Module Record 型のサブクラスでない Module Record は、Source Text Module Record との依存関係サイクルに参加してはなりません。

表 39 で定義されたフィールドに加えて、Cyclic Module Record は 表 41 に列挙される追加のフィールドを持ちます。

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

表 40 で定義されたメソッドに加えて、Cyclic Module Record は 表 42 に列挙される追加のメソッドを持ちます。

表 42: Cyclic Module Record の追加の抽象メソッド
メソッド 目的 定義
InitializeEnvironment ( )

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

インポートされたすべての束縛の解決を含め、モジュールの Environment Record を初期化し、モジュールの実行コンテキストを作成します。
この仕様内では次の型に定義があります。ホストは独自の定義を持つ追加の型を提供してもかまいません。
ExecuteModule ( [ capability ] )

抽象メソッド ExecuteModule。省略可能な引数 capability (PromiseCapabilityレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。

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

GraphLoadingState Record は、モジュールグラフの読み込み処理に関する情報を含む Record です。HostLoadImportedModule の呼出し後に読み込みを継続するために使用されます。各 GraphLoadingState Record は 表 43 で定義されるフィールドを持ちます。

表 43: GraphLoadingState Record のフィールド
フィールド名 値の型 意味
[[PromiseCapability]] a PromiseCapability Record 読み込み処理が完了したときに解決する promise。
[[IsLoading]] a Boolean 読み込み処理が、成功でもエラーでもまだ終了していない場合は true。
[[PendingModulesCount]] a non-negative integer 保留中の HostLoadImportedModule 呼出しの数を追跡します。
[[Visited]] a List of Cyclic Module Records 循環依存関係による無限ループを避けるため、現在の読み込み処理によってすでに読み込まれた Cyclic Module Record のリスト。
[[HostDefined]] anything (default value is empty) LoadRequestedModules の呼出し元から HostLoadImportedModule へ渡すホスト定義データを含みます。

16.2.1.6.1 Module Record 抽象メソッドの実装

以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Cyclic Module Record の具象メソッドです。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

a Cyclic Module Record moduleの具象メソッド LoadRequestedModules。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。 module の依存関係グラフにあるすべての Module Record の [[LoadedModules]] を設定します(作業の大部分は補助関数 InnerModuleLoading によって行われます)。HostLoadImportedModule フックへ渡される省略可能な hostDefined パラメーターを取ります。 呼び出されると、次の手順を実行する。

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

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

抽象操作 InnerModuleLoading。引数 state (GraphLoadingStateレコード) および module (Moduleレコード)。戻り値:unused。 LoadRequestedModules によって、module の依存関係グラフに対する実際の読み込み処理を再帰的に実行するために使用されます。 呼び出されると、次の手順を実行する。

  1. 表明: state.[[IsLoading]] は true である。
  2. module が Cyclic Module Record であり、module.[[Status]] が new であり、state.[[Visited]] が module を含まない場合、
    1. module を state.[[Visited]] に追加する。
    2. requestedModulesCount を module.[[RequestedModules]] の要素数とする。
    3. state.[[PendingModulesCount]] を state.[[PendingModulesCount]] + requestedModulesCount に設定する。
    4. module.[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。
      1. AllImportAttributesSupported(request.[[Attributes]]) が false である場合、
        1. error を ThrowCompletion(新しく作成された SyntaxError オブジェクト) とする。
        2. ContinueModuleLoading(state, error) を実行する。
      2. そうでなく、module.[[LoadedModules]] が、ModuleRequestsEqual(record, request) が true である LoadedModuleRequest Record record を含む場合、
        1. InnerModuleLoading(state, record.[[Module]]) を実行する。
      3. そうでない場合、
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state) を実行する。
        2. 注記: HostLoadImportedModule は FinishLoadingImportedModule を呼び出し、それによって ContinueModuleLoading を介してグラフ読み込み処理へ再び入る。
      4. state.[[IsLoading]] が false である場合、unused を返す。
  3. 表明: state.[[PendingModulesCount]] ≥ 1。
  4. state.[[PendingModulesCount]] を state.[[PendingModulesCount]] - 1 に設定する。
  5. state.[[PendingModulesCount]] = 0 である場合、
    1. state.[[IsLoading]] を false に設定する。
    2. state.[[Visited]] の各 Cyclic Module Record 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 )

抽象操作 ContinueModuleLoading。引数 state (GraphLoadingStateレコード) および moduleCompletion ((正常完了 (値:Moduleレコード) または throw 完了))。戻り値:unused。 HostLoadImportedModule の呼出し後に読み込み処理へ再び入るために使用されます。 呼び出されると、次の手順を実行する。

  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 ( )

a Cyclic Module Record moduleの具象メソッド Link。引数なし。戻り値:(正常完了 (値:unused) または throw 完了)。 成功すると、Link はこのモジュールの [[Status]] を unlinked から linked に遷移させます。失敗すると例外がスローされ、このモジュールの [[Status]] は unlinked のままです。(作業の大部分は補助関数 InnerModuleLinking によって行われます。) 呼び出されると、次の手順を実行する。

  1. 表明: module.[[Status]] は unlinked、linked、evaluating-async、または evaluated のいずれかである。
  2. stack を新しい空の List とする。
  3. result を Completion(InnerModuleLinking(module, stack, 0)) とする。
  4. result が中断完了である場合、
    1. stack の各 Cyclic Module Record requiredModule について、次を行う。
      1. 表明: requiredModule.[[Status]] は linking である。
      2. requiredModule.[[Status]] を unlinked に設定する。
    2. 表明: module.[[Status]] は unlinked である。
    3. ? result を返す。
  5. 表明: module.[[Status]] は linked、evaluating-async、または evaluated のいずれかである。
  6. 表明: stack は空である。
  7. unused を返す。

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

抽象操作 InnerModuleLinking。引数 module (Moduleレコード)、stack (リスト (要素:Cyclic Moduleレコード)) および index (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了)。 Link によって、module に対する実際のリンク処理と、依存関係グラフ内の他のすべてのモジュールに対する再帰的なリンク処理を実行するために使用されます。stack および index パラメーターと、モジュールの [[DFSAncestorIndex]] フィールドは、深さ優先探索(DFS)の走査を追跡します。特に、[[DFSAncestorIndex]] は強連結成分(SCC)を検出するために使用され、SCC 内のすべてのモジュールがまとめて linked に遷移するようにします。 呼び出されると、次の手順を実行する。

  1. module が Cyclic Module Record でない場合、
    1. ? module.Link() を実行する。
    2. index を返す。
  2. module.[[Status]] が linking、linked、evaluating-async、または evaluated のいずれかである場合、
    1. index を返す。
  3. 表明: module.[[Status]] は unlinked である。
  4. module.[[Status]] を linking に設定する。
  5. moduleIndex を index とする。
  6. module.[[DFSAncestorIndex]] を index に設定する。
  7. index を index + 1 に設定する。
  8. module を stack に追加する。
  9. module.[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。
    1. requiredModule を GetImportedModule(module, request) とする。
    2. index を ? InnerModuleLinking(requiredModule, stack, index) に設定する。
    3. requiredModule が Cyclic Module Record である場合、
      1. 表明: requiredModule.[[Status]] は linking、linked、evaluating-async、または evaluated のいずれかである。
      2. 表明: requiredModule.[[Status]] が linking であることと、stack が requiredModule を含むことは同値である。
      3. requiredModule.[[Status]] が linking である場合、
        1. module.[[DFSAncestorIndex]] を min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
  10. ? module.InitializeEnvironment() を実行する。
  11. 表明: module は stack 内に正確に1回現れる。
  12. 表明: module.[[DFSAncestorIndex]] ≤ moduleIndex。
  13. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. done を false とする。
    2. done が false の間、次を繰り返す。
      1. requiredModule を stack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. 表明: requiredModule は Cyclic Module Record である。
      4. requiredModule.[[Status]] を linked に設定する。
      5. requiredModule と module が同じ Module Record である場合、done を true に設定する。
  14. index を返す。

16.2.1.6.1.3 Evaluate ( )

a Cyclic Module Record moduleの具象メソッド Evaluate。引数なし。戻り値:Promise。 Evaluate はこのモジュールの [[Status]] を linked から evaluating-async または evaluated のいずれかへ遷移させます。特定の強連結成分内のモジュールに対して最初に呼び出されたとき、Evaluate は、モジュールの評価が完了したときに解決する Promise を作成して返します。この Promise は、その成分の [[CycleRoot]] の [[TopLevelCapability]] フィールドに保存されます。成分内の任意のモジュールに対する以後の Evaluate 呼出しは、同じ Promise を返します。(作業の大部分は補助関数 InnerModuleEvaluation によって行われます。) 呼び出されると、次の手順を実行する。

  1. 表明: この Evaluate の呼出しは、周囲の agent 内の別の Evaluate 呼出しと同時には発生していない。
  2. 表明: module.[[Status]] は linked、evaluating-async、または evaluated のいずれかである。
  3. module.[[Status]] が evaluating-async または evaluated のいずれかである場合、
    1. module.[[CycleRoot]] が empty でない場合、
      1. module を module.[[CycleRoot]] に設定する。
    2. そうでない場合、
      1. 表明: module.[[Status]] は evaluated であり、module.[[EvaluationError]] はスロー完了である。
  4. module.[[TopLevelCapability]] が empty でない場合、
    1. module.[[TopLevelCapability]].[[Promise]] を返す。
  5. stack を新しい空の List とする。
  6. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  7. module.[[TopLevelCapability]] を promiseCapability に設定する。
  8. result を Completion(InnerModuleEvaluation(module, stack, 0)) とする。
  9. result が中断完了である場合、
    1. stack の各 Cyclic Module Record requiredModule について、次を行う。
      1. 表明: requiredModule.[[Status]] は evaluating である。
      2. requiredModule.[[Status]] を evaluated に設定する。
      3. requiredModule.[[EvaluationError]] を result に設定する。
    2. 表明: module.[[Status]] は evaluated である。
    3. 表明: module.[[EvaluationError]] と result は同じ Completion Record である。
    4. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») を実行する。
  10. そうでない場合、
    1. 表明: module.[[Status]] は evaluating-async または evaluated のいずれかである。
    2. 表明: module.[[EvaluationError]] は empty である。
    3. module.[[Status]] が evaluated である場合、
      1. 表明: module.[[AsyncEvaluationOrder]] は unset または done のいずれかである。
      2. 注記: module がすでに評価済みであり、その評価が非同期であった場合に限り、module.[[AsyncEvaluationOrder]] は done である。
      3. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») を実行する。
    4. 表明: stack は空である。
  11. promiseCapability.[[Promise]] を返す。

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

抽象操作 InnerModuleEvaluation。引数 module (Moduleレコード)、stack (リスト (要素:Cyclic Moduleレコード)) および index (非負整数)。戻り値:(正常完了 (値:非負整数) または throw 完了)。 Evaluate によって、module に対する実際の評価処理と、依存関係グラフ内の他のすべてのモジュールに対する再帰的な評価処理を実行するために使用されます。stack および index パラメーターと module の [[DFSAncestorIndex]] フィールドは、InnerModuleLinking と同じ方法で使用されます。 呼び出されると、次の手順を実行する。

  1. module が Cyclic Module Record でない場合、
    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. 表明: module.[[Status]] は linked である。
  5. module.[[Status]] を evaluating に設定する。
  6. moduleIndex を index とする。
  7. module.[[DFSAncestorIndex]] を index に設定する。
  8. module.[[PendingAsyncDependencies]] を 0 に設定する。
  9. index を index + 1 に設定する。
  10. module を stack に追加する。
  11. module.[[RequestedModules]] の各 ModuleRequest Record request について、次を行う。
    1. requiredModule を GetImportedModule(module, request) とする。
    2. index を ? InnerModuleEvaluation(requiredModule, stack, index) に設定する。
    3. requiredModule が Cyclic Module Record である場合、
      1. 表明: requiredModule.[[Status]] は evaluating、evaluating-async、または evaluated のいずれかである。
      2. 表明: requiredModule.[[Status]] が evaluating であることと、stack が requiredModule を含むことは同値である。
      3. requiredModule.[[Status]] が evaluating である場合、
        1. module.[[DFSAncestorIndex]] を min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]]) に設定する。
      4. そうでない場合、
        1. requiredModule を requiredModule.[[CycleRoot]] に設定する。
        2. 表明: requiredModule.[[Status]] は evaluating-async または evaluated のいずれかである。
        3. requiredModule.[[EvaluationError]] が empty でない場合、? requiredModule.[[EvaluationError]] を返す。
      5. requiredModule.[[AsyncEvaluationOrder]] が整数である場合、
        1. module.[[PendingAsyncDependencies]] を module.[[PendingAsyncDependencies]] + 1 に設定する。
        2. module を requiredModule.[[AsyncParentModules]] に追加する。
  12. module.[[HasTLA]] が true であるか、module.[[PendingAsyncDependencies]] > 0 である場合、
    1. 表明: module.[[AsyncEvaluationOrder]] は unset である。
    2. module.[[AsyncEvaluationOrder]] を IncrementModuleAsyncEvaluationCount() に設定する。
    3. module.[[PendingAsyncDependencies]] = 0 である場合、ExecuteAsyncModule(module) を実行する。
  13. そうでない場合、
    1. ? module.ExecuteModule() を実行する。
  14. 表明: module は stack 内に正確に1回現れる。
  15. 表明: module.[[DFSAncestorIndex]] ≤ moduleIndex。
  16. module.[[DFSAncestorIndex]] = moduleIndex である場合、
    1. done を false とする。
    2. done が false の間、次を繰り返す。
      1. requiredModule を stack の最後の要素とする。
      2. stack の最後の要素を削除する。
      3. 表明: requiredModule は Cyclic Module Record である。
      4. 表明: requiredModule.[[AsyncEvaluationOrder]] は整数または unset のいずれかである。
      5. requiredModule.[[AsyncEvaluationOrder]] が unset である場合、requiredModule.[[Status]] を evaluated に設定する。
      6. そうでない場合、requiredModule.[[Status]] を evaluating-async に設定する。
      7. requiredModule と module が同じ Module Record である場合、done を true に設定する。
      8. requiredModule.[[CycleRoot]] を module に設定する。
  17. index を返す。
注 1

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

注 2

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

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

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

  1. 表明: module.[[Status]] は evaluating または evaluating-async のいずれかである。
  2. 表明: module.[[HasTLA]] は true である。
  3. promiseCapability を ! NewPromiseCapability(%Promise%) とする。
  4. fulfilledClosure を、パラメーターを持たず、module を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. AsyncModuleExecutionFulfilled(module) を実行する。
    2. NormalCompletion(undefined) を返す。
  5. onFulfilled を CreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
  6. rejectedClosure を、パラメーター (error) を持ち、module を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. AsyncModuleExecutionRejected(module, error) を実行する。
    2. NormalCompletion(undefined) を返す。
  7. onRejected を CreateBuiltinFunction(rejectedClosure, 0, "", « ») とする。
  8. PerformPromiseThen(promiseCapability.[[Promise]], onFulfilled, onRejected) を実行する。
  9. ! module.ExecuteModule(promiseCapability) を実行する。
  10. unused を返す。

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

抽象操作 GatherAvailableAncestors。引数 module (Cyclic Moduleレコード) および execList (リスト (要素:Cyclic Moduleレコード))。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. module.[[AsyncParentModules]] の各 Cyclic Module Record ancestorModule について、次を行う。
    1. execList が ancestorModule を含まず、かつ ancestorModule.[[CycleRoot]].[[EvaluationError]] が empty である場合、
      1. 表明: ancestorModule.[[Status]] は evaluating-async である。
      2. 表明: ancestorModule.[[EvaluationError]] は empty である。
      3. 表明: ancestorModule.[[AsyncEvaluationOrder]] は整数である。
      4. 表明: ancestorModule.[[PendingAsyncDependencies]] > 0。
      5. ancestorModule.[[PendingAsyncDependencies]] を ancestorModule.[[PendingAsyncDependencies]] - 1 に設定する。
      6. ancestorModule.[[PendingAsyncDependencies]] = 0 である場合、
        1. ancestorModule を execList に追加する。
        2. ancestorModule.[[HasTLA]] が false である場合、GatherAvailableAncestors(ancestorModule, execList) を実行する。
  2. unused を返す。
注

ルート module の非同期実行が fulfilled になると、この関数は、この完了時に同期的にまとめて実行できるモジュールのリストを決定し、それらを execList に格納します。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

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

  1. module.[[Status]] が evaluated である場合、
    1. 表明: module.[[EvaluationError]] は empty ではない。
    2. unused を返す。
  2. 表明: module.[[Status]] は evaluating-async である。
  3. 表明: module.[[AsyncEvaluationOrder]] は整数である。
  4. 表明: module.[[EvaluationError]] は empty である。
  5. module.[[AsyncEvaluationOrder]] を done に設定する。
  6. module.[[Status]] を evaluated に設定する。
  7. module.[[TopLevelCapability]] が empty でない場合、
    1. 表明: module.[[CycleRoot]] と module は同じ Module Record である。
    2. ! Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  8. execList を新しい空の List とする。
  9. GatherAvailableAncestors(module, execList) を実行する。
  10. 表明: execList のすべての要素は、[[AsyncEvaluationOrder]] フィールドが整数に設定され、[[PendingAsyncDependencies]] フィールドが 0 に設定され、[[EvaluationError]] フィールドが empty に設定されている。
  11. sortedExecList を、execList の要素を [[AsyncEvaluationOrder]] フィールドの昇順で並べ替えた List とする。
  12. sortedExecList の各 Cyclic Module Record ancestorModule について、次を行う。
    1. ancestorModule.[[Status]] が evaluated である場合、
      1. 表明: ancestorModule.[[EvaluationError]] は empty ではない。
    2. そうでなく、ancestorModule.[[HasTLA]] が true である場合、
      1. ExecuteAsyncModule(ancestorModule) を実行する。
    3. そうでない場合、
      1. result を Completion(ancestorModule.ExecuteModule()) とする。
      2. result が中断完了である場合、
        1. AsyncModuleExecutionRejected(ancestorModule, result.[[Value]]) を実行する。
      3. そうでない場合、
        1. ancestorModule.[[AsyncEvaluationOrder]] を done に設定する。
        2. ancestorModule.[[Status]] を evaluated に設定する。
        3. ancestorModule.[[TopLevelCapability]] が empty でない場合、
          1. 表明: ancestorModule.[[CycleRoot]] と ancestorModule は同じ Module Record である。
          2. ! Call(ancestorModule.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行する。
  13. unused を返す。

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

抽象操作 AsyncModuleExecutionRejected。引数 module (Cyclic Moduleレコード) および error (ECMAScript 言語値)。戻り値:unused。 呼び出されると、次の手順を実行する。

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

16.2.1.6.2 Cyclic Module Record グラフの例

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

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

図 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() が正常に呼び出された後にリンクエラーが発生する場合を考えます。C の InnerModuleLinking は成功するものの、その後 B について失敗した場合、たとえば C が提供していないものをインポートしている場合、元の A.Link() は失敗し、A と B の [[Status]] はどちらも unlinked のままです。ただし、C の [[Status]] は linked になっています。

最後に、Link() の呼出しが成功した後に評価エラーが発生する場合を考えます。C の InnerModuleEvaluation は成功するものの、その後 B について失敗した場合、たとえば B が例外をスローするコードを含む場合、元の A.Evaluate() は失敗し、拒否された Promise を返します。結果として生じる例外は A と B の両方の [[EvaluationError]] フィールドに記録され、それらの [[Status]] は evaluated になります。C も evaluated になりますが、評価が正常に完了したため、A と B とは異なり [[EvaluationError]] を持たないままです。例外を保存することで、ホストが A または B の Evaluate() メソッドを呼び出して再利用しようとするたびに、同じ例外に遭遇することが保証されます。(ホストは Cyclic Module Record を再利用する必要はありません。同様に、ホストはこれらのメソッドによってスローされた例外オブジェクトを公開する必要もありません。ただし、仕様はそのような使用を可能にしています。)

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

図 3: 解決不能なモジュールを含むモジュールグラフ
モジュール A が、??? で表される欠落した(解決不能な)モジュールに依存するモジュールグラフ

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

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

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

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

図 4: 循環モジュールグラフ
モジュール A がモジュール B と C に依存し、モジュール B もモジュール A に依存するモジュールグラフ

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

次にホストは A.Link() を呼び出し、A に対して InnerModuleLinking を実行します。これはさらに B に対して InnerModuleLinking を呼び出します。サイクルがあるため、これによって A に対する InnerModuleLinking が再び発生しますが、この時点では A.[[Status]] がすでに linking であるため、何も行いません。制御が A に戻り、C に対して InnerModuleLinking が開始される時点でも、B.[[Status]] 自体は linking のままです。C.[[Status]] が linked となって戻った後、A と B はまとめて linking から linked に遷移します。これは、それらが強連結成分を形成しているため意図された動作です。この段階ではモジュールグラフが深さ優先探索によって走査されるため、同じ SCC 内のモジュールの status を同時に遷移させることができます。

循環モジュールグラフの評価段階でも、成功する場合は同様のことが起こります。

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

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

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

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

読み込みとリンクは以前と同様に行われ、すべてのモジュールの [[Status]] は最終的に linked に設定されます。

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

表 44: 最初の 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 and C) 1 (D) 2 (D and E) 0 0

E が最初に実行を完了すると仮定します。そうなると AsyncModuleExecutionFulfilled が呼び出され、E.[[Status]] は evaluated に設定され、C.[[PendingAsyncDependencies]] はデクリメントされて 1 になります。更新されたモジュールのフィールドは 表 45 に示すとおりです。

表 45: モジュール 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 になり、B に対して ExecuteAsyncModule が呼び出され、実行を開始します。C.[[PendingAsyncDependencies]] もデクリメントされて 0 になり、C が実行を開始します(B が await を含む場合、B と並行して実行される可能性があります)。更新されたモジュールのフィールドは 表 46 に示すとおりです。

表 46: モジュール 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 になります。更新されたモジュールのフィールドは 表 47 に示すとおりです。

表 47: モジュール 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 が呼び出され、A が実行を開始します。更新されたモジュールのフィールドは 表 48 に示すとおりです。

表 48: モジュール 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() から返されたもの)が解決され、このモジュールグラフの処理は終了します。更新されたモジュールのフィールドは 表 49 に示すとおりです。

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

代わりに、B が実行を完了する前に C の実行が失敗してエラーを返す失敗ケースを考えます。そうなると AsyncModuleExecutionRejected が呼び出され、C.[[Status]] を evaluated に、C.[[EvaluationError]] をそのエラーに設定します。次に、各 AsyncParentModules に対して AsyncModuleExecutionRejected を実行することによって、このエラーをすべての AsyncParentModules に伝播します。更新されたモジュールのフィールドは 表 50 に示すとおりです。

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

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

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

その後、B はエラーなく実行を完了します。そうなると AsyncModuleExecutionFulfilled が再び呼び出され、B.[[Status]] は evaluated に設定されます。B に対して GatherAvailableAncestors が呼び出されます。ただし、A.[[CycleRoot]] は A であり、評価エラーを持っているため、返される sortedExecList には追加されず、AsyncModuleExecutionFulfilled はそれ以上処理せずに戻ります。以後の B のインポーターは、サイクルルート A に設定された C の評価エラーから、B.[[CycleRoot]].[[EvaluationError]] の拒否を解決します。更新されたモジュールのフィールドは 表 52 に示すとおりです。

表 52: エラーのあるグラフでモジュール B の実行が完了した後のモジュールフィールド
フィールド
モジュール
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C の評価エラー empty

16.2.1.7 Source Text Module Record

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

Source Text Module Record は、抽象 Module Record 型の他のサブクラスとともにモジュールグラフ内に存在でき、Cyclic Module Record 型の他のサブクラスとサイクルに参加できます。

表 41 で定義されるフィールドに加えて、Source Text Module Record は 表 53 に列挙される追加のフィールドを持ちます。これらの各フィールドは、最初に ParseModule で設定されます。

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

ImportEntry Record は、単一の宣言的インポートに関する情報を整理した Record です。各 ImportEntry Record は 表 54 で定義されるフィールドを持ちます。

表 54: ImportEntry Record のフィールド
フィールド名 値の型 意味
[[ModuleRequest]] a ModuleRequest Record ImportDeclaration の ModuleSpecifier とインポート属性を表す ModuleRequest Record。
[[ImportName]] a String or namespace [[ModuleRequest]] によって識別されるモジュールから目的の束縛がエクスポートされる名前。値 namespace は、インポート要求が対象モジュールの namespace オブジェクトに対するものであることを示します。
[[LocalName]] a String インポートするモジュール内からインポートされた値へローカルにアクセスするために使用される名前。
注 1

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

表 55 (参考): インポート形式から ImportEntry Record への対応
import 文の形式 [[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 Record は作成されません。

ExportEntry Record は、単一の宣言的エクスポートに関する情報を整理した Record です。各 ExportEntry Record は 表 56 で定義されるフィールドを持ちます。

表 56: ExportEntry Record のフィールド
フィールド名 値の型 意味
[[ExportName]] a String or null このモジュールによってこの束縛をエクスポートするために使用される名前。
[[ModuleRequest]] a ModuleRequest Record or null ExportDeclaration の ModuleSpecifier とインポート属性を表す ModuleRequest Record。ExportDeclaration が ModuleSpecifier を持たない場合は null。
[[ImportName]] a String, null, namespace, or all-but-default [[ModuleRequest]] によって識別されるモジュールから目的の束縛がエクスポートされる名前。ExportDeclaration が ModuleSpecifier を持たない場合は null。export * as ns from "mod" 宣言では namespace が使用されます。export * from "mod" 宣言では all-but-default が使用されます。
[[LocalName]] a String or null インポートするモジュール内から、エクスポートされた値にローカルにアクセスするために使用される名前。エクスポートされた値がモジュール内からローカルにアクセスできない場合は null。
注 2

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

表 57 (参考): エクスポート形式から ExportEntry Record への対応
export 文の形式 [[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

次の定義は、Source Text Module Record に必要な具象メソッドおよびその他の抽象操作を規定します。

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

抽象操作 ParseModule。引数 sourceText ((String または a sequence of Unicode code points))、realm (Realmレコード) および hostDefined (任意の値)。戻り値:(Source Text Moduleレコード または a non-empty List of SyntaxError objects)。 sourceText を Module として構文解析した結果に基づいて Source Text Module Record を作成します。 呼び出されると、次の手順を実行する。

  1. body を ParseText(sourceText, Module) とする。
  2. body がエラーの List である場合、body を返す。
  3. requestedModules を body の ModuleRequests とする。
  4. importEntries を body の ImportEntries とする。
  5. importedBoundNames を ImportedLocalNames(importEntries) とする。
  6. indirectExportEntries を新しい空の List とする。
  7. localExportEntries を新しい空の List とする。
  8. starExportEntries を新しい空の List とする。
  9. exportEntries を body の ExportEntries とする。
  10. exportEntries の各 ExportEntry Record exportEntry について、次を行う。
    1. exportEntry.[[ModuleRequest]] が null である場合、
      1. importedBoundNames が exportEntry.[[LocalName]] を含まない場合、
        1. exportEntry を localExportEntries に追加する。
      2. そうでない場合、
        1. 注記: 元々別のモジュールからインポートされた束縛または namespace オブジェクトをエクスポートする場合、ExportEntry Record は、その束縛または namespace オブジェクトがインポート後にエクスポートされたのではなく、元のモジュールから直接再エクスポートされた場合と同じ形式になるよう書き換えられる。これにより、export * from を通じて同じ名前で同じ束縛または namespace を2回エクスポートすることから生じる競合を、Source Text Module Record の ResolveExport 具象メソッド の手順 9.e.iii で曖昧として扱うのではなく無視できる。
        2. importEntry を、[[LocalName]] が exportEntry.[[LocalName]] である importEntries の要素とする。
        3. ExportEntry Record { [[ModuleRequest]]: importEntry.[[ModuleRequest]], [[ImportName]]: importEntry.[[ImportName]], [[LocalName]]: null, [[ExportName]]: exportEntry.[[ExportName]] } を indirectExportEntries に追加する。
    2. そうでなく、exportEntry.[[ImportName]] が all-but-default である場合、
      1. 表明: exportEntry.[[ExportName]] は null である。
      2. exportEntry を starExportEntries に追加する。
    3. そうでない場合、
      1. exportEntry を indirectExportEntries に追加する。
  11. async を body 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 } を返す。
注

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

16.2.1.7.2 Module Record 抽象メソッドの実装

以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Source Text Module Record の具象メソッドです。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

a Source Text Module Record moduleの具象メソッド GetExportedNames。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード))。戻り値:リスト (要素:String)。 呼び出されると、次の手順を実行する。

  1. 表明: module.[[Status]] は new ではない。
  2. exportStarSet が存在しない場合、exportStarSet を新しい空の List に設定する。
  3. exportStarSet が module を含む場合、
    1. 表明: export * の循環性の開始点に到達した。
    2. 新しい空の List を返す。
  4. module を exportStarSet に追加する。
  5. exportedNames を新しい空の List とする。
  6. module.[[LocalExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。
    1. 表明: module はこのエクスポートに対する直接束縛を提供する。
    2. 表明: exportEntry.[[ExportName]] は null ではない。
    3. exportEntry.[[ExportName]] を exportedNames に追加する。
  7. module.[[IndirectExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。
    1. 表明: module はこのエクスポートについて特定の束縛をインポートする。
    2. 表明: exportEntry.[[ExportName]] は null ではない。
    3. exportEntry.[[ExportName]] を exportedNames に追加する。
  8. module.[[StarExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。
    1. 表明: exportEntry.[[ModuleRequest]] は null ではない。
    2. requestedModule を GetImportedModule(module, exportEntry.[[ModuleRequest]]) とする。
    3. starNames を requestedModule.GetExportedNames(exportStarSet) とする。
    4. starNames の各要素 name について、次を行う。
      1. name が "default" でない場合、
        1. exportedNames が name を含まない場合、
          1. name を exportedNames に追加する。
  9. exportedNames を返す。
注

GetExportedNames は、曖昧な star export 束縛を持つ名前を除外せず、それらについて例外もスローしません。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

a Source Text Module Record moduleの具象メソッド ResolveExport。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード、null または ambiguous)。

ResolveExport は、インポートされた束縛を、実際に定義しているモジュールとローカル束縛名へ解決しようとします。定義元モジュールは、このメソッドが呼び出された Module Record によって表されるモジュールである場合も、そのモジュールがインポートする別のモジュールである場合もあります。パラメーター resolveSet は、解決されない循環 import/export 経路を検出するために使用されます。特定の Module Record と exportName からなる組が、すでに resolveSet に存在する状態で再び到達された場合、インポートの循環性が発生しています。ResolveExport を再帰的に呼び出す前に、module と exportName からなる組が resolveSet に追加されます。

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

呼び出されると、次の手順を実行する。

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

16.2.1.7.3 Cyclic Module Record 抽象メソッドの実装

以下は、表 42 で定義された対応する Cyclic Module Record 抽象メソッドを実装する Source Text Module Record の具象メソッドです。

16.2.1.7.3.1 InitializeEnvironment ( )

a Source Text Module Record moduleの具象メソッド InitializeEnvironment。引数なし。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. module.[[IndirectExportEntries]] の各 ExportEntry Record exportEntry について、次を行う。
    1. 表明: exportEntry.[[ExportName]] は null ではない。
    2. resolution を module.ResolveExport(exportEntry.[[ExportName]]) とする。
    3. resolution が null または ambiguous のいずれかである場合、SyntaxError 例外をスローする。
    4. 表明: resolution は ResolvedBinding Record である。
  2. 表明: module からのすべての名前付きエクスポートは解決可能である。
  3. realm を module.[[Realm]] とする。
  4. 表明: realm は undefined ではない。
  5. envRecord を NewModuleEnvironment(realm.[[GlobalEnv]]) とする。
  6. module.[[Environment]] を envRecord に設定する。
  7. module.[[ImportEntries]] の各 ImportEntry Record importEntry について、次を行う。
    1. importedModule を GetImportedModule(module, importEntry.[[ModuleRequest]]) とする。
    2. importEntry.[[ImportName]] が namespace である場合、
      1. namespace を GetModuleNamespace(importedModule) とする。
      2. ! envRecord.CreateImmutableBinding(importEntry.[[LocalName]], true) を実行する。
      3. ! envRecord.InitializeBinding(importEntry.[[LocalName]], namespace) を実行する。
    3. そうでない場合、
      1. 表明: importEntry.[[ImportName]] は String である。
      2. resolution を importedModule.ResolveExport(importEntry.[[ImportName]]) とする。
      3. resolution が null または ambiguous のいずれかである場合、SyntaxError 例外をスローする。
      4. resolution.[[BindingName]] が namespace である場合、
        1. namespace を GetModuleNamespace(resolution.[[Module]]) とする。
        2. ! envRecord.CreateImmutableBinding(importEntry.[[LocalName]], true) を実行する。
        3. ! envRecord.InitializeBinding(importEntry.[[LocalName]], namespace) を実行する。
      5. そうでない場合、
        1. CreateImportBinding(envRecord, importEntry.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]]) を実行する。
  8. moduleContext を新しい ECMAScript コード実行コンテキストとする。
  9. moduleContext の Function を null に設定する。
  10. 表明: module.[[Realm]] は undefined ではない。
  11. moduleContext の Realm を module.[[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. code を module.[[ECMAScriptCode]] とする。
  19. variableDecls を code の VarScopedDeclarations とする。
  20. declaredVariableNames を新しい空の List とする。
  21. variableDecls の各要素 variableDecl について、次を行う。
    1. variableDecl の BoundNames の各要素 name について、次を行う。
      1. declaredVariableNames が name を含まない場合、
        1. ! envRecord.CreateMutableBinding(name, false) を実行する。
        2. ! envRecord.InitializeBinding(name, undefined) を実行する。
        3. name を declaredVariableNames に追加する。
  22. lexicalDecls を code の LexicallyScopedDeclarations とする。
  23. privateEnv を null とする。
  24. lexicalDecls の各要素 lexicalDecl について、次を行う。
    1. lexicalDecl の BoundNames の各要素 name について、次を行う。
      1. lexicalDecl の IsConstantDeclaration が true である場合、
        1. ! envRecord.CreateImmutableBinding(name, true) を実行する。
      2. そうでない場合、
        1. ! envRecord.CreateMutableBinding(name, false) を実行する。
      3. lexicalDecl が FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである場合、
        1. funcObj を、引数 envRecord および privateEnv を指定した lexicalDecl の InstantiateFunctionObject とする。
        2. ! envRecord.InitializeBinding(name, funcObj) を実行する。
  25. moduleContext を実行コンテキストスタックから削除する。
  26. unused を返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

a Source Text Module Record moduleの具象メソッド ExecuteModule。省略可能な引数 capability (PromiseCapabilityレコード)。戻り値:(正常完了 (値:unused) または throw 完了)。 呼び出されると、次の手順を実行する。

  1. 表明: module はリンクされており、そのモジュール環境内の宣言はインスタンス化済みである。
  2. moduleContext を module.[[Context]] とする。
  3. module.[[HasTLA]] が false である場合、
    1. 表明: capability は存在しない。
    2. env を module.[[Environment]] とする。
    3. 実行中の実行コンテキストを一時停止する。
    4. moduleContext を実行コンテキストスタックにプッシュする。これで moduleContext が実行中の実行コンテキストになる。
    5. result を Completion(module.[[ECMAScriptCode]] の Evaluation) とする。
    6. result を Completion(DisposeResources(env.[[DisposableResourceStack]], result)) に設定する。
    7. moduleContext を一時停止し、実行コンテキストスタックから削除する。
    8. 現在実行コンテキストスタックの先頭にあるコンテキストを、実行中の実行コンテキストとして再開する。
    9. result が中断完了である場合、
      1. ? result を返す。
  4. そうでない場合、
    1. 表明: capability は PromiseCapability Record である。
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行する。
  5. unused を返す。

16.2.1.8 Synthetic Module Record

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

注
Synthetic Module Record は、たとえば JSON モジュールや CSS モジュールなど、さまざまなモジュール型を定義するために使用できます。

表 39 で定義されるフィールドに加えて、Synthetic Module Record は 表 58 に列挙される追加のフィールドを持ちます。

表 58: Synthetic Module Record の追加フィールド
フィールド名 値の型 意味
[[ExportNames]] a List of Strings モジュールのエクスポート名。このリストには重複は含まれません。
[[EvaluationSteps]] an Abstract Closure モジュールの評価時に実行する初期化ロジックであり、Synthetic Module Record を唯一の引数として取ります。[[ExportNames]] を変更してはなりません。中断完了を返す場合があります。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

抽象操作 CreateDefaultExportSyntheticModule。引数 defaultExport (ECMAScript 言語値)。戻り値:Synthetic Moduleレコード。 デフォルトエクスポートが defaultExport である Synthetic Module Record を作成します。 呼び出されると、次の手順を実行する。

  1. realm を現在の Realm Record とする。
  2. setDefaultExport を、パラメーター (module) を持ち、defaultExport を捕捉し、呼び出されたときに次の手順を実行する新しい Abstract Closure とする。
    1. SetSyntheticModuleExport(module, "default", defaultExport) を実行する。
    2. NormalCompletion(unused) を返す。
  3. Synthetic Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport } を返す。

16.2.1.8.2 ParseJSONModule ( source )

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

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

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

抽象操作 SetSyntheticModuleExport。引数 module (Synthetic Moduleレコード)、exportName (String) および exportValue (ECMAScript 言語値)。戻り値:unused。 Synthetic Module Record の既存のエクスポートについて、エクスポートされる値を設定または変更するために使用できます。 呼び出されると、次の手順を実行する。

  1. 表明: module.[[ExportNames]] は exportName を含む。
  2. envRecord を module.[[Environment]] とする。
  3. 表明: envRecord は empty ではない。
  4. ! envRecord.SetMutableBinding(exportName, exportValue, true) を実行する。
  5. unused を返す。

16.2.1.8.4 Module Record 抽象メソッドの実装

以下は、表 40 で定義された対応する Module Record 抽象メソッドを実装する Synthetic Module Record の具象メソッドです。

16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )

a Synthetic Module Record moduleの具象メソッド LoadRequestedModules。省略可能な引数 hostDefined (任意の値)。戻り値:Promise。 呼び出されると、次の手順を実行する。

  1. 注記: この LoadRequestedModules の実装は hostDefined を使用しない。
  2. ! PromiseResolve(%Promise%, undefined) を返す。
注
Synthetic Module Record は依存関係を持ちません。

16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )

a Synthetic Module Record moduleの具象メソッド GetExportedNames。省略可能な引数 exportStarSet (リスト (要素:Source Text Moduleレコード))。戻り値:リスト (要素:String)。 呼び出されると、次の手順を実行する。

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

16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )

a Synthetic Module Record moduleの具象メソッド ResolveExport。引数 exportName (String)および省略可能な引数 resolveSet (リスト (要素:レコード (フィールド:[[Module]] (Moduleレコード), [[ExportName]] (String))))。戻り値:(ResolvedBindingレコード、null または ambiguous)。 呼び出されると、次の手順を実行する。

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

16.2.1.8.4.4 Link ( )

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

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

16.2.1.8.4.5 Evaluate ( )

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

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

16.2.1.9 GetImportedModule ( referrer, request )

抽象操作 GetImportedModule。引数 referrer (Cyclic Moduleレコード) および request (ModuleRequestレコード)。戻り値:Moduleレコード。 呼び出されると、次の手順を実行する。

  1. records を、ModuleRequestsEqual(r, request) が true となる referrer.[[LoadedModules]] の各 LoadedModuleRequest Record r からなる List とする。
  2. 表明: この抽象操作を呼び出す前に referrer に対する LoadRequestedModules が正常に完了しているため、records は正確に1つの要素を持つ。
  3. record を records の唯一の要素とする。
  4. record.[[Module]] を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

ホスト定義の抽象操作 HostLoadImportedModule。引数 referrer ((Scriptレコード、Cyclic Moduleレコード または Realmレコード))、moduleRequest (ModuleRequestレコード)、hostDefined (任意の値) および payload ((GraphLoadingStateレコード または PromiseCapabilityレコード))。戻り値:unused。

注 1

referrer が Realm Record になり得る場合の例として、Web ブラウザーホストがあります。そこで、ユーザーが次のようなコントロールをクリックした場合、

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

import() 式が実行される時点では、アクティブなスクリプトまたはモジュールは存在しません。より一般的には、ホストが null の ScriptOrModule 構成要素を持つ実行コンテキストを実行コンテキストスタックにプッシュする任意の状況で、このことが発生し得ます。

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

  • ホスト環境は、同期的または非同期的に FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行しなければなりません。ここで result は、読み込まれた Module Record を含む正常完了またはスロー完了のいずれかです。
  • この操作が、次の条件を満たす2つの (referrer, moduleRequest) の組について複数回呼び出された場合、

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

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

  • moduleRequest.[[Attributes]] が、entry.[[Key]] が "type" であり、entry.[[Value]] が "json" である項目 entry を持つ場合、ホスト環境が FinishLoadingImportedModule(referrer, moduleRequest, payload, result) を実行するとき、result は ParseJSONModule の呼出しによって返された Completion Record またはスロー完了のいずれかでなければなりません。

  • この操作は payload を、FinishLoadingImportedModule へそのまま渡される不透明な値として扱わなければなりません。

実際に実行される処理はホスト定義ですが、通常は適切な Module Record を読み込むために必要な I/O 操作を実行することから構成されます。複数の異なる (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) の三つ組が、同じ Module Record インスタンスへ対応付けられる場合があります。実際の対応付けの意味論はホスト定義ですが、通常は対応付け処理の一部として specifier に正規化処理が適用されます。一般的な正規化処理には、相対パスおよび省略されたパス指定子の展開などの処理が含まれます。

注 2

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

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

抽象操作 FinishLoadingImportedModule。引数 referrer ((Scriptレコード、Cyclic Moduleレコード または Realmレコード))、moduleRequest (ModuleRequestレコード)、payload ((GraphLoadingStateレコード または PromiseCapabilityレコード)) および result ((正常完了 (値:Moduleレコード) または throw 完了))。戻り値:unused。 呼び出されると、次の手順を実行する。

  1. result が正常完了である場合、
    1. referrer.[[LoadedModules]] が、ModuleRequestsEqual(record, moduleRequest) が true である LoadedModuleRequest Record record を含む場合、
      1. 表明: record.[[Module]] と result.[[Value]] は同じ Module Record である。
    2. そうでない場合、
      1. LoadedModuleRequest Record { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } を referrer.[[LoadedModules]] に追加する。
  2. payload が GraphLoadingState Record である場合、
    1. ContinueModuleLoading(payload, result) を実行する。
  3. そうでない場合、
    1. ContinueDynamicImport(payload, result) を実行する。
  4. unused を返す。

16.2.1.12 AllImportAttributesSupported ( attrs )

抽象操作 AllImportAttributesSupported。引数 attrs (リスト (要素:ImportAttributeレコード))。戻り値:Boolean。 呼び出されると、次の手順を実行する。

  1. supported を HostGetSupportedImportAttributes() とする。
  2. attrs の各 ImportAttribute Record attr について、次を行う。
    1. supported が attr.[[Key]] を含まない場合、false を返す。
  3. true を返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

ホスト定義の抽象操作 HostGetSupportedImportAttributes。引数なし。戻り値:リスト (要素:String)。 ホスト環境が、サポートするインポート属性を指定できるようにします。サポートされているキーを持つ属性だけがホストへ提供されます。

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

  • サポートされる属性をそれぞれ示す String の List を返さなければなりません。
  • この操作が呼び出されるたびに、同じ内容を同じ順序で持つ同じ List を返さなければなりません。

HostGetSupportedImportAttributes の既定の実装は、新しい空の List を返すことです。

注
ホストにすべての属性を渡してから、処理するものをホスト自身に選択させるのではなく、サポートするインポート属性をホストに指定させる目的は、サポートされていない属性が異なるホスト間で一貫した方法で処理されることを保証するためです。

16.2.1.13 GetModuleNamespace ( module )

抽象操作 GetModuleNamespace。引数 module (instance of a concrete subclass of Moduleレコード)。戻り値:a Module Namespace Object。 module のエクスポートを表す Module Namespace Object を取得します。最初に要求されたときに遅延作成し、以後の取得のために module.[[Namespace]] に保存します。 呼び出されると、次の手順を実行する。

  1. 表明: module が Cyclic Module Record である場合、module.[[Status]] は new でも unlinked でもない。
  2. namespace を module.[[Namespace]] とする。
  3. namespace が empty である場合、
    1. exportedNames を module.GetExportedNames() とする。
    2. unambiguousNames を新しい空の List とする。
    3. exportedNames の各要素 name について、次を行う。
      1. resolution を module.ResolveExport(name) とする。
      2. resolution が ResolvedBinding Record である場合、name を unambiguousNames に追加する。
    4. namespace を ModuleNamespaceCreate(module, unambiguousNames) に設定する。
  4. namespace を返す。
注

GetModuleNamespace がスローすることはありません。代わりに、解決不能な名前はこの時点で namespace から単純に除外されます。それらがどこからも明示的に要求されない曖昧な star export だけでない限り、後で実際のリンクエラーになります。

16.2.1.14 Runtime Semantics: Evaluation

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

ModuleItemList の値は、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 ,opt } 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 }

16.2.2.2 Static Semantics: ImportEntries

構文指向操作 ImportEntries。引数なし。戻り値:リスト (要素:ImportEntryレコード)。 次の生成規則ごとに定義される。

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1 を ModuleItemList の ImportEntries とする。
  2. entries2 を ModuleItem の ImportEntries とする。
  3. entries1 と entries2 のリスト連結を返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空の List を返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. module を ImportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 module を指定した ImportClause の ImportEntriesForModule を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空の List を返す。

16.2.2.3 Static Semantics: ImportEntriesForModule

構文指向操作 ImportEntriesForModule。引数 module (ModuleRequestレコード)。戻り値:リスト (要素:ImportEntryレコード)。 次の生成規則ごとに定義される。

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1 を、引数 module を指定した ImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を、引数 module を指定した NameSpaceImport の ImportEntriesForModule とする。
  3. entries1 と entries2 のリスト連結を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1 を、引数 module を指定した ImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を、引数 module を指定した NamedImports の ImportEntriesForModule とする。
  3. entries1 と entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
  1. localName を ImportedBinding の BoundNames の唯一の要素とする。
  2. defaultEntry を ImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } とする。
  3. « defaultEntry » を返す。
NameSpaceImport : * as ImportedBinding
  1. localName を ImportedBinding の StringValue とする。
  2. entry を ImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: localName } とする。
  3. « entry » を返す。
NamedImports : { }
  1. 新しい空の List を返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1 を、引数 module を指定した ImportsList の ImportEntriesForModule とする。
  2. specs2 を、引数 module を指定した ImportSpecifier の ImportEntriesForModule とする。
  3. specs1 と specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
  1. localName を ImportedBinding の BoundNames の唯一の要素とする。
  2. entry を ImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } とする。
  3. « entry » を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importName を ModuleExportName の StringValue とする。
  2. localName を ImportedBinding の StringValue とする。
  3. entry を ImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } とする。
  4. « entry » を返す。

16.2.2.4 Static Semantics: WithClauseToAttributes

構文指向操作 WithClauseToAttributes。引数なし。戻り値:リスト (要素:ImportAttributeレコード)。 次の生成規則ごとに定義される。

WithClause : with { }
  1. 新しい空の List を返す。
WithClause : with { WithEntries ,opt }
  1. attrs を WithEntries の WithClauseToAttributes とする。
  2. attrs を、その [[Key]] フィールドの辞書式順序に従って並べ替える。各フィールドの値は UTF-16 コード単位値の列として扱う。注記: この並べ替えが観測可能なのは、属性が列挙された順序に基づいてホストが動作を変更することを禁止されるという点だけである。
  3. attrs を返す。
WithEntries : AttributeKey : StringLiteral
  1. key を AttributeKey の PropName とする。
  2. entry を ImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. « entry » を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. key を AttributeKey の PropName とする。
  2. entry を ImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. rest を WithEntries の WithClauseToAttributes とする。
  4. « entry » と rest のリスト連結を返す。

16.2.3 エクスポート

構文

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export [lookahead ∉ { using, await }] 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 ,opt } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 Static Semantics: 早期エラー

ExportDeclaration : export NamedExports ; 注

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

16.2.3.2 Static Semantics: ExportedBindings

構文指向操作 ExportedBindings。引数なし。戻り値:リスト (要素:String)。

注

ExportedBindings は、Module の ExportedNames と明示的に関連付けられたローカルに束縛された名前です。

次の生成規則ごとに定義される。

ModuleItemList : ModuleItemList ModuleItem
  1. names1 を ModuleItemList の ExportedBindings とする。
  2. names2 を ModuleItem の ExportedBindings とする。
  3. names1 と names2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空の List を返す。
ExportDeclaration : export NamedExports ;
  1. NamedExports の ExportedBindings を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatement の BoundNames を返す。
ExportDeclaration : export Declaration
  1. Declaration の BoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. この ExportDeclaration の BoundNames を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1 を ExportsList の ExportedBindings とする。
  2. names2 を ExportSpecifier の ExportedBindings とする。
  3. names1 と names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue である List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が最初の ModuleExportName の StringValue である List を返す。

16.2.3.3 Static Semantics: ExportedNames

構文指向操作 ExportedNames。引数なし。戻り値:リスト (要素:String)。

注

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

次の生成規則ごとに定義される。

ModuleItemList : ModuleItemList ModuleItem
  1. names1 を ModuleItemList の ExportedNames とする。
  2. names2 を ModuleItem の ExportedNames とする。
  3. names1 と names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclaration の ExportedNames を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClause の ExportedNames を返す。
ExportFromClause : *
  1. 新しい空の List を返す。
ExportFromClause : * as ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue である List を返す。
ExportFromClause : NamedExports
  1. NamedExports の ExportedNames を返す。
ExportDeclaration : export VariableStatement
  1. VariableStatement の BoundNames を返す。
ExportDeclaration : export Declaration
  1. Declaration の BoundNames を返す。
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1 を ExportsList の ExportedNames とする。
  2. names2 を ExportSpecifier の ExportedNames とする。
  3. names1 と names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue である List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が2番目の ModuleExportName の StringValue である List を返す。

16.2.3.4 Static Semantics: ExportEntries

構文指向操作 ExportEntries。引数なし。戻り値:リスト (要素:ExportEntryレコード)。 次の生成規則ごとに定義される。

Module : [empty]
  1. 新しい空の List を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1 を ModuleItemList の ExportEntries とする。
  2. entries2 を ModuleItem の ExportEntries とする。
  3. entries1 と entries2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空の List を返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. module を ExportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 module を指定した ExportFromClause の ExportEntriesForModule を返す。
ExportDeclaration : export NamedExports ;
  1. 引数 null を指定した NamedExports の ExportEntriesForModule を返す。
ExportDeclaration : export VariableStatement
  1. entries を新しい空の List とする。
  2. names を VariableStatement の BoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export Declaration
  1. entries を新しい空の List とする。
  2. names を Declaration の BoundNames とする。
  3. names の各要素 name について、次を行う。
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加する。
  4. entries を返す。
ExportDeclaration : export default HoistableDeclaration
  1. names を HoistableDeclaration の BoundNames とする。
  2. localName を names の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } である List を返す。
ExportDeclaration : export default ClassDeclaration
  1. names を ClassDeclaration の BoundNames とする。
  2. localName を names の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } である List を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entry を ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } とする。
  2. « entry » を返す。
注

"*default*" は、この仕様内で匿名のデフォルトエクスポート値を表す合成名として使用されます。詳細については この注記 を参照してください。

16.2.3.5 Static Semantics: ExportEntriesForModule

構文指向操作 ExportEntriesForModule。引数 module ((ModuleRequestレコード または null))。戻り値:リスト (要素:ExportEntryレコード)。 次の生成規則ごとに定義される。

ExportFromClause : *
  1. entry を ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } とする。
  2. « entry » を返す。
ExportFromClause : * as ModuleExportName
  1. exportName を ModuleExportName の StringValue とする。
  2. entry を ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: null, [[ExportName]]: exportName } とする。
  3. « entry » を返す。
NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1 を、引数 module を指定した ExportsList の ExportEntriesForModule とする。
  2. specs2 を、引数 module を指定した ExportSpecifier の ExportEntriesForModule とする。
  3. specs1 と specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. sourceName を ModuleExportName の StringValue とする。
  2. module が null である場合、
    1. localName を sourceName とする。
    2. importName を null とする。
  3. そうでない場合、
    1. localName を null とする。
    2. importName を sourceName とする。
  4. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } である List を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName を最初の ModuleExportName の StringValue とする。
  2. exportName を2番目の ModuleExportName の StringValue とする。
  3. module が null である場合、
    1. localName を sourceName とする。
    2. importName を null とする。
  4. そうでない場合、
    1. localName を null とする。
    2. importName を sourceName とする。
  5. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } である List を返す。

16.2.3.6 Static Semantics: ReferencedBindings

構文指向操作 ReferencedBindings。引数なし。戻り値:リスト (要素:構文解析ノード)。 次の生成規則ごとに定義される。

NamedExports : { }
  1. 新しい空の List を返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1 を ExportsList の ReferencedBindings とする。
  2. names2 を ExportSpecifier の ReferencedBindings とする。
  3. names1 と names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportName の ReferencedBindings を返す。
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. VariableStatement の ? Evaluation を返す。
ExportDeclaration : export Declaration
  1. Declaration の ? Evaluation を返す。
ExportDeclaration : export default HoistableDeclaration
  1. HoistableDeclaration の ? Evaluation を返す。
ExportDeclaration : export default ClassDeclaration
  1. value を ClassDeclaration の ? BindingClassDeclarationEvaluation とする。
  2. className を ClassDeclaration の BoundNames の唯一の要素とする。
  3. className が "*default*" である場合、
    1. envRecord を実行中の実行コンテキストの LexicalEnvironment とする。
    2. ? InitializeBoundName("*default*", value, envRecord) を実行する。
  4. empty を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression) が true である場合、
    1. value を、引数 "default" を指定した AssignmentExpression の ? NamedEvaluation とする。
  2. そうでない場合、
    1. rhs を AssignmentExpression の ? Evaluation とする。
    2. value を ? GetValue(rhs) とする。
  3. envRecord を実行中の実行コンテキストの LexicalEnvironment とする。
  4. ? InitializeBoundName("*default*", value, envRecord) を実行する。
  5. empty を返す。