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

16.1 スクリプト

構文

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

16.1.1 静的意味論: 早期エラー

Script : ScriptBody
  • ScriptBody の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーである。
  • ScriptBody の LexicallyDeclaredNames の任意の要素が ScriptBody の VarDeclaredNames にも出現する場合、構文エラーである。
ScriptBody : StatementList
  • super を含むソーステキストが直接 eval によって処理される eval コードでない限り、StatementListsuper を含む場合は構文エラーである。直接 eval 内での super に関する追加の早期エラー規則19.2.1.1 で定義されている。
  • NewTarget を含むソーステキストが直接 eval によって処理される eval コードでない限り、StatementListNewTarget を含む場合は構文エラーである。直接 eval での NewTarget に関する追加の早期エラー規則19.2.1.1 で定義されている。
  • 引数 « » での StatementList の ContainsDuplicateLabels が true の場合、構文エラーである。
  • 引数 « » での StatementList の ContainsUndefinedBreakTarget が true の場合、構文エラーである。
  • 引数 « » と « » での StatementList の ContainsUndefinedContinueTarget が true の場合、構文エラーである。
  • ScriptBody を含むソーステキストが直接 eval によって処理される eval コードでない限り、引数 « » での StatementList の AllPrivateIdentifiersValid が false の場合は構文エラーである。

16.1.2 静的意味論: ScriptIsStrict : Boolean

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Script : ScriptBodyopt
  1. ScriptBody が存在し、ScriptBody の Directive Prologue に Use Strict Directive が含まれている場合は true を返し、そうでなければ false を返す。

16.1.3 実行時意味論: 評価

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

16.1.4 Script Record

Script Record は、評価されるスクリプトに関する情報をカプセル化する。各 Script RecordTable 37 にリストされたフィールドを含む。

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

16.1.5 ParseScript ( sourceText, realm, hostDefined )

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

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

実装は、そのスクリプトソーステキストに対する ParseScript の評価より前に、スクリプトソーステキストを解析し早期エラー条件を分析してもよい。ただし、エラーの報告は、この仕様が実際にそのソーステキストに対して 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 を実行コンテキストスタックにプッシュする;scriptContext が実行中の実行コンテキストとなる。
  11. scriptscriptRecord.[[ECMAScriptCode]] とする。
  12. resultCompletion(GlobalDeclarationInstantiation(script, globalEnv)) とする。
  13. result が通常完了の場合、
    1. resultCompletion(Evaluation of script) に設定する。
    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 Parse Node) and env (Global Environment Record) and returns unused を含む通常完了か投げ完了. script は実行コンテキストが確立される Script である。env は束縛が作成されるグローバル環境である。

Note 1

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

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

  1. lexNamesscript の LexicallyDeclaredNames とする。
  2. varNamesscript の VarDeclaredNames とする。
  3. lexNames の各要素 name について、
    1. HasLexicalDeclaration(env, name) が true の場合、SyntaxError 例外を投げる。
    2. hasRestrictedGlobal を ? HasRestrictedGlobalProperty(env, name) とする。
    3. 注: グローバル var および function 束縛(非 strict 直接 eval によって導入されるものを除く)は非設定可能であり、したがって制限されたグローバルプロパティである。
    4. hasRestrictedGlobaltrue の場合、SyntaxError 例外を投げる。
  4. varNames の各要素 name について、
    1. HasLexicalDeclaration(env, name) が true の場合、SyntaxError 例外を投げる。
  5. varDeclarationsscript の VarScopedDeclarations とする。
  6. functionsToInitialize を新しい空のリストとする。
  7. declaredFunctionNames を新しい空のリストとする。
  8. varDeclarations の各要素 d について、逆順で、
    1. dVariableDeclarationForBinding、または BindingIdentifier のいずれでもない場合、
      1. Assert: dFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclaration、または AsyncGeneratorDeclaration のいずれかである。
      2. 注: 同じ名前に対して複数の関数宣言がある場合、最後の宣言が使用される。
      3. fnd の BoundNames の唯一の要素とする。
      4. declaredFunctionNamesfn を含まない場合、
        1. fnDefinable を ? CanDeclareGlobalFunction(env, fn) とする。
        2. fnDefinablefalse の場合、TypeError 例外を投げる。
        3. fndeclaredFunctionNames に追加する。
        4. dfunctionsToInitialize の最初の要素として挿入する。
  9. declaredVarNames を新しい空のリストとする。
  10. varDeclarations の各要素 d について、
    1. dVariableDeclarationForBinding、または BindingIdentifier のいずれかの場合、
      1. d の BoundNames の各文字列 vn について、
        1. declaredFunctionNamesvn を含まない場合、
          1. vnDefinable を ? CanDeclareGlobalVar(env, vn) とする。
          2. vnDefinablefalse の場合、TypeError 例外を投げる。
          3. declaredVarNamesvn を含まない場合、
            1. vndeclaredVarNames に追加する。
  11. 注: グローバルオブジェクトが通常のオブジェクトの場合、このアルゴリズムステップ以降に異常終了は発生しない。ただし、グローバルオブジェクトが Proxy exotic オブジェクトの場合、以下のステップの一部で異常終了を引き起こす動作を示すことがある。
  12. Normative Optional
    ホストが Web ブラウザであるか、または ブロックレベル Function 宣言 (Web レガシー互換意味論) をサポートする場合、
    1. strictscript の ScriptIsStrict とする。
    2. strictfalse の場合、
      1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNames のリスト連結とする。
      2. script Contains xtrue となる任意の BlockCaseClause、または DefaultClause xStatementList に直接含まれる各 FunctionDeclaration f について、
        1. FfBindingIdentifier の StringValue とする。
        2. FunctionDeclaration fFBindingIdentifier として持つ VariableStatement で置き換えても script に早期エラーが発生しない場合、
          1. HasLexicalDeclaration(env, F) が false の場合、
            1. fnDefinable を ? CanDeclareGlobalVar(env, F) とする。
            2. fnDefinabletrue の場合、
              1. 注: F の var 束縛は、VarDeclaredName でも他の FunctionDeclaration の名前でもない場合にのみここでインスタンス化される。
              2. declaredFunctionOrVarNamesF を含まない場合、
                1. CreateGlobalVarBinding(env, F, false) を実行する。
                2. FdeclaredFunctionOrVarNames に追加する。
              3. FunctionDeclaration f が評価されるとき、15.2.6 で提供される FunctionDeclaration 評価アルゴリズムの代わりに次の手順を実行する:
                1. gEnv を実行中の実行コンテキストの VariableEnvironment とする。
                2. bEnv を実行中の実行コンテキストの LexicalEnvironment とする。
                3. fObj を ! bEnv.GetBindingValue(F, false) とする。
                4. gEnv.SetMutableBinding(F, fObj, false) を実行する。
                5. unused を返す。
  13. lexDeclarationsscript の LexicallyScopedDeclarations とする。
  14. privateEnvnull とする。
  15. lexDeclarations の各要素 d について、
    1. 注: 字句的に宣言された名前はここでインスタンス化されるが初期化されない。
    2. d の BoundNames の各要素 dn について、
      1. d の IsConstantDeclaration が true の場合、
        1. env.CreateImmutableBinding(dn, true) を実行する。
      2. そうでなければ、
        1. env.CreateMutableBinding(dn, false) を実行する。
  16. functionsToInitialize の各 Parse Node f について、
    1. fnf の BoundNames の唯一の要素とする。
    2. fo を引数 envprivateEnv での f の InstantiateFunctionObject とする。
    3. CreateGlobalFunctionBinding(env, fn, fo, false) を実行する。
  17. declaredVarNames の各文字列 vn について、
    1. CreateGlobalVarBinding(env, vn, false) を実行する。
  18. unused を返す。
Note 2

16.1.1 で指定された早期エラーは、単一の Script に含まれる宣言について、function/var 宣言と let/const/class 宣言の間の名前の競合、および let/const/class 束縛の再宣言を防ぐ。ただし、複数の Script にまたがるそのような競合と再宣言は、GlobalDeclarationInstantiation 中に実行時エラーとして検出される。そのようなエラーが検出された場合、スクリプトの束縛はインスタンス化されない。ただし、グローバルオブジェクトが Proxy exotic オブジェクトを使用して定義されている場合、競合する宣言の実行時テストが信頼できない場合があり、異常完了となり一部のグローバル宣言がインスタンス化されない可能性がある。これが発生した場合、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 静的意味論: 早期エラー

ModuleBody : ModuleItemList
  • ModuleItemList の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーである。
  • ModuleItemList の LexicallyDeclaredNames の任意の要素が ModuleItemList の VarDeclaredNames にも出現する場合、構文エラーである。
  • ModuleItemList の ExportedNames に重複するエントリが含まれている場合、構文エラーである。
  • ModuleItemList の ExportedBindings の任意の要素が ModuleItemList の VarDeclaredNames または LexicallyDeclaredNames のいずれにも出現しない場合、構文エラーである。
  • ModuleItemListsuper を含む場合、構文エラーである。
  • ModuleItemListNewTarget を含む場合、構文エラーである。
  • 引数 « » での ModuleItemList の ContainsDuplicateLabels が true の場合、構文エラーである。
  • 引数 « » での ModuleItemList の ContainsUndefinedBreakTarget が true の場合、構文エラーである。
  • 引数 « » と « » での ModuleItemList の ContainsUndefinedContinueTarget が true の場合、構文エラーである。
  • 引数 « » での ModuleItemList の AllPrivateIdentifiersValid が false の場合、構文エラーである。
Note

重複する ExportedNames ルールは、ModuleBody 内で複数の export default ExportDeclaration 項目が構文エラーであることを意味する。競合または重複する宣言に関する追加のエラー条件は、Module の評価に先立つモジュールリンキング中にチェックされる。そのようなエラーが検出された場合、Module は評価されない。

ModuleExportName : StringLiteral
  • IsStringWellFormedUnicode(SV of StringLiteral) が false の場合、構文エラーである。

16.2.1.2 静的意味論: ImportedLocalNames ( importEntries: ImportEntry Record のリスト, ): 文字列のリスト

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. importEntries によって定義されるすべてのローカル名束縛のリストを作成する。 It performs the following steps when called:

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

16.2.1.3 ModuleRequest Record

ModuleRequest Record は、指定されたインポート属性でモジュールをインポートするリクエストを表す。次のフィールドで構成される:

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

LoadedModuleRequest Record は、モジュールをインポートするリクエストと結果として得られる Module Record を一緒に表す。表 Table 38 で定義された同じフィールドに加えて、[[Module]] が追加される:

Table 39: LoadedModuleRequest Record フィールド
フィールド名 値の型 意味
[[Specifier]] 文字列 モジュール指定子
[[Attributes]] ImportAttribute Record のリスト インポート属性
[[Module]] Module Record このモジュールリクエストに対応するロードされたモジュール

ImportAttribute Record は次のフィールドで構成される:

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

16.2.1.3.1 ModuleRequestsEqual ( left, right )

The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest Record または LoadedModuleRequest Record) and right (ModuleRequest Record または LoadedModuleRequest Record) 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 Record l について、
    1. rightAttrsl.[[Key]]r.[[Key]]l.[[Value]]r.[[Value]] である ImportAttribute Record r が含まれていない場合、false を返す。
  8. true を返す。

16.2.1.4 静的意味論: ModuleRequests : ModuleRequest Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空のリストを返す。
ModuleItemList : ModuleItem
  1. ModuleItem の ModuleRequests を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. requestsModuleItemList の ModuleRequests とする。
  2. additionalRequestsModuleItem の ModuleRequests とする。
  3. additionalRequests の各 ModuleRequest Record mr について、
    1. requestsModuleRequestsEqual(mr, mr2) が true である ModuleRequest Record mr2 が含まれていない場合、
      1. mrrequests に追加する。
  4. requests を返す。
ModuleItem : StatementListItem
  1. 新しい空のリストを返す。
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClause の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifier の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifier の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClause の SV とする。
  2. 唯一の要素が ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » } であるリストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClause の SV とする。
  2. attributesWithClause の WithClauseToAttributes とする。
  3. 唯一の要素が ModuleRequest Record { [[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 抽象モジュールレコード

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

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

Module Record は Table 41 にリストされたフィールドを定義する。すべての Module Definition サブクラスには、少なくともこれらのフィールドが含まれる。Module Record はまた、Table 42 の抽象メソッドリストも定義する。すべての Module definition サブクラスは、これらの抽象メソッドの具象実装を提供しなければならない。

Table 41: Module Record フィールド
フィールド名 値の型 意味
[[Realm]] Realm Record このモジュールが作成されたレルム。
[[Environment]] Module Environment Record または empty このモジュールのトップレベル束縛を含む Environment Record。このフィールドはモジュールがリンクされるときに設定される。
[[Namespace]] Object または empty このモジュールに対して作成されている場合の Module Namespace Object(28.3)。
[[HostDefined]] 任意(デフォルト値は undefined モジュールに追加情報を関連付ける必要があるホスト環境による使用のために予約されたフィールド。
Table 42: Module Record の抽象メソッド
メソッド 目的
LoadRequestedModules([hostDefined])

すべての依存関係を再帰的にロードしてモジュールをリンキング用に準備し、プロミスを返す。

GetExportedNames([exportStarSet])

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

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

ResolveExport(exportName [, resolveSet])

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

この操作が特定の exportName, resolveSet ペアを引数として呼び出されるたびに、同じ結果を返さなければならない。

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

Link()

すべてのモジュール依存関係を遷移的に解決し、Module Environment Record を作成してモジュールを評価用に準備する。

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

Evaluate()

このモジュールとその依存関係の評価のプロミスを返す。評価が成功した場合または既に正常に評価されている場合は解決し、評価エラーまたは既に評価に失敗している場合は拒否する。プロミスが拒否された場合、ホストはプロミス拒否を処理し、評価エラーを再スローすることが期待される。

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

16.2.1.5.1 EvaluateModuleSync ( module )

The abstract operation EvaluateModuleSync takes argument module (Module Record) and returns unused を含む通常完了か投げ完了. 呼び出し元が module の評価が既に決定されたプロミスを返すことを保証する場合に、module を同期的に評価する。 It performs the following steps when called:

  1. Assert: moduleCyclic 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. ThrowCompletion(promise.[[PromiseResult]]) を返す。
  5. unused を返す。

16.2.1.6 循環モジュールレコード (Cyclic Module Records)

Cyclic Module Record は、Cyclic Module Record 型のサブクラスである他のモジュールと依存サイクルを形成し得るモジュールに関する情報を表現するために用いられる。Cyclic Module Record 型のサブクラスではない Module Record は、Source Text Module Record との依存サイクルに参加してはならない。

Table 41 で定義されたフィールドに加えて、Cyclic Module RecordTable 43 に列挙される追加フィールドを持つ。

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

Table 42 で定義されたメソッドに加えて、Cyclic Module RecordTable 44 に列挙される追加抽象メソッドを持つ。

Table 44: Cyclic Module Record の追加抽象メソッド
メソッド 目的
InitializeEnvironment() すべてのインポート束縛解決を含めモジュールの Environment Record を初期化し、実行コンテキストを作成する。
ExecuteModule([promiseCapability]) モジュールのコードをその実行コンテキスト内で評価。[[HasTLA]]true の場合は PromiseCapability Record が引数で渡され、その capability を resolve / reject する責務を持つ。この場合メソッドは例外を throw せず、必要なら PromiseCapability Record を reject しなければならない。

GraphLoadingState Record はモジュールグラフの読み込み過程に関する情報を保持し、HostLoadImportedModule 呼び出し後の読み込み継続に用いる。各 GraphLoadingState RecordTable 45 で定義されるフィールドを持つ:

Table 45: GraphLoadingState Record フィールド
フィールド名 値の型 意味
[[PromiseCapability]] PromiseCapability Record 読み込み処理完了時に解決する Promise。
[[IsLoading]] Boolean 成功またはエラーでまだ終了していなければ true
[[PendingModulesCount]] 非負整数 保留中の HostLoadImportedModule 呼び出し数を追跡。
[[Visited]] Cyclic Module Record のリスト 現在の読み込み過程ですでにロードされた Cyclic Module Record のリスト。循環依存による無限ループ防止。
[[HostDefined]] 任意(初期値 empty LoadRequestedModules 呼び出し元から HostLoadImportedModule へ渡すホスト定義データ。

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

以下は Table 42 で定義された Module Record 抽象メソッドを実装する Cyclic Module Record の具象メソッドである。

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

The LoadRequestedModules concrete method of Cyclic Module Record module takes optional argument hostDefined (anything) and returns Promise. module の依存グラフ内すべての Module Record[[LoadedModules]] を埋める(実作業の大半は補助関数 InnerModuleLoading が行う)。オプションの hostDefinedHostLoadImportedModule フックに渡される。 It performs the following steps when called:

  1. hostDefined が与えられないなら hostDefinedempty とする。
  2. pc を ! NewPromiseCapability(%Promise%) とする。
  3. stateGraphLoadingState Record { [[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 Record) and module (Module Record) and returns unused. LoadRequestedModules により再帰的に module 依存グラフの実際の読み込みを行うために使用される。 It performs the following steps when called:

  1. Assert: state.[[IsLoading]]true
  2. もし moduleCyclic Module Record で、module.[[Status]]new、かつ state.[[Visited]]module を含まないなら
    1. modulestate.[[Visited]] に追加する。
    2. requestedModulesCountmodule.[[RequestedModules]] の要素数とする。
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCount に設定。
    4. module.[[RequestedModules]] の各 ModuleRequest Record request について
      1. AllImportAttributesSupported(request.[[Attributes]]) が false なら
        1. errorThrowCompletion(新たに生成した 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. 注: HostLoadImportedModuleFinishLoadingImportedModule を呼び、ContinueModuleLoading を通じてグラフ読み込みに再突入する。
      4. state.[[IsLoading]]false なら unused を返す。
  3. Assert: state.[[PendingModulesCount]] ≥ 1。
  4. state.[[PendingModulesCount]] を 1 減らす。
  5. もし state.[[PendingModulesCount]] = 0 なら
    1. state.[[IsLoading]]false に設定。
    2. state.[[Visited]] の各 Cyclic Module Record loaded について
      1. もし loaded.[[Status]]new なら 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 Record) and moduleCompletion (モジュール Record を含む通常完了または throw completion) 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 Cyclic Module Record module takes no arguments and returns unused を含む通常完了または throw completion. 成功時、Link はこのモジュールの [[Status]]unlinked から linked に遷移させる。失敗時は例外を投げ、[[Status]]unlinked のまま。(実作業の大半は補助関数 InnerModuleLinking が行う。) It performs the following steps when called:

  1. Assert: module.[[Status]]unlinked, linked, evaluating-async, evaluated のいずれか。
  2. stack を新しい空リストとする。
  3. resultCompletion(InnerModuleLinking(module, stack, 0)) とする。
  4. もし resultabrupt completion なら
    1. stack の各 Cyclic Module Record m について
      1. Assert: m.[[Status]]linking
      2. m.[[Status]]unlinked に設定。
    2. Assert: module.[[Status]]unlinked
    3. result を返す。
  5. Assert: module.[[Status]]linked, evaluating-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 (Module Record), stack (Cyclic Module Record のリスト), and index (非負整数) and returns 非負整数を含む通常完了または throw completion. Link により module および依存グラフの他モジュールを再帰的にリンクする。stackindex、および各モジュールの [[DFSAncestorIndex]] は DFS 走査管理に用いられる。特に [[DFSAncestorIndex]] は強連結成分 (SCC) を発見し、その全モジュールを一括で linked に遷移させるために使われる。 It performs the following steps when called:

  1. moduleCyclic Module Record でないなら
    1. module.Link() を実行。
    2. index を返す。
  2. もし module.[[Status]]linking, linked, evaluating-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 Record request について
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleLinking(requiredModule, stack, index) に設定。
    3. もし requiredModuleCyclic Module Record なら
      1. Assert: requiredModule.[[Status]]linking, linked, evaluating-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: requiredModuleCyclic Module Record
      4. requiredModule.[[Status]]linked に設定。
      5. もし requiredModulemodule が同一なら donetrue に。
  14. index を返す。

16.2.1.6.1.3 Evaluate ( )

The Evaluate concrete method of Cyclic Module Record module takes no arguments and returns Promise. Evaluate は [[Status]]linked から evaluating-async または evaluated に遷移させる。与えられた強連結成分で最初に呼ばれたモジュールについては Promise を作成し、評価完了時に解決する。その Promise は成分の [[CycleRoot]][[TopLevelCapability]] に保持され、成分内の他モジュールでの後続呼び出しも同じ Promise を返す。(実作業の大半は補助関数 InnerModuleEvaluation が行う。) It performs the following steps when called:

  1. Assert: この Evaluate 呼び出しと同時並行で同エージェント内の別の Evaluate 呼び出しは起こっていない。
  2. Assert: module.[[Status]]linked, evaluating-async, evaluated のいずれか。
  3. もし module.[[Status]]evaluating-async または evaluated なら modulemodule.[[CycleRoot]] に置き換える。
  4. もし module.[[TopLevelCapability]]empty でないなら
    1. module.[[TopLevelCapability]].[[Promise]] を返す。
  5. stack を新しい空リストとする。
  6. capability を ! NewPromiseCapability(%Promise%) とする。
  7. module.[[TopLevelCapability]]capability に設定。
  8. resultCompletion(InnerModuleEvaluation(module, stack, 0)) とする。
  9. もし resultabrupt completion なら
    1. stack の各 Cyclic Module Record m について
      1. Assert: m.[[Status]]evaluating
      2. Assert: m.[[AsyncEvaluationOrder]]unset
      3. m.[[Status]]evaluated に設定。
      4. m.[[EvaluationError]]result に設定。
    2. Assert: module.[[Status]]evaluated
    3. Assert: module.[[EvaluationError]]result は同じ Completion Record
    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. 注: 評価が同期的に完了したことを意味する。
      2. Assert: module.[[AsyncEvaluationOrder]]unset
      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 (Module Record), stack (Cyclic Module Record のリスト), and index (非負整数) and returns 非負整数を含む通常完了または throw completion. Evaluate が実際の評価処理を module および依存グラフ上の他モジュールへ再帰的に行う。stack, index および module.[[DFSAncestorIndex]] の用途は InnerModuleLinking と同様。 It performs the following steps when called:

  1. moduleCyclic 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. 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 Record request について
    1. requiredModuleGetImportedModule(module, request) とする。
    2. index を ? InnerModuleEvaluation(requiredModule, stack, index) に設定。
    3. もし requiredModuleCyclic Module Record なら
      1. Assert: requiredModule.[[Status]]evaluating, evaluating-async, evaluated のいずれか。
      2. Assert: requiredModule.[[Status]]evaluating であることと stack に含まれることは同値。
      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]] を 1 増やす。
        2. requiredModule.[[AsyncParentModules]]module を追加。
  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: requiredModuleCyclic Module Record
      4. Assert: requiredModule.[[AsyncEvaluationOrder]]整数 または unset
      5. もし requiredModule.[[AsyncEvaluationOrder]]unset なら requiredModule.[[Status]]evaluated に。
      6. それ以外は evaluating-async に。
      7. もし requiredModulemodule が同一なら donetrue に。
      8. requiredModule.[[CycleRoot]]module に設定。
  17. index を返す。
Note 1

モジュールは InnerModuleEvaluation に走査されている間 evaluating[[HasTLA]]true か非同期依存がある場合、実行中は evaluating-async、完了後 evaluated

Note 2

非同期サイクルに属するモジュールに依存するモジュールは、サイクルが evaluating でない間、そのサイクルのルート ([[CycleRoot]]) の実行に依存する。これによりサイクル全体をルート状態を介した単一の強連結成分として扱える。

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

The abstract operation ExecuteAsyncModule takes argument module (Cyclic Module Record) 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 を捕捉し呼び出し時に以下を行う新しい Abstract Closure とする:
    1. AsyncModuleExecutionFulfilled(module) を実行。
    2. NormalCompletion(undefined) を返す。
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « ») とする。
  6. rejectedClosure を、引数 (error) を取り module を捕捉し以下を行う Abstract Closure とする:
    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 (Cyclic Module Record) and execList (Cyclic Module Record のリスト) and returns unused. It performs the following steps when called:

  1. module.[[AsyncParentModules]] の各 Cyclic Module Record 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]] を 1 減らす。
      6. もし 0 なら
        1. execListm を追加。
        2. もし m.[[HasTLA]]false なら GatherAvailableAncestors(m, execList) を実行。
  2. unused を返す。
Note

非同期実行が root module で充足された際、この関数は同期的に一括実行可能なモジュール集合を決定し execList を構築する。

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

The abstract operation AsyncModuleExecutionFulfilled takes argument module (Cyclic Module Record) 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 は同一 Module Record
    2. ! Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») を実行。
  8. execList を空リストとする。
  9. GatherAvailableAncestors(module, execList) を実行。
  10. Assert: execList の全要素は [[AsyncEvaluationOrder]]整数[[PendingAsyncDependencies]] が 0、[[EvaluationError]]empty
  11. sortedExecListexecList[[AsyncEvaluationOrder]] 昇順で並べたリストとする。
  12. sortedExecList の各 Cyclic Module Record m について
    1. もし m.[[Status]]evaluated なら
      1. Assert: m.[[EvaluationError]]empty ではない。
    2. Else if m.[[HasTLA]]true なら
      1. ExecuteAsyncModule(m) を実行。
    3. Else
      1. resultm.ExecuteModule() とする。
      2. もし resultabrupt completion なら
        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 (Cyclic Module Record) 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. 注: 対称性のため doneInnerModuleEvaluation では [[EvaluationError]]empty でない場合 [[AsyncEvaluationOrder]] は利用されない。
  9. module.[[AsyncParentModules]] の各 Cyclic Module Record m について
    1. AsyncModuleExecutionRejected(m, error) を実行。
  10. もし module.[[TopLevelCapability]]empty でないなら
    1. Assert: module.[[CycleRoot]]module は同一。
    2. ! Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error ») を実行。
  11. unused を返す。

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

この非規範節では、よくあるモジュールグラフのリンクおよび評価例と、エラー発生の様態に焦点を当てた事例を示す。

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

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

先にエラー条件が無いと仮定する。ホストが最初に A.LoadRequestedModules() を呼ぶと、仮定により成功裏に完了し、再帰的に BC の依存(それぞれ 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 が成功した後 B で失敗(例: BC に存在しないものを import)すれば、当初の A.Link() は失敗し、AB[[Status]]unlinked のまま。C[[Status]]linked に達している。

最後に、Link() 成功後の評価エラーを含むケース。CInnerModuleEvaluation が成功後、B で失敗(例: B のコードが例外を投げる)すると、A.Evaluate() は拒否された Promise を返す。例外は AB 双方の [[EvaluationError]] に記録され、それらの [[Status]]evaluated。一方 Cevaluated になるが、例外はなく [[EvaluationError]] は空。例外を保存することで後続の Evaluate() 呼び出しでも同一例外に遭遇する。(ホストCyclic Module Record を再利用する義務も、例外オブジェクトを外部に露出する義務もないが、仕様として可能にしている。)

次に別種のエラー条件を考える:

Figure 3: 解決不能モジュールを含むモジュールグラフ
モジュール A が ??? という未解決モジュールに依存するモジュールグラフ

このシナリオではモジュール A が他モジュールへの依存を宣言するが、その Module Record が存在しない(HostLoadImportedModuleFinishLoadingImportedModule へ例外で返す)。リソース不存在や ParseModule がエラーを返した場合などが要因。ホストFinishLoadingImportedModule へ渡す completion を通じて失敗原因を公開できる。いずれにせよ例外は読み込み失敗を引き起こし、A[[Status]]new のまま。

読み込み・リンク・評価エラーの差異は以下の特徴による:

  • 評価は副作用をもたらすため一度だけ行うべきで、成功/失敗を記録しておく必要がある(失敗時も同じ例外を保持しないと後続 Evaluate() が新規例外を合成する必要が出る)。
  • リンクは副作用がなく、失敗しても後から再試行できる。
  • 読み込みはホストとの緊密な相互作用があり、一時的ネットワーク不調などで失敗したロードをユーザが再試行できることが望まれる場合がある。

次にサイクルを持つモジュールグラフ:

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

エントリポイントを A と仮定し、ホストA.LoadRequestedModules() を呼ぶ。これは A 上で InnerModuleLoading を行い、さらに B, C 上でも呼ぶ。サイクルにより再び A に対する InnerModuleLoading がトリガーされるが、その依存読み込みは既に開始済みなので無操作。グラフ中すべてが正常にロードされると、全ての [[Status]] が同時に new から unlinked に。

続いて A.Link() により AInnerModuleLinking を行い、B に再帰。サイクルで再度 A に来るが既に linking なので無操作。Blinking のまま制御が A に戻り CInnerModuleLinkingClinked になると AB は同時に linking から linked へ(強連結成分単位で同時遷移できるよう DFS)。

成功ケースでは評価段階も同様の物語。

次に A がリンクエラー(例: C に存在しない束縛 import)を持つケース。上述のステップは(二度目の InnerModuleLinking(A) 早期リターン含め)進むが、最初の InnerModuleLinking(A) に戻って InitializeEnvironment(C.ResolveExport() 後)で失敗。SyntaxErrorA.Link へ伝播し、stack 上の linking モジュール(A, B)を unlinked へ戻す。Clinked のまま。

別に A が評価エラー(ソースが例外 throw)ケース。評価版のステップが進み、二度目の InnerModuleEvaluation(A) から早期戻り後、最初へ戻って失敗。例外は A.Evaluate() へ伝播し、stack 上の evaluating モジュールと [[AsyncParentModules]] 経由(top-level await 連鎖)にエラーを記録。A, Bevaluated となり両 [[EvaluationError]] に記録、C は例外なく evaluated

最後に、全モジュールが非同期に完了するサイクル付きグラフ:

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

読み込みとリンクは同様で全て [[Status]] linked

A.Evaluate() は A, B, DInnerModuleEvaluation を呼び evaluating に。再度 A に当たるが evaluating のため無操作。ここで D.[[PendingAsyncDependencies]] = 0 なので ExecuteAsyncModule(D) を呼び PromiseCapability 付きで D.ExecuteModule。戻って BInnerModuleEvaluationB.[[PendingAsyncDependencies]] = 1, [[AsyncEvaluationOrder]] = 1。さらに A の元へ戻り A.[[PendingAsyncDependencies]] = 1。次に C へ遷移し D(無操作)と E を訪れる。E は依存もサイクル参加もないため ExecuteAsyncModule(E) を呼び直ちにスタックから除去。戻って C.[[AsyncEvaluationOrder]] = 3。A の依存ループ完了後 A.[[AsyncEvaluationOrder]] = 4 を設定し、強連結成分全体をスタックから除去、全モジュールを一度に evaluating-async。状態は Table 46 の通り。

Table 46: 初回 Evaluate() 呼び出し後のフィールド
Field
Module
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 (BC) 1 (D) 2 (DE) 0 0

最初に E が終了すると仮定。終了で AsyncModuleExecutionFulfilled が呼ばれ E.[[Status]] = evaluatedC.[[PendingAsyncDependencies]] が 1 に減少。状態は Table 47

Table 47: モジュール E 実行完了後フィールド
Field
Module
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 (3) で B を先に処理: B.[[PendingAsyncDependencies]] が 0、ExecuteAsyncModule(B) で実行開始。C.[[PendingAsyncDependencies]] も 0 になり C も実行(B が await を含めば並列)。状態は Table 48

Table 48: モジュール D 実行完了後フィールド
Field
Module
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]] = evaluatedA.[[PendingAsyncDependencies]] が 1 に。状態は Table 49

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

次いで B が終了。AsyncModuleExecutionFulfilled が呼ばれ B.[[Status]] = evaluatedA.[[PendingAsyncDependencies]] が 0 となり ExecuteAsyncModule が呼ばれ実行開始。状態は Table 50

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

最後に A が終了し AsyncModuleExecutionFulfilled を再度呼び A.[[Status]] = evaluatedA.[[TopLevelCapability]] の Promise(A.Evaluate() が返したもの)が解決され終了。状態は Table 51

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

別の失敗例として B 完了前に C がエラーで失敗。AsyncModuleExecutionRejected が呼ばれ C.[[Status]] = evaluated, C.[[EvaluationError]] にエラーを設定し、AsyncParentModules へ伝播。状態は Table 52

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

CA に対しそのエラーで AsyncModuleExecutionRejected を呼ぶため A も同じエラーで拒否され、A.[[Status]] = evaluatedA.[[TopLevelCapability]] の Promise は拒否。状態は Table 53

Table 53: モジュール A が拒否された後フィールド
Field
Module
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C の Evaluation Error

その後 B がエラーなく完了。AsyncModuleExecutionFulfilled が呼ばれ B.[[Status]] = evaluatedGatherAvailableAncestors(B) が呼ばれるが A.[[CycleRoot]] = A が評価エラーを持つため sortedExecList に追加されず処理終了。後続で B を import する者はサイクルルート A に設定された C の評価エラーを参照して拒否を見る。状態は Table 54

Table 54: エラーグラフで B 実行完了後フィールド
Field
Module
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C の Evaluation Error empty

16.2.1.7 ソーステキストモジュールレコード (Source Text Module Records)

Source Text Module Record は、ゴール記号 Module でパースされた ECMAScript ソーステキスト (11) から定義されたモジュールに関する情報を表す。フィールドにはモジュールが import / export する名前の要約が格納され、具象メソッドはこれを利用してリンクと評価を行う。

Source Text Module Record は抽象 Module Record 型の他サブクラスと同一グラフに存在でき、Cyclic Module Record 型の他サブクラスとのサイクルにも参加できる。

Table 43 で定義されたフィールドに加え、Source Text Module RecordTable 55 に列挙される追加フィールドを持つ。各フィールドは ParseModule で初期設定される。

Table 55: Source Text Module Record の追加フィールド
フィールド名 値の型 意味
[[ECMAScriptCode]] Parse Node ゴール記号 Module でソーステキストをパースした結果。
[[Context]] ECMAScript 実行コンテキストまたは empty このモジュールに関連付けられる実行コンテキスト。環境初期化まで empty
[[ImportMeta]] Object または empty import.meta メタプロパティを通じて公開されるオブジェクト。アクセスされるまで empty
[[ImportEntries]] ImportEntry Record のリスト モジュールコードから導出された ImportEntry レコードのリスト。
[[LocalExportEntries]] ExportEntry Record のリスト モジュール内部宣言に対応する ExportEntry のリスト。
[[IndirectExportEntries]] ExportEntry Record のリスト モジュール内の再エクスポート import または export * as namespace 宣言に対応する ExportEntry のリスト。
[[StarExportEntries]] ExportEntry Record のリスト export * 宣言(export * as namespace を除く)に対応する ExportEntry のリスト。

ImportEntry Record は単一の宣言的 import を要約する Record。各 ImportEntry RecordTable 56 のフィールドを持つ:

Table 56: ImportEntry Record フィールド
フィールド名 値の型 意味
[[ModuleRequest]] ModuleRequest Record ImportDeclarationModuleSpecifier と import 属性を表す ModuleRequest Record
[[ImportName]] 文字列または namespace-object [[ModuleRequest]] が指すモジュールで束縛がエクスポートされる名前。namespace-object は対象モジュールの namespace オブジェクトを要求することを示す。
[[LocalName]] 文字列 インポート値へローカルアクセスするための名前。
Note 1

Table 57 は構文 import 形と ImportEntry フィールドの対応例を示す:

Table 57 (Informative): Import 構文と ImportEntry Record の対応
Import 文形式 [[ModuleRequest]] [[ImportName]] [[LocalName]]
import v from "mod"; "mod" "default" "v"
import * as ns from "mod"; "mod" namespace-object "ns"
import {x} from "mod"; "mod" "x" "x"
import {x as v} from "mod"; "mod" "x" "v"
import "mod"; ImportEntry Record は作成されない。

ExportEntry Record は単一の宣言的 export を要約する Record。各 ExportEntry RecordTable 58 のフィールドを持つ:

Table 58: ExportEntry Record フィールド
フィールド名 値の型 意味
[[ExportName]] 文字列または null このモジュールがこの束縛をエクスポートする際の名前。
[[ModuleRequest]] ModuleRequest Record または null ExportDeclarationModuleSpecifier と import 属性を表す ModuleRequest RecordModuleSpecifier が無い場合 null
[[ImportName]] 文字列, null, all, all-but-default [[ModuleRequest]] が指すモジュールがこの束縛をエクスポートする名前。ModuleSpecifier が無い場合 nullallexport * as ns from "mod"all-but-defaultexport * from "mod" に使用。
[[LocalName]] 文字列または null モジュール内部からエクスポート値へアクセスするためのローカル名。内部で直接アクセスできない場合 null
Note 2

Table 59 は構文 export 形と ExportEntry フィールドの対応例:

Table 59 (Informative): Export 構文と 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" all null

以下の定義は Source Text Module Record に必要な具象メソッドおよび抽象操作を規定する。

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

The abstract operation ParseModule takes arguments sourceText (ECMAScript ソーステキスト), realm (Realm Record), and hostDefined (任意) and returns Source Text Module Record または SyntaxError オブジェクトの空でないリスト. sourceTextModule としてパースした結果に基づき Source Text Module Record を生成。 It performs the following steps when called:

  1. body を ParseText(sourceText, Module) とする。
  2. body がエラーのリストなら body を返す。
  3. requestedModulesbody の ModuleRequests とする。
  4. importEntriesbody の ImportEntries とする。
  5. importedBoundNames を ImportedLocalNames(importEntries) とする。
  6. indirectExportEntries を空リスト。
  7. localExportEntries を空リスト。
  8. starExportEntries を空リスト。
  9. exportEntriesbody の ExportEntries とする。
  10. ExportEntry Record ee について
    1. もし ee.[[ModuleRequest]]null なら
      1. もし importedBoundNamesee.[[LocalName]] を含まないなら
        1. eelocalExportEntries に追加。
      2. それ以外
        1. ie[[LocalName]] = ee.[[LocalName]]importEntries 要素とする。
        2. もし ie.[[ImportName]]namespace-object なら
          1. 注: インポートされたモジュール namespace オブジェクトの再エクスポート。
          2. eelocalExportEntries に追加。
        3. それ以外
          1. 注: 単一名の再エクスポート。
          2. ExportEntry Record { [[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 Module Record 抽象メソッドの実装 (Source Text)

以下は Table 42 に対応する Source Text Module Record の具象メソッド。

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

The GetExportedNames concrete method of Source Text Module Record module takes optional argument exportStarSet (Source Text Module Record のリスト) and returns 文字列リスト. It performs the following steps when called:

  1. Assert: module.[[Status]]new でない。
  2. exportStarSet が無ければ空リストに設定。
  3. もし exportStarSetmodule を含むなら
    1. Assert: export * 循環の開始点に到達。
    2. 空リストを返す。
  4. moduleexportStarSet に追加。
  5. exportedNames を空リスト。
  6. module.[[LocalExportEntries]] の各 ExportEntry Record e について
    1. Assert: 直接束縛を提供。
    2. Assert: e.[[ExportName]]null でない。
    3. e.[[ExportName]]exportedNames に追加。
  7. module.[[IndirectExportEntries]] の各 e について
    1. Assert: 特定束縛 import の再エクスポート。
    2. Assert: e.[[ExportName]]null でない。
    3. e.[[ExportName]] を追加。
  8. module.[[StarExportEntries]] の各 e について
    1. Assert: e.[[ModuleRequest]]null でない。
    2. requestedModuleGetImportedModule(module, e.[[ModuleRequest]])。
    3. starNamesrequestedModule.GetExportedNames(exportStarSet)。
    4. n について
      1. もし n"default" なら
        1. かつ exportedNames に含まれないなら追加。
  9. exportedNames を返す。
Note

GetExportedNames は曖昧な star export の名前を除去も例外化もしない。

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

The ResolveExport concrete method of Source Text Module Record module takes argument exportName (文字列) and optional argument resolveSet ([[Module]](Module Record), [[ExportName]](文字列) を持つ Record のリスト) and returns ResolvedBinding Record, null, または ambiguous.

ResolveExport は要求されたエクスポート名を最終的な定義モジュールとローカル束縛名へ解決する。定義モジュールは自身または import 先モジュール。resolveSet は循環 import/export 経路検出に使われ、既に同一 (module, exportName) ペアが存在すれば循環で null を返す。再帰前に (module, exportName) を追加。

定義が見つかれば ResolvedBinding Record { [[Module]], [[BindingName]] } を返す。namespace のみでローカル束縛が無い場合 [[BindingName]]namespace。定義が見つからない/循環なら null、曖昧なら ambiguous を返す。

It performs the following steps when called:

  1. Assert: module.[[Status]]new でない。
  2. resolveSet がなければ空リスト。
  3. resolveSet の各 Record r について
    1. もし moduler.[[Module]] が同一で exportName = r.[[ExportName]] なら
      1. Assert: 循環 import 要求。
      2. null を返す。
  4. Record { [[Module]]: module, [[ExportName]]: exportName } を resolveSet に追加。
  5. module.[[LocalExportEntries]] の各 e について
    1. もし e.[[ExportName]] = exportName なら
      1. Assert: 直接束縛。
      2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: e.[[LocalName]] } を返す。
  6. module.[[IndirectExportEntries]] の各 e について
    1. もし e.[[ExportName]] = exportName なら
      1. Assert: e.[[ModuleRequest]]null でない。
      2. importedModuleGetImportedModule(module, e.[[ModuleRequest]])。
      3. もし e.[[ImportName]]all なら
        1. ResolvedBinding Record { [[Module]]: importedModule, [[BindingName]]: namespace } を返す。
      4. それ以外
        1. Assert: 具体的束縛 import。
        2. Assert: e.[[ImportName]] は文字列。
        3. importedModule.ResolveExport(e.[[ImportName]], resolveSet) を返す。
  7. もし exportName = "default" なら
    1. Assert: 明示的な default export 非定義。
    2. null を返す。
    3. 注: export * from "mod"default は供給されない。
  8. starResolutionnull とする。
  9. module.[[StarExportEntries]] の各 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 なら starResolution = resolution
      3. それ以外
        1. Assert: 複数の * import が同名を含む。
        2. もし resolution.[[Module]]starResolution.[[Module]] なら ambiguous
        3. もし [[BindingName]] が異なり、いずれかが namespace なら ambiguous
        4. 両方文字列かつ異なれば ambiguous
  10. starResolution を返す。

16.2.1.7.3 Cyclic Module Record 抽象メソッドの実装 (Source Text)

Table 44 で定義された Cyclic Module Record 抽象メソッドに対応する Source Text Module Record の具象メソッド。

16.2.1.7.3.1 InitializeEnvironment ( )

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

  1. module.[[IndirectExportEntries]] の各 ExportEntry Record e について
    1. Assert: e.[[ExportName]]null でない。
    2. resolutionmodule.ResolveExport(e.[[ExportName]]) とする。
    3. もし resolutionnull または ambiguous なら SyntaxError を投げる。
    4. Assert: resolution は ResolvedBinding。
  2. Assert: すべての名前付き export は解決可能。
  3. realmmodule.[[Realm]]
  4. Assert: realmundefined でない。
  5. envNewModuleEnvironment(realm.[[GlobalEnv]])。
  6. module.[[Environment]]env に設定。
  7. module.[[ImportEntries]] の各 ImportEntry Record in について
    1. importedModuleGetImportedModule(module, in.[[ModuleRequest]])。
    2. もし in.[[ImportName]]namespace-object なら
      1. namespaceGetModuleNamespace(importedModule)。
      2. env.CreateImmutableBinding(in.[[LocalName]], true)。
      3. env.InitializeBinding(in.[[LocalName]], namespace)。
    3. それ以外
      1. resolutionimportedModule.ResolveExport(in.[[ImportName]])。
      2. もし resolutionnull または ambiguous なら SyntaxError
      3. もし resolution.[[BindingName]]namespace なら
        1. namespaceGetModuleNamespace(resolution.[[Module]])。
        2. env.CreateImmutableBinding(in.[[LocalName]], true)。
        3. env.InitializeBinding(in.[[LocalName]], namespace)。
      4. それ以外
        1. CreateImportBinding(env, in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]])。
  8. moduleContext を新 ECMAScript 実行コンテキスト。
  9. Function を null
  10. Assert: module.[[Realm]]undefined でない。
  11. Realmmodule.[[Realm]]
  12. ScriptOrModule を module
  13. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  14. PrivateEnvironment を null
  15. module.[[Context]]moduleContext に。
  16. moduleContext を実行コンテキストスタックに push。
  17. codemodule.[[ECMAScriptCode]]
  18. varDeclarationscode の VarScopedDeclarations。
  19. declaredVarNames を空リスト。
  20. dvarDeclarations について
    1. d の BoundNames 各 dn について
      1. declaredVarNames に含まれなければ
        1. env.CreateMutableBinding(dn, false)。
        2. env.InitializeBinding(dn, undefined)。
        3. declaredVarNames に追加。
  21. lexDeclarationscode の LexicallyScopedDeclarations。
  22. privateEnvnull
  23. dlexDeclarations について
    1. d の BoundNames 各 dn について
      1. もし IsConstantDeclaration(d) が true なら
        1. env.CreateImmutableBinding(dn, true)。
      2. それ以外
        1. env.CreateMutableBinding(dn, false)。
      3. もし dFunctionDeclaration / GeneratorDeclaration / AsyncFunctionDeclaration / AsyncGeneratorDeclaration のいずれかなら
        1. fo を InstantiateFunctionObject(d, env, privateEnv)。
        2. env.InitializeBinding(dn, fo)。
  24. 実行コンテキストスタックから moduleContext を除去。
  25. unused を返す。

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

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

  1. moduleContext を新 ECMAScript 実行コンテキスト。
  2. Function を null
  3. Realmmodule.[[Realm]]
  4. ScriptOrModule を module
  5. Assert: モジュールはリンク済みで環境宣言インスタンス化済み。
  6. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  7. 実行中コンテキストを中断。
  8. もし module.[[HasTLA]]false なら
    1. Assert: capability は存在しない。
    2. moduleContext をスタックへ push。
    3. resultCompletion(Evaluation of module.[[ECMAScriptCode]])。
    4. moduleContext を中断しスタックから除去。
    5. 上位コンテキストを再開。
    6. もし resultabrupt completion なら ? result を返す。
  9. それ以外
    1. Assert: capabilityPromiseCapability Record
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) を実行。
  10. unused を返す。

16.2.1.8 シンセティックモジュールレコード (Synthetic Module Records)

Synthetic Module Record は仕様によって定義されるモジュール情報を表す。エクスポート名は作成時に静的定義され、対応値は SetSyntheticModuleExport で変化し得る。インポートや依存は持たない。

Note
Synthetic Module Record は JSON モジュールや CSS モジュールなど多様なモジュール形式を定義するために利用できる。

Table 41 で定義されたフィールドに加え、Synthetic Module Record は Table 60 の追加フィールドを持つ。

Table 60: Synthetic Module Record の追加フィールド
フィールド名 値の型 意味
[[ExportNames]] 文字列のリスト モジュールのエクスポート名(重複なし)。
[[EvaluationSteps]] Abstract Closure 評価時に実行する初期化ロジック。Synthetic Module Record を唯一の引数とし [[ExportNames]] を変更してはならない。abrupt completion を返し得る。

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 言語値) and returns Synthetic Module Record. defaultExport を default export とする Synthetic Module Record を生成。 It performs the following steps when called:

  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 )

The abstract operation ParseJSONModule takes argument source (文字列) and returns Synthetic Module Record を含む通常完了または throw completion. It performs the following steps when called:

  1. json を ? ParseJSON(source) とする。
  2. CreateDefaultExportSyntheticModule(json) を返す。

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

The abstract operation SetSyntheticModuleExport takes arguments module (Synthetic Module Record), exportName (文字列), and exportValue (ECMAScript 言語値) and returns unused. Synthetic Module Record の既存エクスポート値を設定または変更する。 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 Module Record 抽象メソッドの実装 (Synthetic)

以下は Synthetic Module RecordModule Record 抽象メソッド具象実装。

16.2.1.8.4.1 LoadRequestedModules ( )

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

  1. PromiseResolve(%Promise%, undefined) を返す。
Note
Synthetic Module Record に依存はない。

16.2.1.8.4.2 GetExportedNames ( )

The GetExportedNames concrete method of Synthetic Module Record module takes no arguments and returns 文字列リスト. It performs the following steps when called:

  1. module.[[ExportNames]] を返す。

16.2.1.8.4.3 ResolveExport ( exportName )

The ResolveExport concrete method of Synthetic Module Record module takes argument exportName (文字列) and returns ResolvedBinding Record または null. It performs the following steps when called:

  1. もし module.[[ExportNames]]exportName を含まなければ null
  2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: exportName } を返す。

16.2.1.8.4.4 Link ( )

The Link concrete method of 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]] の各文字列 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 Synthetic Module Record module takes no arguments and returns Promise. It performs the following steps when called:

  1. moduleContext を新 ECMAScript 実行コンテキスト。
  2. Function を null
  3. Realmmodule.[[Realm]]
  4. ScriptOrModule を module
  5. VariableEnvironment / LexicalEnvironment を module.[[Environment]]
  6. 実行中コンテキストを中断。
  7. moduleContext をスタックに push。
  8. stepsmodule.[[EvaluationSteps]]
  9. resultCompletion(steps(module))。
  10. moduleContext を中断・除去。
  11. 上位コンテキストを再開。
  12. pc を ! NewPromiseCapability(%Promise%)。
  13. IfAbruptRejectPromise(result, pc)。
  14. ! Call(pc.[[Resolve]], undefined, « undefined »)。
  15. pc.[[Promise]] を返す。

16.2.1.9 GetImportedModule ( referrer, request )

The abstract operation GetImportedModule takes arguments referrer (Cyclic Module Record) and request (ModuleRequest Record) and returns Module Record. It performs the following steps when called:

  1. recordsreferrer.[[LoadedModules]] のうち ModuleRequestsEqual(r, request) が true となる各 LoadedModuleRequest Record r からなるリストとする。
  2. Assert: LoadRequestedModules が referrer に正常完了しているため records は正確に 1 要素。
  3. record をその唯一要素。
  4. record.[[Module]] を返す。

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

The host-defined abstract operation HostLoadImportedModule takes arguments referrer (Script Record, Cyclic Module Record, または Realm Record), moduleRequest (ModuleRequest Record), hostDefined (任意), and payload (GraphLoadingState Record または PromiseCapability Record) and returns unused.

Note 1

referrerRealm Record になり得る例は Web ブラウザホスト。例えばユーザが

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

をクリックすると、import() 式実行時点でアクティブなスクリプトやモジュールが存在しない。ホストが ScriptOrModule null の実行コンテキストをスタックに積む状況全般で起こり得る。

HostLoadImportedModule の実装は以下要件に従う:

実際の処理はホスト定義だが、通常は適切な Module Record をロードするための各種 I/O を行う。異なる複数の (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) 組が同一 Module Record インスタンスにマップされることがある。マッピングは通常 specifier の正規化(相対・短縮パス展開など)を含む。

Note 2

上記は type: "json" でインポートされた JSON モジュールをホストがサポートすることを要求するが、type: "json" なしでの JSON モジュールサポートを禁止しない。

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

The abstract operation FinishLoadingImportedModule takes arguments referrer (Script RecordCyclic Module Record、または Realm Record), moduleRequest (ModuleRequest Record), payload (GraphLoadingState Record または PromiseCapability Record), and result (Module Record を含む通常完了または throw completion のいずれか) and returns unused. It performs the following steps when called:

  1. result が通常完了なら、
    1. もし referrer.[[LoadedModules]]ModuleRequestsEqual(record, moduleRequest) が true となる LoadedModuleRequest Record record を含むなら、
      1. Assert: record.[[Module]]result.[[Value]] は同じ Module Record である。
    2. それ以外なら、
      1. LoadedModuleRequest Record { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } を referrer.[[LoadedModules]] に追加する。
  2. payloadGraphLoadingState Record であれば、
    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 Record のリスト) and returns Boolean. It performs the following steps when called:

  1. supportedHostGetSupportedImportAttributes() とする。
  2. attributes の各 ImportAttribute Record attribute について、
    1. もし supportedattribute.[[Key]] を含まなければ false を返す。
  3. true を返す。

16.2.1.12.1 HostGetSupportedImportAttributes ( )

The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns 文字列リスト. ホスト環境がサポートする import 属性を指定できる。サポートされるキーを持つ属性のみがホストへ提供される。

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

  • 各要素がサポートされる属性を示す文字列であるリストを返さなければならない。
  • この操作が呼び出されるたびに、同一内容・同一順序の同一リストを返さなければならない。

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

Note
ホストに全ての属性を渡して選別させるのではなく、サポートしている属性キーをホストが明示することを要求する目的は、サポートされない属性の扱いを異なるホスト間で一貫させるためである。

16.2.1.13 GetModuleNamespace ( module )

The abstract operation GetModuleNamespace takes argument module (Module Record の具象サブクラスのインスタンス) and returns Module Namespace Object. module のエクスポートを表す Module Namespace Object を取得する。初回要求時に遅延生成し、以後の取得のために module.[[Namespace]] に格納する。 It performs the following steps when called:

  1. Assert: moduleCyclic Module Record なら module.[[Status]]new でも unlinked でもない。
  2. namespacemodule.[[Namespace]] とする。
  3. もし namespaceempty なら
    1. exportedNamesmodule.GetExportedNames() とする。
    2. unambiguousNames を新しい空リストとする。
    3. exportedNames の各要素 name について
      1. resolutionmodule.ResolveExport(name) とする。
      2. resolutionResolvedBinding Record なら nameunambiguousNames に追加する。
    4. namespaceModuleNamespaceCreate(module, unambiguousNames) とする。
  4. namespace を返す。
Note

GetModuleNamespace は例外を投げない。解決不能な名前はこの時点では単に namespace から除外される。それらがすべてどこからも明示的に要求されない曖昧な star export でない限り、後で実際のリンクエラーにつながる。

16.2.1.14 Runtime Semantics: Evaluation

Module : [empty]
  1. undefined を返す。
ModuleBody : ModuleItemList
  1. resultCompletion(Evaluation of ModuleItemList) とする。
  2. result が通常完了で result.[[Value]]empty なら
    1. undefined を返す。
  3. result を返す。
ModuleItemList : ModuleItemList ModuleItem
  1. sl を ? Evaluation of ModuleItemList とする。
  2. sCompletion(Evaluation of ModuleItem) とする。
  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 静的意味論: 早期エラー

ModuleItem : ImportDeclaration
  • ImportDeclaration の BoundNames に重複するエントリが含まれている場合は構文エラー。
WithClause : with { WithEntries ,opt }
  • WithClause の WithClauseToAttributes に、a.[[Key]]b.[[Key]] と同じになる 2 つの異なるエントリ ab がある場合、構文エラー。

16.2.2.2 静的意味論: ImportEntries : ImportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空リストを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemList の ImportEntries とする。
  2. entries2ModuleItem の ImportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ExportDeclaration StatementListItem
  1. 新しい空リストを返す。
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleImportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 moduleImportClause の ImportEntriesForModule を返す。
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 新しい空リストを返す。

16.2.2.3 静的意味論: ImportEntriesForModule : ImportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1 を 引数 moduleImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を 引数 moduleNameSpaceImport の ImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1 を 引数 moduleImportedDefaultBinding の ImportEntriesForModule とする。
  2. entries2 を 引数 moduleNamedImports の ImportEntriesForModule とする。
  3. entries1entries2 のリスト連結を返す。
ImportedDefaultBinding : ImportedBinding
  1. localNameImportedBinding の BoundNames の唯一の要素とする。
  2. defaultEntryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } とする。
  3. « defaultEntry » を返す。
NameSpaceImport : * as ImportedBinding
  1. localNameImportedBinding の StringValue とする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace-object, [[LocalName]]: localName } とする。
  3. « entry » を返す。
NamedImports : { }
  1. 新しい空リストを返す。
ImportsList : ImportsList , ImportSpecifier
  1. specs1 を 引数 moduleImportsList の ImportEntriesForModule とする。
  2. specs2 を 引数 moduleImportSpecifier の ImportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ImportSpecifier : ImportedBinding
  1. localNameImportedBinding の BoundNames の唯一の要素とする。
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } とする。
  3. « entry » を返す。
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameModuleExportName の StringValue とする。
  2. localNameImportedBinding の StringValue とする。
  3. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } とする。
  4. « entry » を返す。

16.2.2.4 静的意味論: WithClauseToAttributes : ImportAttribute Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

WithClause : with { }
  1. 新しい空リストを返す。
WithClause : with { WithEntries ,opt }
  1. attributesWithEntries の WithClauseToAttributes とする。
  2. attributes を各 [[Key]] フィールド値を UTF-16 符号単位列として扱い、辞書順でソートする。注: このソートが観測可能なのは、ホストが列挙順序によって挙動を変えることが禁止されている点のみである。
  3. attributes を返す。
WithEntries : AttributeKey : StringLiteral
  1. keyAttributeKey の PropName とする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. « entry » を返す。
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyAttributeKey の PropName とする。
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: StringLiteral の SV } とする。
  3. restWithEntries の WithClauseToAttributes とする。
  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 静的意味論: 早期エラー

ExportDeclaration : export NamedExports ;
  • NamedExports の ReferencedBindings に StringLiteral が含まれている場合は構文エラー。
  • NamedExports の ReferencedBindings 内の各 IdentifierName n について: n の StringValue が ReservedWord であるか、または "implements", "interface", "let", "package", "private", "protected", "public", "static" のいずれかである場合は構文エラー。
Note

上記規則により NamedExports の各 ReferencedBindings は IdentifierReference として扱われる。

16.2.3.2 静的意味論: ExportedBindings : 文字列リスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

ExportedBindings は Module の ExportedNames に明示的に関連付けられるローカル束縛名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の ExportedBindings とする。
  2. names2ModuleItem の ExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 新しい空リストを返す。
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. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ExportedBindings とする。
  2. names2ExportSpecifier の ExportedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が最初の ModuleExportName の StringValue であるリストを返す。

16.2.3.3 静的意味論: ExportedNames : 文字列リスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.

Note

ExportedNames は Module がローカル束縛名の一つに明示的に対応付ける外部可視名である。

It is defined piecewise over the following productions:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ModuleItemList の ExportedNames とする。
  2. names2ModuleItem の ExportedNames とする。
  3. names1names2 のリスト連結を返す。
ModuleItem : ExportDeclaration
  1. ExportDeclaration の ExportedNames を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportFromClause の ExportedNames を返す。
ExportFromClause : *
  1. 新しい空リストを返す。
ExportFromClause : * as ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
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. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ExportedNames とする。
  2. names2ExportSpecifier の ExportedNames とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. 唯一の要素が ModuleExportName の StringValue であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 唯一の要素が 2つ目の ModuleExportName の StringValue であるリストを返す。

16.2.3.4 静的意味論: ExportEntries : ExportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

Module : [empty]
  1. 新しい空リストを返す。
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ModuleItemList の ExportEntries とする。
  2. entries2ModuleItem の ExportEntries とする。
  3. entries1entries2 のリスト連結を返す。
ModuleItem : ImportDeclaration StatementListItem
  1. 新しい空リストを返す。
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleExportDeclaration の ModuleRequests の唯一の要素とする。
  2. 引数 moduleExportFromClause の ExportEntriesForModule を返す。
ExportDeclaration : export NamedExports ;
  1. 引数 nullNamedExports の ExportEntriesForModule を返す。
ExportDeclaration : export VariableStatement
  1. entries を新しい空リストとする。
  2. namesVariableStatement の BoundNames とする。
  3. names の各要素 name について
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加。
  4. entries を返す。
ExportDeclaration : export Declaration
  1. entries を新しい空リストとする。
  2. namesDeclaration の BoundNames とする。
  3. names の各要素 name について
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } を entries に追加。
  4. entries を返す。
ExportDeclaration : export default HoistableDeclaration
  1. namesHoistableDeclaration の BoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } であるリストを返す。
ExportDeclaration : export default ClassDeclaration
  1. namesClassDeclaration の BoundNames とする。
  2. localNamenames の唯一の要素とする。
  3. 唯一の要素が新しい ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } であるリストを返す。
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } とする。
  2. « entry » を返す。
Note

"*default*" は無名の default export 値のための合成名として仕様内で使用される。詳細は このノート を参照。

16.2.3.5 静的意味論: ExportEntriesForModule : ExportEntry Record のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

ExportFromClause : *
  1. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } とする。
  2. « entry » を返す。
ExportFromClause : * as ModuleExportName
  1. exportNameModuleExportName の StringValue とする。
  2. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all, [[LocalName]]: null, [[ExportName]]: exportName } とする。
  3. « entry » を返す。
NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. specs1 を 引数 moduleExportsList の ExportEntriesForModule とする。
  2. specs2 を 引数 moduleExportSpecifier の ExportEntriesForModule とする。
  3. specs1specs2 のリスト連結を返す。
ExportSpecifier : ModuleExportName
  1. sourceNameModuleExportName の StringValue とする。
  2. もし modulenull なら
    1. localNamesourceName とする。
    2. importNamenull とする。
  3. それ以外
    1. localNamenull とする。
    2. importNamesourceName とする。
  4. 唯一の要素が ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } であるリストを返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName を 最初の ModuleExportName の StringValue とする。
  2. exportName を 2つ目の ModuleExportName の StringValue とする。
  3. もし modulenull なら
    1. localNamesourceName とする。
    2. importNamenull とする。
  4. それ以外
    1. localNamenull とする。
    2. importNamesourceName とする。
  5. 唯一の要素が ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } であるリストを返す。

16.2.3.6 静的意味論: ReferencedBindings : Parse Node のリスト

The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:

NamedExports : { }
  1. 新しい空リストを返す。
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportsList の ReferencedBindings とする。
  2. names2ExportSpecifier の ReferencedBindings とする。
  3. names1names2 のリスト連結を返す。
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 最初の ModuleExportName の ReferencedBindings を返す。
ModuleExportName : IdentifierName
  1. 唯一の要素が IdentifierName であるリストを返す。
ModuleExportName : StringLiteral
  1. 唯一の要素が StringLiteral であるリストを返す。

16.2.3.7 実行時意味論: 評価

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. empty を返す。
ExportDeclaration : export VariableStatement
  1. ? Evaluation of VariableStatement を返す。
ExportDeclaration : export Declaration
  1. ? Evaluation of Declaration を返す。
ExportDeclaration : export default HoistableDeclaration
  1. ? Evaluation of HoistableDeclaration を返す。
ExportDeclaration : export default ClassDeclaration
  1. value を ? BindingClassDeclarationEvaluation of ClassDeclaration とする。
  2. classNameClassDeclaration の BoundNames の唯一の要素とする。
  3. もし className"*default*" なら
    1. env を実行中実行コンテキストの LexicalEnvironment とする。
    2. InitializeBoundName("*default*", value, env) を実行。
  4. empty を返す。
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression) が true なら
    1. value を 引数 "default" で ? NamedEvaluation of AssignmentExpression とする。
  2. それ以外
    1. rhs を ? Evaluation of AssignmentExpression とする。
    2. value を ? GetValue(rhs) とする。
  3. env を実行中実行コンテキストの LexicalEnvironment とする。
  4. InitializeBoundName("*default*", value, env) を実行。
  5. empty を返す。