← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
16

ECMAScript Dili: Betikler ve Modüller

16.1 Betikler (Scripts)

Sözdizimi

Script Script : ScriptBodyopt

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

16.1.1 Statik Anlambilim: Erken Hatalar

Script Script : ScriptBody

ScriptBody ScriptBody : StatementList

16.1.2 Statik Anlambilim: ScriptIsStrict

Sözdizimi yönelimli işlem (syntax-directed operation) ScriptIsStrict hiçbir argüman almaz ve bir Boole değeri döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

Script Script : ScriptBodyopt

  1. ScriptBody mevcutsa ve ScriptBody'nin Directive Prologue (Yönerge Önsözü) kısmı bir Use Strict Directive (Use Strict Yönergesi) içeriyorsa, true döndür.

  2. false döndür.

16.1.3 Çalışma Zamanı Anlambilimi: Evaluation

Script Script : [empty]

  1. undefined döndür.

16.1.4 Script Kayıtları (Script Records)

Bir Script Kaydı (Script Record), değerlendirilen bir betik hakkındaki bilgileri kapsüller. Her betik kaydı, Tablo 34 içinde listelenen alanları içerir.

Tablo 34: Script Kaydı (Script Record) Alanları

Alan Adı Değer Türü Anlamı
[[Realm]] bir Realm Kaydı (Realm Record) Bu betiğin oluşturulduğu realm.
[[ECMAScriptCode]] bir Script Ayrıştırma Düğümü (Parse Node) Bu betiğin kaynak metninin ayrıştırılmasının sonucu.
[[LoadedModules]] LoadedModuleRequest Kayıtlarının (LoadedModuleRequest Records) bir Listesi (List) Bu betik tarafından içe aktarılan belirteç dizelerinden çözümlenmiş Modül Kaydı (Module Record) eşleştirmesi. Liste, ModuleRequestsEqual(r1, r2) değeri true olacak şekilde iki farklı r1 ve r2 Kaydı (Record) içermez.
[[HostDefined]] herhangi bir şey (varsayılan değer emptydir) Betikle ek bilgi ilişkilendirmesi gereken barındırıcı ortamlar (host environments) tarafından kullanılmak üzere ayrılmış alan.

16.1.5 ParseScript ( sourceText, realm, hostDefined )

Soyut işlem ParseScript; sourceText (bir Dize veya Unicode kod noktaları dizisi), realm (bir Realm Kaydı (Realm Record)) ve hostDefined (herhangi bir şey) argümanlarını alır ve bir Script Kaydı (Script Record) ya da boş olmayan bir SyntaxError nesneleri Listesini (List) döndürür. sourceText'in bir Script as ayrıştırılmasının sonucuna dayanarak bir Script Kaydı (Script Record) oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. script, ParseText(sourceText, Script) olsun.

  2. script bir hata Listesi (List) ise, script değerini döndür.

  3. Script Kaydı (Script Record) { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined } döndür.

16.1.6 ScriptEvaluation ( scriptRecord )

Soyut işlem ScriptEvaluation; scriptRecord (bir Script Kaydı (Script Record)) argümanını alır ve bir ECMAScript dil değeri (ECMAScript language value) içeren bir normal tamamlanma (normal completion) ya da bir ani tamamlanma (abrupt completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. globalEnv, scriptRecord.[[Realm]].[[GlobalEnv]] olsun.

  2. scriptContext, yeni bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) olsun.

  3. scriptContext'in Function alanını null olarak ayarla.

  4. scriptContext'in Realm alanını scriptRecord.[[Realm]] olarak ayarla.

  5. scriptContext'in ScriptOrModule alanını scriptRecord olarak ayarla.

  6. scriptContext'in VariableEnvironment alanını globalEnv olarak ayarla.

  7. scriptContext'in LexicalEnvironment alanını globalEnv olarak ayarla.

  8. scriptContext'in PrivateEnvironment alanını null olarak ayarla.

  9. Yürütülmekte olan yürütme bağlamını (running execution context) askıya al (suspend).

  10. scriptContext'i yürütme bağlamı yığınına (execution context stack) it (push); scriptContext artık yürütülmekte olan yürütme bağlamıdır (running execution context).

  11. scriptNode, scriptRecord.[[ECMAScriptCode]] olsun.

  12. result, Completion(GlobalDeclarationInstantiation(scriptNode, globalEnv)) olsun.

  13. result bir normal tamamlanma (normal completion) ise, o zaman

    1. result değerini Completion(scriptNode'un Evaluation (Değerlendirme) değeri) olarak ayarla.

    2. result bir normal tamamlanma (normal completion) ise ve result.[[Value]] değeri empty ise, o zaman

      1. result değerini NormalCompletion(undefined) olarak ayarla.
  14. scriptContext'i askıya al ve yürütme bağlamı yığınından (execution context stack) çıkar.

  15. Assert: Yürütme bağlamı yığını (execution context stack) boş değildir.

  16. Şimdi yürütme bağlamı yığınının (execution context stack) en üstünde olan bağlamı, yürütülmekte olan yürütme bağlamı (running execution context) olarak geri sürdür (resume).

  17. Return ? result.

16.1.7 GlobalDeclarationInstantiation ( script, envRecord )

Soyut işlem GlobalDeclarationInstantiation; script (bir Script Ayrıştırma Düğümü (Parse Node)) ve envRecord (bir Global Ortam Kaydı (Global Environment Record)) argümanlarını alır ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. script, kendisi için yürütme bağlamının (execution context) kurulmakta olduğu Script'tir. envRecord, içinde bağlamaların (bindings) oluşturulacağı global ortamdır.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. lexicalNames, script'in LexicallyDeclaredNames değeri olsun.

  2. variableNames, script'in VarDeclaredNames değeri olsun.

  3. lexicalNames'in her bir name öğesi için şunları yap:

    1. HasLexicalDeclaration(envRecord, name) değeri true ise, bir SyntaxError istisnası fırlat.

    2. hasRestrictedGlobal, ? HasRestrictedGlobalProperty(envRecord, name) olsun.

    3. NOTE: Global var ve function bağlamaları (sıkı olmayan doğrudan eval (direct eval) tarafından tanıtılanlar hariç) yapılandırılamaz (non-configurable) olup dolayısıyla kısıtlanmış global özelliklerdir.

    4. hasRestrictedGlobal değeri true ise, bir SyntaxError istisnası fırlat.

  4. variableNames'in her bir name öğesi için şunları yap:

    1. HasLexicalDeclaration(envRecord, name) değeri true ise, bir SyntaxError istisnası fırlat.
  5. variableDecls, script'in VarScopedDeclarations değeri olsun.

  6. funcsToInitialize, yeni ve boş bir Liste (List) olsun.

  7. declaredFuncNames, yeni ve boş bir Liste (List) olsun.

  8. variableDecls'in her bir variableDecl öğesi için, ters Liste (List) sırasıyla şunları yap:

    1. variableDecl bir VariableDeclaration, bir ForBinding veya bir BindingIdentifier değilse, o zaman

      1. Assert: variableDecl, bir FunctionDeclaration, bir GeneratorDeclaration, bir AsyncFunctionDeclaration veya bir AsyncGeneratorDeclaration'dır.

      2. NOTE: Aynı isim için birden fazla işlev bildirimi varsa, son bildirim kullanılır.

      3. func, variableDecl'in BoundNames değerinin tek öğesi olsun.

      4. declaredFuncNames, func öğesini içermiyorsa, o zaman

         1. *funcDefinable*, ? [CanDeclareGlobalFunction](10_sec-executable-code-and-execution-contexts.md#sec-candeclareglobalfunction)(*envRecord*, *func*) olsun.
        
         2. *funcDefinable* değeri `false` ise, bir `TypeError` istisnası fırlat.
        
         3. *func* değerini *declaredFuncNames*'e ekle.
        
         4. *variableDecl* değerini *funcsToInitialize*'ın ilk öğesi olarak ekle.
  9. declaredVariableNames, yeni ve boş bir Liste (List) olsun.

  10. variableDecls'in her bir variableDecl öğesi için şunları yap:

    1. variableDecl bir VariableDeclaration, bir ForBinding veya bir BindingIdentifier ise, o zaman

      1. variableDecl'in BoundNames değerindeki her bir String vn için şunları yap:

         1. *declaredFuncNames*, *vn* öğesini içermiyorsa, o zaman
           
                   1. *vnDefinable*, ? [CanDeclareGlobalVar](10_sec-executable-code-and-execution-contexts.md#sec-candeclareglobalvar)(*envRecord*, *vn*) olsun.
           
                   2. *vnDefinable* değeri `false` ise, bir `TypeError` istisnası fırlat.
           
                   3. *declaredVariableNames*, *vn* öğesini içermiyorsa, o zaman
                     
                               1. *vn* değerini *declaredVariableNames*'e ekle.
  11. NOTE: Global nesne (global object) bir sıradan nesne (ordinary object) ise, bu algoritma adımından sonra hiçbir olağan dışı (abnormal) sonlanma gerçekleşmez. Ancak, global nesne (global object) bir Proxy egzotik nesnesi (Proxy exotic object) ise, sonraki adımların bazılarında olağan dışı sonlanmalara neden olan davranışlar sergileyebilir.

  12. Normative İsteğe Bağlı Eğer barındırıcı (host) bir web tarayıcısıysa ya da Block-Level Function Declarations Web Legacy Compatibility Semantics özelliğini başka bir şekilde destekliyorsa, o zaman

    1. strict, script'in ScriptIsStrict değeri olsun.

    2. strict değeri false ise, o zaman

      1. declaredFuncOrVariableNames, declaredFuncNames ve declaredVariableNames değerlerinin liste birleşimi (list-concatenation) olsun.

      2. script Contains (içeriyor) x değeri true olacak şekilde herhangi bir Block, CaseClause veya DefaultClause x'in StatementList'i içinde doğrudan yer alan her bir FunctionDeclaration f için şunları yap:

         1. *funcName*, *f*'nin *[BindingIdentifier](14_sec-ecmascript-language-expressions.md#prod-BindingIdentifier)*'ının [StringValue](14_sec-ecmascript-language-expressions.md#sec-static-semantics-stringvalue) değeri olsun.
        
         2. *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* *f*'yi, *funcName*'i bir *[BindingIdentifier](14_sec-ecmascript-language-expressions.md#prod-BindingIdentifier)* olarak alan bir *[VariableStatement](15_sec-ecmascript-language-statements-and-declarations.md#prod-VariableStatement)* ile değiştirmek *script* için herhangi bir Erken Hata (Early Error) üretmeyecekse, o zaman
           
                   1. [HasLexicalDeclaration](10_sec-executable-code-and-execution-contexts.md#sec-haslexicaldeclaration)(*envRecord*, *funcName*) değeri `false` ise, o zaman
                     
                               1. *funcDefinable*, ? [CanDeclareGlobalVar](10_sec-executable-code-and-execution-contexts.md#sec-candeclareglobalvar)(*envRecord*, *funcName*) olsun.
                     
                               2. *funcDefinable* değeri `true` ise, o zaman
                                 
                                             1. [NOTE](06_sec-notational-conventions.md#note-step): *funcName* için bir var bağlaması, yalnızca VarDeclaredName or the name of another *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)*.
                                 
                                             2. If *declaredFuncOrVariableNames* does not contain *funcName*, then
                                               
                                                             1. ? [CreateGlobalVarBinding](10_sec-executable-code-and-execution-contexts.md#sec-createglobalvarbinding)(*envRecord*, *funcName*, `false`) işlemini gerçekleştir.
                                               
                                                             2. *funcName* değerini *declaredFuncOrVariableNames*'e ekle.
                                 
                                             3. *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* *f* değerlendirildiğinde, [15.2.6](16_sec-ecmascript-language-functions-and-classes.md#sec-function-definitions-runtime-semantics-evaluation) içinde sunulan *[FunctionDeclaration](16_sec-ecmascript-language-functions-and-classes.md#prod-FunctionDeclaration)* [Evaluation (Değerlendirme)](09_sec-syntax-directed-operations.md#sec-evaluation) algoritması yerine aşağıdaki adımları gerçekleştir:
                                               
                                                             1. *gEnv*, [yürütülmekte olan yürütme bağlamının (running execution context)](10_sec-executable-code-and-execution-contexts.md#running-execution-context) VariableEnvironment değeri olsun.
                                               
                                                             2. *bEnv*, [yürütülmekte olan yürütme bağlamının (running execution context)](10_sec-executable-code-and-execution-contexts.md#running-execution-context) LexicalEnvironment değeri olsun.
                                               
                                                             3. *fObj*, ! *bEnv*.[GetBindingValue](10_sec-executable-code-and-execution-contexts.md#abstract-getbindingvalue)(*funcName*, `false`) olsun.
                                               
                                                             4. ? *gEnv*.[SetMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-setmutablebinding)(*funcName*, *fObj*, `false`) işlemini gerçekleştir.
                                               
                                                             5. `unused` döndür.
  13. lexicalDecls, script'in LexicallyScopedDeclarations değeri olsun.

  14. privateEnv, null olsun.

  15. lexicalDecls'in her bir lexicalDecl öğesi için şunları yap:

    1. NOTE: Sözdizimsel olarak bildirilen (lexically declared) isimler yalnızca burada örneklendirilir (instantiated) fakat başlatılmaz (initialized).

    2. lexicalDecl'in BoundNames değerindeki her bir dn öğesi için şunları yap:

      1. lexicalDecl'in IsConstantDeclaration değeri true ise, o zaman

         1. ? *envRecord*.[CreateImmutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createimmutablebinding)(*dn*, `true`) işlemini gerçekleştir.
      2. Aksi takdirde,

         1. ? *envRecord*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*dn*, `false`) işlemini gerçekleştir.
  16. funcsToInitialize'ın her bir f Ayrıştırma Düğümü (Parse Node) için şunları yap:

    1. func, f'nin BoundNames değerinin tek öğesi olsun.

    2. funcObj, envRecord ve privateEnv argümanlarıyla f'nin InstantiateFunctionObject değeri olsun.

    3. ? CreateGlobalFunctionBinding(envRecord, func, funcObj, false) işlemini gerçekleştir.

  17. declaredVariableNames'in her bir vn String'i için şunları yap:

    1. ? CreateGlobalVarBinding(envRecord, vn, false) işlemini gerçekleştir.
  18. unused döndür.

16.2 Modüller (Modules)

Sözdizimi

Module Module : ModuleBodyopt

ModuleBody ModuleBody : ModuleItemList

ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem

ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return]

ModuleExportName ModuleExportName : IdentifierName StringLiteral

16.2.1 Modül Anlambilimi

16.2.1.1 Statik Anlambilim: Erken Hatalar

ModuleBody ModuleBody : ModuleItemList

ModuleExportName ModuleExportName : StringLiteral

16.2.1.2 Statik Anlambilim: ImportedLocalNames ( importEntries )

Soyut işlem ImportedLocalNames; importEntries (bir ImportEntry Kayıtlarının (ImportEntry Records) Listesi (List)) argümanını alır ve Dizelerin bir Listesini (List) döndürür. importEntries tarafından tanımlanan tüm yerel ad bağlamalarının bir Listesini (List) oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. localNames, yeni ve boş bir Liste (List) olsun.

  2. importEntries'daki her bir ImportEntry Kaydı (ImportEntry Record) i için şunları yap:

    1. i.[[LocalName]] değerini localNames'e ekle.
  3. localNames değerini döndür.

16.2.1.3 ModuleRequest Kayıtları (ModuleRequest Records)

Bir ModuleRequest Kaydı (ModuleRequest Record), verilen içe aktarım öznitelikleriyle (import attributes) bir modülü içe aktarma isteğini temsil eder. Aşağıdaki alanlardan oluşur:

Tablo 35: ModuleRequest Kaydı (ModuleRequest Record) Alanları

Alan Adı Değer Türü Anlamı
[[Specifier]] bir String Modül belirteci (module specifier)
[[Attributes]] ImportAttribute Kayıtlarının (ImportAttribute Records) bir Listesi (List) İçe aktarım öznitelikleri (import attributes)

Bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record), elde edilen Modül Kaydı (Module Record) ile birlikte bir modülü içe aktarma isteğini temsil eder. [[Module]] alanının eklenmesiyle Tablo 35 içinde tanımlanan alanların aynısından oluşur:

Tablo 36: LoadedModuleRequest Kaydı (LoadedModuleRequest Record) Alanları

Alan Adı Değer Türü Anlamı
[[Specifier]] bir String Modül belirteci (module specifier)
[[Attributes]] ImportAttribute Kayıtlarının (ImportAttribute Records) bir Listesi (List) İçe aktarım öznitelikleri (import attributes)
[[Module]] bir Modül Kaydı (Module Record) Bu modül isteğine karşılık gelen yüklenmiş modül

Bir ImportAttribute Kaydı (ImportAttribute Record) aşağıdaki alanlardan oluşur:

Tablo 37: ImportAttribute Kaydı (ImportAttribute Record) Alanları

Alan Adı Değer Türü Anlamı
[[Key]] bir String Öznitelik anahtarı (attribute key)
[[Value]] bir String Öznitelik değeri (attribute value)
16.2.1.3.1 ModuleRequestsEqual ( x, y )

Soyut işlem ModuleRequestsEqual; x (bir ModuleRequest Kaydı (ModuleRequest Record) veya bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record)) ve y (bir ModuleRequest Kaydı (ModuleRequest Record) veya bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record)) argümanlarını alır ve bir Boole değeri döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. x.[[Specifier]] ile y.[[Specifier]] aynı değilse, false döndür.

  2. xAttrs, x.[[Attributes]] olsun.

  3. yAttrs, y.[[Attributes]] olsun.

  4. xAttrsCount, xAttrs'taki öğe sayısı olsun.

  5. yAttrsCount, yAttrs'taki öğe sayısı olsun.

  6. xAttrsCountyAttrsCount ise, false döndür.

  7. xAttrs'taki her bir ImportAttribute Kaydı (ImportAttribute Record) xAttr for şunları yap:

    1. yAttrs, xAttr.[[Key]] ile yAttr.[[Key]] aynı olan ve xAttr.[[Value]] ile yAttr.[[Value]] aynı olan bir ImportAttribute Kaydı (ImportAttribute Record) yAttr içermiyorsa, false döndür.
  8. true döndür.

16.2.1.4 Statik Anlambilim: ModuleRequests

Sözdizimi yönelimli işlem (syntax-directed operation) ModuleRequests hiçbir argüman almaz ve ModuleRequest Kayıtlarının (ModuleRequest Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

Module Module : [empty]

  1. Yeni ve boş bir Liste (List) döndür.

ModuleItemList ModuleItemList : ModuleItem

  1. ModuleItem'in ModuleRequests değerini döndür.

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. requests, ModuleItemList'in ModuleRequests değeri olsun.

  2. additionalRequests, ModuleItem'in ModuleRequests değeri olsun.

  3. additionalRequests'teki her bir ModuleRequest Kaydı (ModuleRequest Record) mr için şunları yap:

    1. requests, ModuleRequestsEqual(mr, mr2) değeri true olacak şekilde bir ModuleRequest Kaydı (ModuleRequest Record) mr2 içermiyorsa, o zaman

      1. mr değerini requests'e ekle.
  4. requests değerini döndür.

ModuleItem ModuleItem : StatementListItem

  1. Yeni ve boş bir Liste (List) döndür.

ImportDeclaration ImportDeclaration : import ImportClause FromClause ;

  1. specifier, FromClause'un SV değeri olsun.

  2. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: « » } olan bir Liste (List) döndür.

ImportDeclaration ImportDeclaration : import ImportClause FromClause WithClause ;

  1. specifier, FromClause'un SV değeri olsun.

  2. attrs, WithClause'un WithClauseToAttributes değeri olsun.

  3. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: attrs } olan bir Liste (List) döndür.

ImportDeclaration ImportDeclaration : import ModuleSpecifier ;

  1. specifier, ModuleSpecifier'ın SV değeri olsun.

  2. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: « » } olan bir Liste (List) döndür.

ImportDeclaration ImportDeclaration : import ModuleSpecifier WithClause ;

  1. specifier, ModuleSpecifier'ın SV değeri olsun.

  2. attrs, WithClause'un WithClauseToAttributes değeri olsun.

  3. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: attrs } olan bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause ;

  1. specifier, FromClause'un SV değeri olsun.

  2. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: « » } olan bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClause ;

  1. specifier, FromClause'un SV değeri olsun.

  2. attrs, WithClause'un WithClauseToAttributes değeri olsun.

  3. Tek öğesi ModuleRequest Kaydı (ModuleRequest Record) { [[Specifier]]: specifier, [[Attributes]]: attrs } olan bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;

  1. Yeni ve boş bir Liste (List) döndür.

16.2.1.5 Soyut Modül Kayıtları (Abstract Module Records)

Bir Modül Kaydı (Module Record), tek bir modülün içe aktarımları (imports) ve dışa aktarımları (exports) hakkındaki yapısal bilgileri kapsüller. Bu bilgi, birbirine bağlı modül kümelerinin içe ve dışa aktarımlarını bağlamak (link) için kullanılır. Bir Modül Kaydı (Module Record), yalnızca bir modül değerlendirilirken kullanılan dört alanı içerir.

Spesifikasyon amaçları doğrultusunda Modül Kaydı (Module Record) değerleri, Record (Kayıt) spesifikasyon türündeki değerlerdir ve Modül Kaydı'nın hem soyut hem de somut alt sınıflara sahip soyut bir sınıf olduğu basit bir nesne yönelimli hiyerarşide var olduğu düşünülebilir. Bu spesifikasyon, Cyclic Module Record (Döngüsel Modül Kaydı) adındaki soyut alt sınıfı ve onun Source Text Module Record (Kaynak Metin Modül Kaydı) adındaki somut alt sınıfını tanımlar. Diğer spesifikasyonlar ve gerçekleştirimler, kendi tanımladıkları alternatif modül tanımlama olanaklarına karşılık gelen ek Modül Kaydı (Module Record) alt sınıfları tanımlayabilir.

Modül Kaydı (Module Record), Tablo 38 içinde listelenen alanları tanımlar. Tüm Modül Tanım alt sınıfları en azından bu alanları içerir. Modül Kaydı (Module Record) ayrıca Tablo 39 içindeki soyut metot listesini tanımlar. Tüm Modül Tanım alt sınıfları bu soyut metotların somut gerçeklemelerini sağlamalıdır.

Tablo 38: Modül Kaydı (Module Record) Alanları

Alan Adı Değer Türü Anlamı
[[Realm]] bir Realm Kaydı (Realm Record) Bu modülün oluşturulduğu Realm.
[[Environment]] bir Modül Ortam Kaydı (Module Environment Record) veya empty Bu modül için üst düzey (top-level) bağlamaları içeren Ortam Kaydı (Environment Record). Bu alan modül bağlandığında (linked) ayarlanır.
[[Namespace]] bir Nesne veya empty Bu modül için oluşturulmuşsa Modül Ad Alanı Nesnesi (Module Namespace Object) (28.3).
[[HostDefined]] herhangi bir şey (varsayılan değer undefineddır) Bir modülle ek bilgi ilişkilendirmesi gereken barındırıcı ortamlar (host environments) tarafından kullanılmak üzere ayrılmış alan.

Tablo 39: Modül Kayıtlarının (Module Records) Soyut Metotları

Metot Amaç Tanımlar
LoadRequestedModules ( [ hostDefined ] ) Soyut metot LoadRequestedModules, isteğe bağlı hostDefined (herhangi bir şey) argümanını alır ve bir Promise döndürür. Modülün tüm bağımlılıklarını yinelemeli (recursively) olarak yükleyerek modülü bağlama (linking) işlemi için hazırlar. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.6.1.1 Cyclic Module Record - 16.2.1.8.4.1 Synthetic Module Record
GetExportedNames ( [ exportStarSet ] ) Soyut metot GetExportedNames, isteğe bağlı exportStarSet (bir Kaynak Metin Modül Kayıtları (Source Text Module Records) Listesi (List)) argümanını alır ve Dizelerin bir Listesini (List) döndürür. Bu modülden doğrudan veya dolaylı olarak dışa aktarılan tüm adların bir listesini döndürür. Bu metot çağrılmadan önce LoadRequestedModules başarıyla tamamlanmış olmalıdır. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.7.2.1 Source Text Module Record - 16.2.1.8.4.2 Synthetic Module Record
ResolveExport ( exportName [ , resolveSet ] ) Soyut metot ResolveExport, exportName (bir String) argümanını ve isteğe bağlı resolveSet (alanları [[Module]] (bir Modül Kaydı (Module Record)) ve [[ExportName]] (bir String) olan Kayıtların (Records) bir Listesini (List)) alır ve bir ResolvedBinding Kaydı (ResolvedBinding Record), null veya ambiguous döndürür. Bu modül tarafından dışa aktarılan bir adın bağlamasını döndürür. Bağlamalar, { [[Module]]: Modül Kaydı (Module Record), [[BindingName]]: String | namespace } biçiminde bir ResolvedBinding Kaydı (ResolvedBinding Record) ile temsil edilir. Eğer dışa aktarım, herhangi bir modülde doğrudan bağlaması olmayan bir Modül Ad Alanı Nesnesi (Module Namespace Object) ise, [[BindingName]] değeri namespace olarak ayarlanır. Ad çözümlenemezse null, birden fazla bağlama bulunursa ambiguous döndürür. Bu işlem belirli bir exportName, resolveSet çifti argümanlarıyla her çağrıldığında aynı sonucu döndürmelidir. Bu metot çağrılmadan önce LoadRequestedModules başarıyla tamamlanmış olmalıdır. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.7.2.2 Source Text Module Record - 16.2.1.8.4.3 Synthetic Module Record
Link ( ) Soyut metot Link, hiçbir argüman almaz ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Tüm modül bağımlılıklarını geçişli olarak (transitively) çözümleyerek ve bir Modül Ortam Kaydı (Module Environment Record) oluşturarak modülü değerlendirme için hazırlar. Bu metot çağrılmadan önce LoadRequestedModules başarıyla tamamlanmış olmalıdır. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.6.1.2 Cyclic Module Record - 16.2.1.8.4.4 Synthetic Module Record
Evaluate ( ) Soyut metot Evaluate, hiçbir argüman almaz ve bir Promise döndürür. Bu modülün ve bağımlılıklarının değerlendirilmesi için bir promise döndürür; değerlendirme başarılı olduğunda veya zaten başarıyla değerlendirilmişse resolve eder, bir değerlendirme hatası olduğunda veya zaten başarısız bir şekilde değerlendirilmişse reject eder. Promise reject edilirse, barındırıcıların (hosts) bu promise reddini işlemesi ve değerlendirme hatasını yeniden fırlatması (rethrow) beklenir. Bu modül bir Cyclic Module Record (Döngüsel Modül Kaydı) olmadığı sürece, döndürülen promise zaten sonuçlanmış (settled) olmalıdır. Bu metot çağrılmadan önce Link başarıyla tamamlanmış olmalıdır. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.6.1.3 Cyclic Module Record - 16.2.1.8.4.5 Synthetic Module Record
16.2.1.5.1 EvaluateModuleSync ( module )

Soyut işlem EvaluateModuleSync; module (bir Modül Kaydı (Module Record)) argümanını alır ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağıranın module'ün değerlendirilmesinin zaten sonuçlanmış (settled) bir promise döndüreceğini garanti etmesi koşuluyla, module'ü eşzamanlı (synchronously) olarak değerlendirir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module, bir Cyclic Module Record (Döngüsel Modül Kaydı) değildir.

  2. promise, module.Evaluate() olsun.

  3. Assert: promise.[[PromiseState]] değeri ya fulfilled ya da rejected'dır.

  4. If promise.[[PromiseState]] değeri rejected ise, o zaman

    1. promise.[[PromiseIsHandled]] değeri false ise, HostPromiseRejectionTracker(promise, "handle") işlemini gerçekleştir.

    2. promise.[[PromiseIsHandled]] değerini true olarak ayarla.

    3. promise.[[PromiseResult]] değerini fırlat.

  5. unused döndür.

16.2.1.6 Cyclic Module Records

Bir Cyclic Module Record (Döngüsel Modül Kaydı), Cyclic Module Record (Döngüsel Modül Kaydı) türünün alt sınıfları olan diğer modüllerle bağımlılık döngülerine katılabilecek bir modül hakkındaki bilgileri temsil etmek için kullanılır. Cyclic Module Record (Döngüsel Modül Kaydı) türünün alt sınıfı olmayan Modül Kayıtları (Module Records), Kaynak Metin Modül Kayıtları (Source Text Module Records) ile bağımlılık döngülerine katılmamalıdır.

Tablo 38 içinde tanımlanan alanlara ek olarak, Cyclic Module Kayıtları (Cyclic Module Records) Tablo 40 içinde listelenen ek alanlara sahiptir.

Tablo 40: Cyclic Module Kayıtlarının (Cyclic Module Records) Ek Alanları

Alan Adı Değer Türü Anlamı
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, veya evaluated Başlangıçta new. Modül kendi yaşam döngüsü boyunca ilerledikçe sırasıyla unlinked, linking, linked, evaluating, olası evaluating-async ve evaluated durumlarına geçiş yapar. evaluating-async, bu modülün asenkron bağımlılıklarının tamamlanması üzerine yürütülmek üzere kuyruğa alındığını veya [[HasTLA]] alanı true olan, yürütülmüş ve üst düzey tamamlanmayı bekleyen bir modül olduğunu belirtir.
[[EvaluationError]] bir fırlatma tamamlanması (throw completion) veya empty Değerlendirme sırasında meydana gelen istisnayı temsil eden bir fırlatma tamamlanması (throw completion). Herhangi bir istisna oluşmadıysa veya [[Status]] değeri evaluated değilse emptydir.
[[DFSAncestorIndex]] bir tamsayı (integer) veya empty Yalnızca Link ve Evaluate sırasında kullanılan yardımcı alan. [[Status]] değeri linking veya evaluating ise, bu değer ya modülün derinlik öncelikli dolaşım (depth-first traversal) indeksidir ya da aynı güçlü bağlı bileşendeki (strongly connected component) "daha erken" bir modülün indeksidir.
[[RequestedModules]] ModuleRequest Kayıtlarının (ModuleRequest Records) bir Listesi (List) Bu modüldeki içe aktarımlarla ilişkili ModuleRequest Kayıtlarının (ModuleRequest Records) bir Listesi (List). [Liste (List)], içe aktarımların kaynak metinde görünüş sırasına göredir.
[[LoadedModules]] LoadedModuleRequest Kayıtlarının (LoadedModuleRequest Records) bir Listesi (List) Bu kayıtla temsil edilen modül tarafından, ilgili içe aktarım öznitelikleriyle bir modülün içe aktarılmasını talep etmek için kullanılan belirteç dizelerinden (specifier strings), çözümlenmiş Modül Kaydına (Module Record) olan eşleştirmedir. Liste, ModuleRequestsEqual(r1, r2) değeri true olacak şekilde iki farklı r1 ve r2 Kaydı (Record) içermez.
[[CycleRoot]] bir Cyclic Module Kaydı (Cyclic Module Record) veya empty Döngünün ilk ziyaret edilen modülü, yani güçlü bağlı bileşenin kök DFS atasıdır. Bir döngü içinde yer almayan bir modül için bu, modülün kendisi olacaktır. Evaluate tamamlandığında, bir modülün [[DFSAncestorIndex]] değeri, kendisinin [[CycleRoot]] değerinin derinlik öncelikli dolaşım indeksidir.
[[HasTLA]] bir Boole Bu modülün bireysel olarak asenkron olup olmadığı (örneğin, üst düzey bir await içeren bir Kaynak Metin Modül Kaydı (Source Text Module Record) ise). Asenkron bir bağımlılığa sahip olmak bu alanın true olduğu anlamına gelmez. Bu alan modül ayrıştırıldıktan sonra değişmemelidir.
[[AsyncEvaluationOrder]] unset, bir tamsayı (integer), veya done Bu alan başlangıçta unset olarak ayarlanır ve tamamen senkron modüller için unset kalır. Kendisi asenkron olan ya da asenkron bir bağımlılığı olan modüller için, bekleyen modüllerin yürütülmesinin 16.2.1.6.1.3.4 tarafından kuyruğa alınma sırasını belirleyen bir tamsayıya (integer) ayarlanır. Bekleyen modül başarıyla yürütüldüğünde, alan done olarak ayarlanır.
[[TopLevelCapability]] bir PromiseCapability Kaydı (PromiseCapability Record) veya empty Eğer bu modül bazı döngülerin [[CycleRoot]] değeri ise ve o döngüdeki bazı modüller üzerinde Evaluate() çağrılmışsa, bu alan tüm o değerlendirme için PromiseCapability Kaydını (PromiseCapability Record) içerir. Evaluate() soyut metodundan döndürülen Promise nesnesini sonuçlandırmak için kullanılır. Bu modülün herhangi bir bağımlılığı için, bu bağımlılıklardan bazıları için üst düzey bir Evaluate() başlatılmadığı sürece bu alan empty olacaktır.
[[AsyncParentModules]] Cyclic Module Kayıtlarının (Cyclic Module Records) bir Listesi (List) Eğer bu modül veya bir bağımlılık [[HasTLA]] değeri true ise ve yürütme devam ediyorsa, bu alan üst düzey yürütme işi (top-level execution job) için bu modülün üst düzey içe aktarıcılarını (parent importers) izler. Bu üst modüller, bu modül yürütülmesini başarıyla tamamlamadan önce yürütmeye başlamayacaktır.
[[PendingAsyncDependencies]] bir tamsayı (integer) veya empty Eğer bu modülün herhangi bir asenkron bağımlılığı varsa, bu alan bu modül için yürütülmesi kalan asenkron bağımlılık modüllerinin sayısını izler. Asenkron bağımlılıkları olan bir modül, bu alan 0'a ulaştığında ve herhangi bir yürütme hatası olmadığında yürütülecektir.

Tablo 39 içinde tanımlanan metotlara ek olarak, Cyclic Module Kayıtları (Cyclic Module Records) Tablo 41 içinde listelenen ek metotlara sahiptir:

Tablo 41: Cyclic Module Kayıtlarının (Cyclic Module Records) Ek Soyut Metotları

Metot Amaç Tanımlar
InitializeEnvironment ( ) Soyut metot InitializeEnvironment hiçbir argüman almaz ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Modülün Ortam Kaydını (Environment Record) başlatır (tüm içe aktarılan bağlamaların çözümlenmesi dahil) ve modülün yürütme bağlamını (execution context) oluşturur. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.7.3.1 Source Text Module Record
ExecuteModule ( [ capability ] ) Soyut metot ExecuteModule, isteğe bağlı capability (bir PromiseCapability Kaydı (PromiseCapability Record)) argümanını alır ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Modülün kodunu kendi yürütme bağlamı (execution context) içinde değerlendirir. Eğer bu modülün [[HasTLA]] değeri true ise, o zaman bir PromiseCapability Kaydı (PromiseCapability Record) argüman olarak geçirilir ve metodun verilen yeteneği (capability) resolve etmesi veya reject etmesi beklenir. Bu durumda metot bir istisna fırlatmamalı (throw), bunun yerine gerekirse PromiseCapability Kaydını (PromiseCapability Record) reject etmelidir. Bu spesifikasyon kapsamında aşağıdaki türlerde tanımlara sahiptir; barındırıcılar (hosts) kendi tanımlarıyla ek türler sağlayabilir: - 16.2.1.7.3.2 Source Text Module Record

Bir GraphLoadingState Kaydı (GraphLoadingState Record), bir modül grafiğinin yükleme süreci hakkında bilgiler içeren bir Record (Kayıt) yapısıdır. HostLoadImportedModule çağrısından sonra yüklemeye devam etmek için kullanılır. Her bir GraphLoadingState Kaydı (GraphLoadingState Record), Tablo 42 içinde tanımlanan alanlara sahiptir:

Tablo 42: GraphLoadingState Kaydı (GraphLoadingState Record) Alanları

Alan Adı Değer Türü Anlamı
[[PromiseCapability]] bir PromiseCapability Kaydı (PromiseCapability Record) Yükleme işlemi tamamlandığında resolve edilecek promise.
[[IsLoading]] bir Boole Yükleme işlemi henüz ne başarıyla ne de hatayla tamamlanmamışsa doğrudur.
[[PendingModulesCount]] negatif olmayan bir tamsayı (integer) Bekleyen HostLoadImportedModule çağrılarının sayısını izler.
[[Visited]] Cyclic Module Kayıtlarının (Cyclic Module Records) bir Listesi (List) Döngüsel bağımlılıklarla sonsuz döngüye girmeyi önlemek amacıyla, mevcut yükleme işlemi tarafından zaten yüklenmiş olan Cyclic Module Kayıtlarının (Cyclic Module Records) bir listesidir.
[[HostDefined]] herhangi bir şey (varsayılan değer emptydir) LoadRequestedModules çağırıcısından HostLoadImportedModule'a geçirilecek barındırıcı tarafından tanımlanmış (host-defined) verileri içerir.
16.2.1.6.1 Module Record Soyut Metotlarının Uygulanması

Aşağıdakiler, Cyclic Module Kaydı (Cyclic Module Record) için Tablo 39 içinde tanımlanan ilgili Module Kaydı (Module Record) soyut metotlarını gerçekleştiren somut metotlardır.

16.2.1.6.1.1 LoadRequestedModules ( [ hostDefined ] )

Bir Cyclic Module Kaydının (Cyclic Module Record) module somut metodu LoadRequestedModules, isteğe bağlı hostDefined (herhangi bir şey) argümanını alır ve bir Promise döndürür. module'ün bağımlılık grafiğindeki tüm Modül Kayıtlarının (Module Records) [[LoadedModules]] alanını doldurur (işin çoğu yardımcı işlev InnerModuleLoading tarafından yapılır). HostLoadImportedModule kancasına (hook) geçirilen isteğe bağlı bir hostDefined parametresi alır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. hostDefined mevcut değilse, hostDefined değerini empty olarak ayarla.

  2. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  3. state, GraphLoadingState Kaydı (GraphLoadingState Record) { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: promiseCapability, [[HostDefined]]: hostDefined } olsun.

  4. InnerModuleLoading(state, module) işlemini gerçekleştir.

  5. promiseCapability.[[Promise]] değerini döndür.

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

Soyut işlem InnerModuleLoading; state (bir GraphLoadingState Kaydı (GraphLoadingState Record)) ve module (bir Modül Kaydı (Module Record)) argümanlarını alır ve unused döndürür. LoadRequestedModules tarafından, module'ün bağımlılık grafiği için gerçek yükleme işlemini yinelemeli (recursively) olarak gerçekleştirmek üzere kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: state.[[IsLoading]] değeri truedur.

  2. module bir Cyclic Module Kaydı (Cyclic Module Record) ise, module.[[Status]] değeri new ise ve state.[[Visited]], module öğesini içermiyorsa, o zaman

    1. module değerini state.[[Visited]]'e ekle.

    2. requestedModulesCount, module.[[RequestedModules]]'teki öğe sayısı olsun.

    3. state.[[PendingModulesCount]] değerini state.[[PendingModulesCount]] + requestedModulesCount olarak ayarla.

    4. module.[[RequestedModules]]'teki her bir ModuleRequest Kaydı (ModuleRequest Record) request için şunları yap:

      1. AllImportAttributesSupported(request.[[Attributes]]) değeri false ise, o zaman

         1. *error*, [ThrowCompletion](07_sec-ecmascript-data-types-and-values.md#sec-throwcompletion)(yeni oluşturulmuş bir `SyntaxError` nesnesi) olsun.
        
         2. [ContinueModuleLoading](#sec-ContinueModuleLoading)(*state*, *error*) işlemini gerçekleştir.
      2. Aksi takdirde, module.[[LoadedModules]] alanı, ModuleRequestsEqual(record, request) değeri true olacak şekilde bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record) record içeriyorsa, o zaman

         1. [InnerModuleLoading](#sec-InnerModuleLoading)(*state*, *record*.*[[Module]]*) işlemini gerçekleştir.
      3. Aksi takdirde,

         1. [HostLoadImportedModule](#sec-HostLoadImportedModule)(*module*, *request*, *state*.*[[HostDefined]]*, *state*) işlemini gerçekleştir.
        
         2. [NOTE](06_sec-notational-conventions.md#note-step): [HostLoadImportedModule](#sec-HostLoadImportedModule), [ContinueModuleLoading](#sec-ContinueModuleLoading) aracılığıyla grafik yükleme sürecine yeniden giren [FinishLoadingImportedModule](#sec-FinishLoadingImportedModule) işlevini çağıracaktır.
      4. state.[[IsLoading]] değeri false ise, unused döndür.

  3. Assert: state.[[PendingModulesCount]] ≥ 1'dir.

  4. state.[[PendingModulesCount]] değerini state.[[PendingModulesCount]] - 1 olarak ayarla.

  5. state.[[PendingModulesCount]] = 0 ise, o zaman

    1. state.[[IsLoading]] değerini false olarak ayarla.

    2. state.[[Visited]]'deki her bir Cyclic Module Kaydı (Cyclic Module Record) loaded için şunları yap:

      1. loaded.[[Status]] değeri new ise, loaded.[[Status]] değerini unlinked olarak ayarla.
    3. ! Call(state.[[PromiseCapability]].[[Resolve]], undefined, « undefined ») işlemini gerçekleştir.

  6. unused döndür.

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

Soyut işlem ContinueModuleLoading; state (bir GraphLoadingState Kaydı (GraphLoadingState Record)) ve moduleCompletion (bir Modül Kaydı (Module Record) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion)) argümanlarını alır ve unused döndürür. Bir HostLoadImportedModule çağrısından sonra yükleme sürecine yeniden girmek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. state.[[IsLoading]] değeri false ise, unused döndür.

  2. moduleCompletion bir normal tamamlanma (normal completion) ise, o zaman

    1. InnerModuleLoading(state, moduleCompletion.[[Value]]) işlemini gerçekleştir.
  3. Aksi takdirde,

    1. state.[[IsLoading]] değerini false olarak ayarla.

    2. ! Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] ») işlemini gerçekleştir.

  4. unused döndür.

Bir Cyclic Module Kaydının (Cyclic Module Record) module somut metodu Link, hiçbir argüman almaz ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Başarılı olduğunda, Link bu modülün [[Status]] değerini unlinked durumundan linked durumuna geçirir. Başarısızlık durumunda ise bir istisna fırlatılır ve bu modülün [[Status]] değeri unlinked olarak kalır. (İşin çoğu yardımcı işlev InnerModuleLinking tarafından yapılır.) Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[Status]] değeri unlinked, linked, evaluating-async veya evaluated durumlarından biridir.

  2. stack, yeni ve boş bir Liste (List) olsun.

  3. result, Completion(InnerModuleLinking(module, stack, 0)) olsun.

  4. result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. stack'teki her bir Cyclic Module Kaydı (Cyclic Module Record) m için şunları yap:

      1. Assert: m.[[Status]] değeri linkingdir.

      2. Set m.[[Status]] to unlinked.

    2. Assert: module.[[Status]] değeri unlinkeddir.

    3. ? result döndür.

  5. Assert: module.[[Status]] değeri linked, evaluating-async veya evaluated durumlarından biridir.

  6. Assert: stack boştur.

  7. unused döndür.

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

Soyut işlem InnerModuleLinking; module (bir Modül Kaydı (Module Record)), stack (bir Cyclic Module Kayıtlarının (Cyclic Module Records) Listesi (List)) ve index (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve negatif olmayan bir tamsayı (integer) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Link tarafından, module için gerçek bağlama (linking) işlemini gerçekleştirmek ve bağımlılık grafiğindeki diğer tüm modüller üzerinde yinelemeli (recursively) olarak uygulamak için kullanılır. stack ve index parametreleri ile bir modülün [[DFSAncestorIndex]] alanı, derinlik öncelikli arama (DFS) dolaşımını izler. Özellikle [[DFSAncestorIndex]], güçlü bağlı bileşenleri (SCCs) keşfetmek için kullanılır, böylece bir SCC'deki tüm modüller birlikte linked durumuna geçer. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module bir Cyclic Module Kaydı (Cyclic Module Record) değilse, o zaman

    1. ? module.Link() işlemini gerçekleştir.

    2. index değerini döndür.

  2. module.[[Status]] değeri linking, linked, evaluating-async veya evaluated durumlarından biriyse, o zaman

    1. index değerini döndür.
  3. Assert: module.[[Status]] değeri unlinkeddir.

  4. module.[[Status]] değerini linking olarak ayarla.

  5. moduleIndex, index olsun.

  6. module.[[DFSAncestorIndex]] değerini index olarak ayarla.

  7. index değerini index + 1 olarak ayarla.

  8. module değerini stack'e ekle.

  9. module.[[RequestedModules]]'teki her bir ModuleRequest Kaydı (ModuleRequest Record) request for şunları yap:

    1. requiredModule, GetImportedModule(module, request) olsun.

    2. index değerini ? InnerModuleLinking(requiredModule, stack, index) olarak ayarla.

    3. requiredModule bir Cyclic Module Kaydı (Cyclic Module Record) ise, o zaman

      1. Assert: requiredModule.[[Status]] değeri linking, linked, evaluating-async veya evaluated durumlarından biridir.

      2. Assert: requiredModule.[[Status]] değeri ancak ve ancak stack, requiredModule öğesini içeriyorsa linkingdir.

      3. requiredModule.[[Status]] değeri linking ise, o zaman

         1. *module*.*[[DFSAncestorIndex]]* değerini [min](06_sec-notational-conventions.md#eqn-min)(*module*.*[[DFSAncestorIndex]]*, *requiredModule*.*[[DFSAncestorIndex]]*) olarak ayarla.
  10. ? module.InitializeEnvironment() işlemini gerçekleştir.

  11. Assert: module, stack içinde tam olarak bir kez yer alır.

  12. Assert: module.[[DFSAncestorIndex]]moduleIndex dir.

  13. module.[[DFSAncestorIndex]] = moduleIndex ise, o zaman

    1. done değeri false olsun.

    2. done değeri false iken tekrarla:

      1. requiredModule, stack'in son öğesi olsun.

      2. stack'in son öğesini çıkar.

      3. Assert: requiredModule, bir Cyclic Module Kaydı (Cyclic Module Record) türüdür.

      4. requiredModule.[[Status]] değerini linked olarak ayarla.

      5. requiredModule ve module aynı Modül Kaydı (Module Record) ise, done değerini true olarak ayarla.

  14. index değerini döndür.

16.2.1.6.1.3 Evaluate ( )

Bir Cyclic Module Kaydının (Cyclic Module Record) module somut metodu Evaluate, hiçbir argüman almaz ve bir Promise döndürür. Evaluate, bu modülün [[Status]] değerini linked durumundan evaluating-async ya da evaluated durumuna geçirir. Belirli bir güçlü bağlı bileşendeki bir modül üzerinde ilk kez çağrıldığında, Evaluate, modülün değerlendirilmesi bittiğinde resolve olan bir Promise oluşturur ve döndürür. Bu Promise, bileşen için [[CycleRoot]]'un [[TopLevelCapability]] alanında saklanır. Bileşendeki herhangi bir modül üzerinde gelecekteki Evaluate çağrıları aynı Promise'i döndürür. (İşin çoğu yardımcı işlev InnerModuleEvaluation tarafından yapılır.) Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: Bu Evaluate çağrısı, çevreleyen aracı (surrounding agent) içindeki başka bir Evaluate çağrısıyla aynı anda gerçekleşmemektedir.

  2. Assert: module.[[Status]] değeri linked, evaluating-async veya evaluated durumlarından biridir.

  3. module.[[Status]] değeri evaluating-async veya evaluated ise, o zaman

    1. module.[[CycleRoot]] değeri empty değilse, o zaman

      1. module değerini module.[[CycleRoot]] olarak ayarla.
    2. Aksi takdirde,

      1. Assert: module.[[Status]] değeri evaluated dur ve module.[[EvaluationError]] değeri bir fırlatma tamamlanmasıdır (throw completion).
  4. module.[[TopLevelCapability]] değeri empty değilse, o zaman

    1. module.[[TopLevelCapability]].[[Promise]] değerini döndür.
  5. stack, yeni ve boş bir Liste (List) olsun.

  6. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  7. module.[[TopLevelCapability]] değerini promiseCapability olarak ayarla.

  8. result, Completion(InnerModuleEvaluation(module, stack, 0)) olsun.

  9. result bir ani tamamlanma (abrupt completion) ise, o zaman

    1. stack'teki her bir Cyclic Module Kaydı (Cyclic Module Record) m için şunları yap:

      1. Assert: m.[[Status]] değeri evaluatingdir.

      2. m.[[Status]] değerini evaluated olarak ayarla.

      3. m.[[EvaluationError]] değerini result olarak ayarla.

    2. Assert: module.[[Status]] değeri evaluated dur.

    3. Assert: module.[[EvaluationError]] ile result aynı Completion Kaydıdır (Completion Record).

    4. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] ») işlemini gerçekleştir.

  10. Aksi takdirde,

    1. Assert: module.[[Status]] değeri evaluating-async veya evaluated durumlarından biridir.

    2. Assert: module.[[EvaluationError]] değeri emptydir.

    3. module.[[Status]] değeri evaluated ise, o zaman

      1. Assert: module.[[AsyncEvaluationOrder]] değeri ya unset ya da donedır.

      2. NOTE: module.[[AsyncEvaluationOrder]] değeri ancak ve cautionary module zaten değerlendirilmişse ve bu değerlendirme asenkron idiyse done olur.

      3. ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») işlemini gerçekleştir.

    4. Assert: stack boştur.

  11. promiseCapability.[[Promise]] değerini döndür.

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

Soyut işlem InnerModuleEvaluation; module (bir Modül Kaydı (Module Record)), stack (bir Cyclic Module Kayıtlarının (Cyclic Module Records) Listesi (List)) ve index (negatif olmayan bir tamsayı (integer)) argümanlarını alır ve negatif olmayan bir tamsayı (integer) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Evaluate tarafından, module için gerçek değerlendirme işlemini gerçekleştirmek ve bağımlılık grafiğindeki diğer tüm modüller üzerinde yinelemeli (recursively) olarak uygulamak için kullanılır. stack ve index parametreleri ile modülün [[DFSAncestorIndex]] alanı, InnerModuleLinking işlemindekiyle aynı şekilde kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module bir Cyclic Module Kaydı (Cyclic Module Record) değilse, o zaman

    1. ? EvaluateModuleSync(module) işlemini gerçekleştir.

    2. index değerini döndür.

  2. module.[[Status]] değeri evaluating-async veya evaluated durumlarından biriyse, o zaman

    1. module.[[EvaluationError]] değeri empty ise, index değerini döndür.

    2. ? module.[[EvaluationError]] değerini döndür.

  3. module.[[Status]] değeri evaluating ise, index değerini döndür.

  4. Assert: module.[[Status]] değeri linkeddir.

  5. module.[[Status]] değerini evaluating olarak ayarla.

  6. moduleIndex, index olsun.

  7. module.[[DFSAncestorIndex]] değerini index olarak ayarla.

  8. module.[[PendingAsyncDependencies]] değerini 0 olarak ayarla.

  9. index değerini index + 1 olarak ayarla.

  10. module değerini stack'e ekle.

  11. module.[[RequestedModules]]'teki her bir ModuleRequest Kaydı (ModuleRequest Record) request için şunları yap:

    1. requiredModule, GetImportedModule(module, request) olsun.

    2. index değerini ? InnerModuleEvaluation(requiredModule, stack, index) olarak ayarla.

    3. requiredModule bir Cyclic Module Kaydı (Cyclic Module Record) ise, o zaman

      1. Assert: requiredModule.[[Status]] değeri evaluating, evaluating-async veya evaluated durumlarından biridir.

      2. Assert: requiredModule.[[Status]] değeri ancak ve ancak stack, requiredModule öğesini içeriyorsa evaluatingdir.

      3. requiredModule.[[Status]] değeri evaluating ise, o zaman

         1. *module*.*[[DFSAncestorIndex]]* değerini [min](06_sec-notational-conventions.md#eqn-min)(*module*.*[[DFSAncestorIndex]]*, *requiredModule*.*[[DFSAncestorIndex]]*) olarak ayarla.
      4. Aksi takdirde,

         1. *requiredModule* değerini *requiredModule*.*[[CycleRoot]]* olarak ayarla.
        
         2. [Assert](06_sec-notational-conventions.md#assert): *requiredModule*.*[[Status]]* değeri `evaluating-async` veya `evaluated` durumlarından biridir.
        
         3. *requiredModule*.*[[EvaluationError]]* değeri `empty` değilse, ? *requiredModule*.*[[EvaluationError]]* değerini döndür.
      5. requiredModule.[[AsyncEvaluationOrder]] bir tamsayı (integer) ise, o zaman

         1. *module*.*[[PendingAsyncDependencies]]* değerini *module*.*[[PendingAsyncDependencies]]* + 1 olarak ayarla.
        
         2. *module* değerini *requiredModule*.*[[AsyncParentModules]]*'e ekle.
  12. module.[[PendingAsyncDependencies]] > 0 veya module.[[HasTLA]] değeri true ise, o zaman

    1. Assert: module.[[AsyncEvaluationOrder]] değeri unsettir.

    2. module.[[AsyncEvaluationOrder]] değerini IncrementModuleAsyncEvaluationCount() değeri olarak ayarla.

    3. module.[[PendingAsyncDependencies]] = 0 ise, ExecuteAsyncModule(module) işlemini gerçekleştir.

  13. Aksi takdirde,

    1. ? module.ExecuteModule() işlemini gerçekleştir.
  14. Assert: module, stack içinde tam olarak bir kez yer alır.

  15. Assert: module.[[DFSAncestorIndex]]moduleIndex dir.

  16. module.[[DFSAncestorIndex]] = moduleIndex ise, o zaman

    1. done değeri false olsun.

    2. done değeri false iken tekrarla:

      1. requiredModule, stack'in son öğesi olsun.

      2. stack'in son öğesini çıkar.

      3. Assert: requiredModule, bir Cyclic Module Kaydı (Cyclic Module Record) türüdür.

      4. Assert: requiredModule.[[AsyncEvaluationOrder]] değeri ya bir tamsayıdır (integer) ya da unsettir.

      5. requiredModule.[[AsyncEvaluationOrder]] değeri unset ise, requiredModule.[[Status]] değerini evaluated olarak ayarla.

      6. Aksi takdirde, requiredModule.[[Status]] değerini evaluating-async olarak ayarla.

      7. requiredModule ve module aynı Modül Kaydı (Module Record) ise, done değerini true olarak ayarla.

      8. requiredModule.[[CycleRoot]] değerini module olarak ayarla.

  17. index değerini döndür.

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

Soyut işlem ExecuteAsyncModule; module (bir Cyclic Module Kaydı (Cyclic Module Record)) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[Status]] değeri ya evaluating ya da evaluating-async durumundadır.

  2. Assert: module.[[HasTLA]] değeri truedur.

  3. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  4. fulfilledClosure, hiçbir parametre almayan, module nesnesini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. AsyncModuleExecutionFulfilled(module) işlemini gerçekleştir.

    2. NormalCompletion(undefined) döndür.

  5. onFulfilled, CreateBuiltinFunction(fulfilledClosure, 0, "", « ») olsun.

  6. rejectedClosure, (error) parametrelerini alan, module nesnesini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. AsyncModuleExecutionRejected(module, error) işlemini gerçekleştir.

    2. NormalCompletion(undefined) döndür.

  7. onRejected, CreateBuiltinFunction(rejectedClosure, 0, "", « ») olsun.

  8. PerformPromiseThen(promiseCapability.[[Promise]], onFulfilled, onRejected) işlemini gerçekleştir.

  9. ! module.ExecuteModule(promiseCapability) işlemini gerçekleştir.

  10. unused döndür.

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

Soyut işlem GatherAvailableAncestors; module (bir Cyclic Module Kaydı (Cyclic Module Record)) ve execList (bir Cyclic Module Kayıtlarının (Cyclic Module Records) Listesi (List)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module.[[AsyncParentModules]]'teki her bir Cyclic Module Kaydı (Cyclic Module Record) ancestorModule için şunları yap:

    1. execList, ancestorModule öğesini içermiyorsa ve ancestorModule.[[CycleRoot]].[[EvaluationError]] değeri empty ise, o zaman

      1. Assert: ancestorModule.[[Status]] değeri evaluating-async durumundadır.

      2. Assert: ancestorModule.[[EvaluationError]] değeri emptydir.

      3. Assert: ancestorModule.[[AsyncEvaluationOrder]] bir tamsayıdır (integer).

      4. Assert: ancestorModule.[[PendingAsyncDependencies]] > 0'dır.

      5. ancestorModule.[[PendingAsyncDependencies]] değerini ancestorModule.[[PendingAsyncDependencies]] - 1 olarak ayarla.

      6. ancestorModule.[[PendingAsyncDependencies]] = 0 ise, o zaman

         1. *ancestorModule* değerini *execList*'e ekle.
        
         2. *ancestorModule*.*[[HasTLA]]* değeri `false` ise, [GatherAvailableAncestors](#sec-gather-available-ancestors)(*ancestorModule*, *execList*) işlemini gerçekleştir.
  2. Return unused.

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

Soyut işlem AsyncModuleExecutionFulfilled; module (bir Cyclic Module Kaydı (Cyclic Module Record)) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module.[[Status]] değeri evaluated ise, o zaman

    1. Assert: module.[[EvaluationError]] değeri empty değildir.

    2. unused döndür.

  2. Assert: module.[[Status]] değeri evaluating-async durumundadır.

  3. Assert: module.[[AsyncEvaluationOrder]] bir tamsayıdır (integer).

  4. Assert: module.[[EvaluationError]] değeri emptydir.

  5. module.[[AsyncEvaluationOrder]] değerini done olarak ayarla.

  6. module.[[Status]] değerini evaluated olarak ayarla.

  7. module.[[TopLevelCapability]] değeri empty değilse, o zaman

    1. Assert: module.[[CycleRoot]] ve module aynı Modül Kaydı (Module Record)dur.

    2. Perform ! Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined ») işlemini gerçekleştir.

  8. execList, yeni ve boş bir Liste (List) olsun.

  9. GatherAvailableAncestors(module, execList) işlemini gerçekleştir.

  10. Assert: execList'in tüm öğelerinin [[AsyncEvaluationOrder]] alanı bir tamsayıya (integer), [[PendingAsyncDependencies]] alanı 0'a ve [[EvaluationError]] alanı empty değerine ayarlanmıştır.

  11. sortedExecList, execList'in öğelerinden oluşan ve [[AsyncEvaluationOrder]] alanlarına göre artan sırada sıralanmış bir Liste (List) olsun.

  12. sortedExecList'teki her bir Cyclic Module Kaydı (Cyclic Module Record) ancestorModule için şunları yap:

    1. ancestorModule.[[Status]] değeri evaluated ise, o zaman

      1. Assert: ancestorModule.[[EvaluationError]] değeri empty değildir.
    2. Aksi takdirde, ancestorModule.[[HasTLA]] değeri true ise, o zaman

      1. ExecuteAsyncModule(ancestorModule) işlemini gerçekleştir.
    3. Aksi takdirde,

      1. result, Completion(ancestorModule.ExecuteModule()) olsun.

      2. result bir ani tamamlanma (abrupt completion) ise, o zaman

         1. [AsyncModuleExecutionRejected](#sec-async-module-execution-rejected)(*ancestorModule*, *result*.*[[Value]]*) işlemini gerçekleştir.
      3. Aksi takdirde,

         1. *ancestorModule*.*[[AsyncEvaluationOrder]]* değerini `done` olarak ayarla.
        
         2. *ancestorModule*.*[[Status]]* değerini `evaluated` olarak ayarla.
        
         3. *ancestorModule*.*[[TopLevelCapability]]* değeri `empty` değilse, o zaman
           
                   1. [Assert](06_sec-notational-conventions.md#assert): *ancestorModule*.*[[CycleRoot]]* ve *ancestorModule* aynı [Modül Kaydı (Module Record)](#sec-abstract-module-records)dur.
           
                   2. Perform ! [Call](08_sec-abstract-operations.md#sec-call)(*ancestorModule*.*[[TopLevelCapability]]*.*[[Resolve]]*, `undefined`, « `undefined` ») işlemini gerçekleştir.
  13. unused döndür.

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

Soyut işlem AsyncModuleExecutionRejected; module (bir Cyclic Module Kaydı (Cyclic Module Record)) ve error (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module.[[Status]] değeri evaluated ise, o zaman

    1. Assert: module.[[EvaluationError]] değeri empty değildir.

    2. unused döndür.

  2. Assert: module.[[Status]] değeri evaluating-async durumundadır.

  3. Assert: module.[[AsyncEvaluationOrder]] bir tamsayıdır (integer).

  4. Assert: module.[[EvaluationError]] değeri emptydir.

  5. module.[[EvaluationError]] değerini ThrowCompletion(error) olarak ayarla.

  6. module.[[Status]] değerini evaluated olarak ayarla.

  7. module.[[AsyncEvaluationOrder]] değerini done olarak ayarla.

  8. NOTE: module.[[AsyncEvaluationOrder]] değeri, AsyncModuleExecutionFulfilled ile simetri sağlamak amacıyla done olarak ayarlanır. InnerModuleEvaluation içinde, bir modülün [[EvaluationError]] dahili yuvası empty değilse, o modülün [[AsyncEvaluationOrder]] dahili yuvasının değeri kullanılmaz.

  9. module.[[TopLevelCapability]] değeri empty değilse, o zaman

    1. Assert: module.[[CycleRoot]] ve module aynı Modül Kaydı (Module Record)dur.

    2. Perform ! Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error ») işlemini gerçekleştir.

  10. module.[[AsyncParentModules]]'teki her bir Cyclic Module Kaydı (Cyclic Module Record) ancestorModule için şunları yap:

    1. AsyncModuleExecutionRejected(ancestorModule, error) işlemini gerçekleştir.
  11. unused döndür.

16.2.1.6.2 Example Cyclic Module Record Graphs

Bu normatif olmayan (non-normative) bölüm, hataların nasıl oluşabileceğine özellikle odaklanarak, birkaç yaygın modül grafiğinin bağlanması (linking) ve değerlendirilmesi (evaluation) ile ilgili bir dizi örnek sunmaktadır.

Öncelikle aşağıdaki basit modül grafiğini ele alalım:

Şekil 2: Basit bir modül grafiği

İlk olarak hiçbir hata durumunun olmadığını varsayalım. Bir barındırıcı (host) ilk olarak A.LoadRequestedModules() yöntemini çağırdığında, bu çağrı varsayım gereği başarıyla tamamlanacak ve B ile C'nin bağımlılıklarını da (sırasıyla C ve hiçbiri) özyinelemeli olarak yükleyecek, ardından A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked olarak ayarlayacaktır. Daha sonra, barındırıcı (host) A.Link() yöntemini çağırdığında, bu işlem de (yine varsayım gereği) A.[[Status]] = B.[[Status]] = C.[[Status]] = linked olacak şekilde başarıyla tamamlanacaktır. Bu hazırlık adımları herhangi bir zamanda gerçekleştirilebilir. Daha sonra, barındırıcı (host) modüllerin olası yan etkilerini gerçekleştirmeye hazır olduğunda, A.Evaluate() yöntemini çağırabilir; bu çağrı başarıyla tamamlanacak ve özyinelemeli olarak önce C'yi, ardından B'yi değerlendirip (yine varsayım gereği) undefined ile çözümlenen bir Promise döndürecektir. Bu noktada her modülün [[Status]] değeri evaluated olacaktır.

Ardından, A.LoadRequestedModules() yönteminin başarılı bir şekilde çağrılmasından sonra, bağlama (linking) hatalarını içeren durumları ele alalım. Eğer C'nin InnerModuleLinking işlemi başarılı olur ancak ardından B için, örneğin C'nin sağlamadığı bir şeyi içe aktardığı için başarısız olursa, orijinal A.Link() çağrısı başarısız olacak ve hem A hem de B'nin [[Status]] değeri unlinked olarak kalacaktır. Ancak C'nin [[Status]] değeri linked haline gelmiştir.

Son olarak, Link() yönteminin başarılı bir şekilde çağrılmasından sonra, değerlendirme (evaluation) hatalarını içeren bir durumu ele alalım. Eğer C'nin InnerModuleEvaluation işlemi başarılı olur ancak ardından B için, örneğin B istisna fırlatan bir kod içerdiği için başarısız olursa, orijinal A.Evaluate() çağrısı başarısız olacak ve reddedilmiş (rejected) bir Promise döndürecektir. Oluşan istisna hem A hem de B'nin [[EvaluationError]] alanlarına kaydedilecek ve bunların [[Status]] değerleri evaluated haline gelecektir. C de evaluated haline gelecektir, ancak A ve B'nin aksine, değerlendirmeyi başarıyla tamamladığı için [[EvaluationError]] alanı olmadan kalacaktır. İstisnanın saklanması, bir barındırıcının (host) A veya B'yi kendi Evaluate() yöntemlerini çağırarak yeniden kullanmaya çalıştığı her seferde aynı istisnayla karşılaşmasını sağlar. (Barındırıcıların (host) Cyclic Module Kayıtlarını (Cyclic Module Records) yeniden kullanması zorunlu değildir; benzer şekilde, barındırıcıların (host) bu yöntemler tarafından fırlatılan istisna nesnelerini açığa çıkarması da zorunlu değildir. Ancak bu spesifikasyon bu tür kullanımlara olanak tanır.)

Şimdi farklı bir hata durumu türünü ele alalım:

Şekil 3: Çözümlenemeyen bir modüle sahip modül grafiği

Bu senaryoda, A modülü başka bir modüle bağımlılık bildirir, ancak o modül için hiçbir Modül Kaydı (Module Record) mevcut değildir; yani HostLoadImportedModule kendisinden istendiğinde FinishLoadingImportedModule yöntemini bir istisnayla çağırır. Bu durum, ilgili kaynağın mevcut olmaması veya kaynağın mevcut olması fakat ParseModule işleminin ortaya çıkan kaynak metni ayrıştırmaya çalışırken bazı hatalar döndürmesi gibi çeşitli nedenlerle meydana gelebilir. Barındırıcılar (hosts), başarısızlık nedenini FinishLoadingImportedModule yöntemine ilettikleri tamamlanma (completion) aracılığıyla açığa çıkarmayı seçebilirler. Her halükarda bu istisna bir yükleme hatasına neden olur ve bu da A'nın [[Status]] değerinin new olarak kalmasıyla sonuçlanır.

Burada yükleme, bağlama ve değerlendirme hataları arasındaki fark aşağıdaki özellikten kaynaklanmaktadır:

  • Değerlendirme (Evaluation), yan etkilere neden olabileceğinden yalnızca bir kez gerçekleştirilmelidir; bu nedenle, başarısız olsa bile değerlendirmenin zaten gerçekleştirilip gerçekleştirilmediğini hatırlamak önemlidir. (Hata durumunda, istisnayı da hatırlamak mantıklıdır çünkü aksi takdirde sonraki Evaluate() çağrılarının yeni bir istisna sentezlemesi gerekecektir.)

  • Diğer yandan bağlama (linking), yan etkisizdir ve bu nedenle başarısız olsa bile daha sonraki bir zamanda sorunsuz bir şekilde yeniden denenebilir.

  • Yükleme, barındırıcı (host) ile yakından etkileşime girer ve bazı barındırıcıların kullanıcıların başarısız yüklemeleri yeniden denemesine izin vermesi istenebilir (örneğin, başarısızlık geçici kötü ağ koşullarından kaynaklanıyorsa).

Şimdi, döngü (cycle) içeren bir modül grafiğini ele alalım:

Şekil 4: Döngüsel bir modül grafiği

Burada giriş noktasının A modülü olduğunu varsayıyoruz; böylece barındırıcı (host), A üzerinde InnerModuleLoading işlemini gerçekleştiren A.LoadRequestedModules() yöntemini çağırarak ilerler. Bu işlem de sırasıyla B ve C üzerinde InnerModuleLoading işlemini çağırır. Döngü nedeniyle bu durum A üzerinde tekrar InnerModuleLoading işlemini tetikler, ancak bu noktada, bu LoadRequestedModules süreci sırasında A'nın bağımlılıklarının yüklenmesi zaten tetiklendiği için bu bir etkisiz işlemdir (no-op). Grafikteki tüm modüller başarıyla yüklendiğinde, [[Status]] değerleri aynı anda new durumundan unlinked durumuna geçer.

Daha sonra barındırıcı (host), A üzerinde InnerModuleLinking işlemini gerçekleştiren A.Link() yöntemini çağırarak ilerler. Bu işlem sırasıyla B üzerinde InnerModuleLinking işlemini çağırır. Döngü nedeniyle bu durum A üzerinde tekrar InnerModuleLinking işlemini tetikler, ancak bu noktada A.[[Status]] zaten linking durumunda olduğundan bu bir etkisiz işlemdir (no-op). Denetim A'ya geri döndüğünde ve C üzerinde InnerModuleLinking tetiklendiğinde B.[[Status]] kendi başına linking olarak kalır. Bu işlem C.[[Status]] değeri linked olacak şekilde geri döndükten sonra, hem A hem de B birlikte linking durumundan linked durumuna geçer; bu tasarım gereğidir, çünkü güçlü şekilde bağlı bir bileşen (strongly connected component) oluştururlar. Aynı SCC içindeki modüllerin durumunu aynı anda geçirmek mümkündür çünkü bu aşama sırasında modül grafiği derinlik öncelikli arama (depth-first search) ile dolaşılır.

Döngüsel bir modül grafiğinin değerlendirme (evaluation) aşaması için başarı durumunda benzer bir süreç gerçekleşir.

Şimdi A'nın bir bağlama (linking) hatasına sahip olduğu bir durumu ele alalım; örneğin, C'den mevcut olmayan bir bağlamayı içe aktarmaya çalışıyor olsun. Bu durumda, A üzerindeki ikinci InnerModuleLinking çağrısından erken dönülmesi de dahil olmak üzere yukarıdaki adımlar yine gerçekleşir. Ancak, orijinal A.InnerModuleLinking çağrısına geri döndüğümüzde, InitializeEnvironment sırasında, yani C.ResolveExport() işleminden hemen sonra başarısız olur. Fırlatılan SyntaxError istisnası A.Link yöntemine kadar yayılır ve bu yöntem şu anda stack üzerinde bulunan tüm modülleri (bunlar her zaman tam olarak hala linking durumunda olan modüllerdir) sıfırlar. Bu nedenle hem A hem de B unlinked durumuna gelir. C'nin ise linked olarak bırakıldığına dikkat edin.

Alternatif olarak, A'nın bir değerlendirme (evaluation) hatasına sahip olduğu bir durumu ele alalım; örneğin, kaynak kodu bir istisna fırlatıyor olsun. Bu durumda, A üzerindeki ikinci InnerModuleEvaluation çağrısından erken dönülmesi de dahil olmak üzere yukarıdaki adımların değerlendirme zamanındaki karşılığı yine gerçekleşir. Ancak, orijinal A.InnerModuleEvaluation çağrısına geri döndüğümüzde, varsayım gereği başarısız olur. Fırlatılan istisna, hatayı şu anda kendi stack'inde bulunan tüm modüllere (yani hala evaluating olan modüller) ve ayrıca tüm bağımlılık grafiği boyunca üst düzey (top-level) await içeren veya buna bağımlı olan modüller için bir zincir oluşturan [[AsyncParentModules]] aracılığıyla AsyncModuleExecutionRejected algoritması üzerinden kaydeden A.Evaluate() yöntemine kadar yayılır. Bu nedenle hem A hem de B evaluated durumuna gelir ve istisna hem A hem de B'nin [[EvaluationError]] alanlarına kaydedilir, C ise hiçbir [[EvaluationError]] olmadan evaluated olarak bırakılır.

Son olarak, tüm modüllerin asenkron olarak tamamlandığı döngü içeren bir modül grafiğini ele alalım:

Şekil 5: Asenkron döngüsel bir modül grafiği

Yükleme ve bağlama işlemleri daha önce olduğu gibi gerçekleşir ve tüm modüllerin [[Status]] değeri linked olarak ayarlanır.

A.Evaluate() yöntemini çağırmak, hepsi evaluating durumuna geçen A, B ve D üzerinde InnerModuleEvaluation işlemini çağırır. Ardından A üzerinde tekrar InnerModuleEvaluation çağrılır, bu durum zaten evaluating olduğu için etkisiz bir işlemdir (no-op). Bu noktada D.[[PendingAsyncDependencies]] değeri 0'dır, bu nedenle ExecuteAsyncModule(D) çağrılır ve D'nin asenkron yürütülmesini izleyen yeni bir PromiseCapability ile D.ExecuteModule yöntemini çağırırız. B üzerindeki InnerModuleEvaluation çağrısına geri döneriz, bu sırada B.[[PendingAsyncDependencies]] değerini 1 ve B.[[AsyncEvaluationOrder]] değerini 1 olarak ayarlarız. A üzerindeki orijinal InnerModuleEvaluation çağrısına geri döneriz, bu sırada A.[[PendingAsyncDependencies]] değerini 1 olarak ayarlarız. A'nın bağımlılıkları üzerindeki döngünün bir sonraki yinelemesinde, C üzerinde ve dolayısıyla D (yine bir no-op) ve E üzerinde InnerModuleEvaluation işlemini çağırırız. E'nin hiçbir bağımlılığı olmadığı ve bir döngünün parçası olmadığı için, D ile aynı şekilde ExecuteAsyncModule(E) çağrılır ve E hemen yığından çıkarılır. Bir kez daha C üzerindeki InnerModuleEvaluation çağrısına döneriz, bu sırada C.[[AsyncEvaluationOrder]] değerini 3 olarak ayarlarız. Şimdi A'nın bağımlılıkları üzerindeki döngüyü bitirir, A.[[AsyncEvaluationOrder]] değerini 4 olarak ayarlarız ve tüm güçlü şekilde bağlı bileşeni yığından çıkararak tüm modülleri aynı anda evaluating-async durumuna geçiririz. Bu noktada modüllerin alanları Tablo 43 içinde verildiği gibidir.

Tablo 43: İlk Evaluate() çağrısından sonraki modül alanları

Alan Modül 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 ve C) 1 (D) 2 (D ve E) 0 0

E'nin önce yürütmeyi bitirdiğini varsayalım. Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled çağrılır, E.[[Status]] değeri evaluated olarak ayarlanır ve C.[[PendingAsyncDependencies]] değeri 1'e düşürülür. Güncellenen modüllerin alanları Tablo 44 içinde verildiği gibidir.

Tablo 44: E modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül C E
[[DFSAncestorIndex]] 0 4
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 3 done
[[AsyncParentModules]] « A » « C »
[[PendingAsyncDependencies]] 1 (D) 0

Sırada bitirecek olan D'dir (çünkü hala yürütülmekte olan tek modüldür). Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled tekrar çağrılır ve D.[[Status]] değeri evaluated olarak ayarlanır. Yürütme için kullanılabilir olan ataları (ancestors) B (kendisinin [[AsyncEvaluationOrder]] değeri 1'dir) ve C'dir (kendisinin [[AsyncEvaluationOrder]] değeri 3'tür), bu nedenle ilk olarak B işlenecektir: B.[[PendingAsyncDependencies]] değeri 0'a düşürülür, B üzerinde ExecuteAsyncModule çağrılır ve yürütülmeye başlar. C.[[PendingAsyncDependencies]] değeri de 0'a düşürülür ve C yürütülmeye başlar (eğer B bir await içeriyorsa, potansiyel olarak B'ye paralel olarak). Güncellenen modüllerin alanları Tablo 45 içinde verildiği gibidir.

Tablo 45: D modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül 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

Bir sonraki sırada C'nin yürütmeyi bitirdiğini varsayalım. Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled tekrar çağrılır, C.[[Status]] değeri evaluated olarak ayarlanır ve A.[[PendingAsyncDependencies]] değeri 1'e düşürülür. Güncellenen modüllerin alanları Tablo 46 içinde verildiği gibidir.

Tablo 46: C modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0

Ardından B yürütmeyi bitirir. Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled tekrar çağrılır ve B.[[Status]] değeri evaluated olarak ayarlanır. A.[[PendingAsyncDependencies]] değeri 0'a düşürülür, böylece ExecuteAsyncModule çağrılır ve yürütülmeye başlar. Güncellenen modüllerin alanları Tablo 47 içinde verildiği gibidir.

Tablo 47: B modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0

Son olarak A yürütmeyi bitirir. Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled tekrar çağrılır ve A.[[Status]] değeri evaluated olarak ayarlanır. Bu noktada, A.[[TopLevelCapability]] içindeki Promise (A.Evaluate() çağrısından döndürülmüş olan) çözümlenir ve bu modül grafiğinin işlenmesi tamamlanır. Güncellenen modülün alanları Tablo 48 içinde verildiği gibidir.

Tablo 48: A modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

Alternatif olarak, C'nin başarısız olduğu ve B yürütmeyi bitirmeden önce bir hata döndürdüğü bir hata durumunu ele alalım. Bu gerçekleştiğinde, AsyncModuleExecutionRejected çağrılır; bu da C.[[Status]] değerini evaluated ve C.[[EvaluationError]] değerini hata olarak ayarlar. Daha sonra, her biri üzerinde AsyncModuleExecutionRejected işlemini gerçekleştirerek bu hatayı tüm AsyncParentModules öğelerine yayar. Güncellenen modüllerin alanları Tablo 49 içinde verildiği gibidir.

Tablo 49: C modülü hata ile bittikten sonraki modül alanları

Alan Modül A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0
[[EvaluationError]] empty C'nin değerlendirme hatası

C, A üzerinde C'nin hatasıyla AsyncModuleExecutionRejected çağrısı yapacağı için, A da C ile aynı hatayla reddedilecektir. A.[[Status]] değeri evaluated olarak ayarlanır. Bu noktada, A.[[TopLevelCapability]] içindeki Promise (A.Evaluate() çağrısından döndürülmüş olan) reddedilir. Güncellenen modülün alanları Tablo 50 içinde verildiği gibidir.

Tablo 50: A modülü reddedildikten sonraki modül alanları

Alan Modül A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C'nin Değerlendirme (Evaluation) Hatası

Ardından B hata olmadan yürütmeyi tamamlar. Bu gerçekleştiğinde, AsyncModuleExecutionFulfilled tekrar çağrılır ve B.[[Status]] değeri evaluated olarak ayarlanır. B üzerinde GatherAvailableAncestors çağrılır. Ancak, A.[[CycleRoot]] değeri bir değerlendirme hatası olan A olduğundan, döndürülen sortedExecList'e eklenmeyecek ve AsyncModuleExecutionFulfilled daha fazla işlem yapmadan geri dönecektir. Gelecekte B'yi içe aktaran herhangi bir modül, döngü kökü (cycle root) A üzerinde ayarlanmış olan C'den kaynaklanan değerlendirme hatasını, B.[[CycleRoot]].[[EvaluationError]] reddi olarak çözümleyecektir. Güncellenen modüllerin alanları Tablo 51 içinde verildiği gibidir.

Tablo 51: Hatalı bir grafikte B modülü yürütmeyi bitirdikten sonraki modül alanları

Alan Modül A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] C'nin Değerlendirme (Evaluation) Hatası empty

16.2.1.7 Kaynak Metin Modül Kayıtları (Source Text Module Records)

Bir Kaynak Metin Modül Kaydı (Source Text Module Record), Module hedef sembolü (goal symbol) kullanılarak ayrıştırılan ECMAScript kaynak metninden (ECMAScript source text) (11) tanımlanmış bir modül hakkındaki bilgileri temsil etmek için kullanılır. Alanları, modül tarafından içe aktarılan ve dışa aktarılan isimler hakkında özetlenmiş bilgiler içerir ve somut metotları bu özetleri modülü bağlamak (link) ve değerlendirmek (evaluate) için kullanır.

Bir Kaynak Metin Modül Kaydı (Source Text Module Record), soyut Modül Kaydı (Module Record) türünün diğer alt sınıflarıyla birlikte bir modül grafiğinde var olabilir ve Cyclic Module Kaydı (Cyclic Module Record) türünün diğer alt sınıflarıyla döngülere (cycles) katılabilir.

Tablo 40 içinde tanımlanan alanlara ek olarak, Kaynak Metin Modül Kayıtları (Source Text Module Records) Tablo 52 içinde listelenen ek alanlara sahiptir. Bu alanların her biri başlangıçta ParseModule içinde ayarlanır.

Tablo 52: Kaynak Metin Modül Kayıtlarının (Source Text Module Records) Ek Alanları

Alan Adı Değer Türü Anlamı
[[ECMAScriptCode]] bir Ayrıştırma Düğümü (Parse Node) Modulehedef sembol (goal symbol) olarak kullanarak bu modülün kaynak metnini ayrıştırmanın sonucu.
[[Context]] bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) veya empty Bu modülle ilişkili yürütme bağlamı (execution context). Modülün ortamı başlatılana kadar empty değerindedir.
[[ImportMeta]] bir Nesne veya empty import.meta meta özelliği aracılığıyla açığa çıkarılan nesne. ECMAScript kodu tarafından erişilene kadar empty değerindedir.
[[ImportEntries]] ImportEntry Kayıtlarının (ImportEntry Records) bir Listesi (List) Bu modülün kodundan türetilen ImportEntry kayıtlarının bir Listesi (List).
[[LocalExportEntries]] ExportEntry Kayıtlarının (ExportEntry Records) bir Listesi (List) Bu modülün kodundan türetilen ve modül içinde gerçekleşen bildirimlere karşılık gelen ExportEntry kayıtlarının bir Listesi (List).
[[IndirectExportEntries]] ExportEntry Kayıtlarının (ExportEntry Records) bir Listesi (List) Bu modülün kodundan türetilen ve modül içinde gerçekleşen yeniden dışa aktarılan içe aktarımlara (reexported imports) veya export * as namespace bildirimlerinden yapılan dışa aktarımlara karşılık gelen ExportEntry kayıtlarının bir Listesi (List).
[[StarExportEntries]] ExportEntry Kayıtlarının (ExportEntry Records) bir Listesi (List) Bu modülün kodundan türetilen ve modül içinde gerçekleşen export * bildirimlerine karşılık gelen (fakat export * as namespace bildirimlerini içermeyen) ExportEntry kayıtlarının bir Listesi (List).

Bir ImportEntry Kaydı (ImportEntry Record), tek bir bildirimsel içe aktarım (declarative import) hakkındaki bilgileri özetleyen bir Kayıttır (Record). Her bir ImportEntry Kaydı (ImportEntry Record), Tablo 53 içinde tanımlanan alanlara sahiptir:

Tablo 53: ImportEntry Kaydı (ImportEntry Record) Alanları

Alan Adı Değer Türü Anlamı
[[ModuleRequest]] bir ModuleRequest Kaydı (ModuleRequest Record) ImportDeclaration'ın ModuleSpecifier'ını ve içe aktarım özniteliklerini temsil eden ModuleRequest Kaydı (ModuleRequest Record).
[[ImportName]] bir String veya namespace İstenen bağlamanın, [[ModuleRequest]] ile tanımlanan modül tarafından hangi ad altında dışa aktarıldığı. namespace değeri, içe aktarım isteğinin hedef modülün ad alanı (namespace) nesnesi için olduğunu belirtir.
[[LocalName]] bir String İçe aktarılan değere içe aktaran modülün içinden yerel olarak erişmek için kullanılan ad.

Bir ExportEntry Kaydı (ExportEntry Record), tek bir bildirimsel dışa aktarım (declarative export) hakkındaki bilgileri özetleyen bir Kayıttır (Record). Her bir ExportEntry Kaydı (ExportEntry Record), Tablo 55 içinde tanımlanan alanlara sahiptir:

Tablo 55: ExportEntry Kaydı (ExportEntry Record) Alanları

Alan Adı Değer Türü Anlamı
[[ExportName]] bir String veya null Bu modül tarafından bu bağlamayı dışa aktarmak için kullanılan ad.
[[ModuleRequest]] bir ModuleRequest Kaydı (ModuleRequest Record) veya null ExportDeclaration'ın ModuleSpecifier'ını ve içe aktarım özniteliklerini temsil eden ModuleRequest Kaydı (ModuleRequest Record). Eğer ExportDeclaration bir ModuleSpecifier'a sahip değilse nulldır.
[[ImportName]] bir String, null, namespace veya all-but-default İstenen bağlamanın, [[ModuleRequest]] ile tanımlanan modül tarafından hangi ad altında dışa aktarıldığı. Eğer ExportDeclaration bir ModuleSpecifier'a sahip değilse nulldır. namespace, export * as ns from "mod" bildirimleri için kullanılır. all-but-default, export * from "mod" bildirimleri için kullanılır.
[[LocalName]] bir String veya null Dışa aktarılan değere içe aktaran modülün içinden yerel olarak erişmek için kullanılan ad. Dışa aktarılan değere modülün içinden yerel olarak erişilemiyorsa nulldır.

Aşağıdaki tanımlar, Kaynak Metin Modül Kayıtları (Source Text Module Records) için gerekli somut metotları ve diğer soyut işlemleri (abstract operations) belirtmektedir:

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

Soyut işlem ParseModule; sourceText (bir Dize veya Unicode kod noktaları dizisi), realm (bir Realm Kaydı (Realm Record)) ve hostDefined (herhangi bir şey) argümanlarını alır ve bir Kaynak Metin Modül Kaydı (Source Text Module Record) ya da boş olmayan bir SyntaxError nesneleri Listesini (List) döndürür. sourceText'in bir Module olarak ayrıştırılmasının sonucuna dayanarak bir Kaynak Metin Modül Kaydı (Source Text Module Record) oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. body, ParseText(sourceText, Module) olsun.

  2. body bir hata Listesi (List) ise, body değerini döndür.

  3. requestedModules, body'nin ModuleRequests değeri olsun.

  4. importEntries, body'nin ImportEntries değeri olsun.

  5. importedBoundNames, ImportedLocalNames(importEntries) olsun.

  6. indirectExportEntries, yeni ve boş bir Liste (List) olsun.

  7. localExportEntries, yeni ve boş bir Liste (List) olsun.

  8. starExportEntries, yeni ve boş bir Liste (List) olsun.

  9. exportEntries, body'nin ExportEntries değeri olsun.

  10. exportEntries'taki her bir ExportEntry Kaydı (ExportEntry Record) exportEntry için şunları yap:

    1. exportEntry.[[ModuleRequest]] değeri null ise, o zaman

      1. importedBoundNames, exportEntry.[[LocalName]] öğesini içermiyorsa, o zaman

         1. *exportEntry* değerini *localExportEntries*'e ekle.
      2. Aksi takdirde,

         1. [NOTE](06_sec-notational-conventions.md#note-step): Başlangıçta başka bir modülden içe aktarılan bir bağlama veya ad alanı (namespace) nesnesi dışa aktarıldığında, [ExportEntry Kaydı (ExportEntry Record)](#exportentry-record), bağlama veya ad alanı nesnesinin içe aktarılıp ardından dışa aktarılması yerine doğrudan orijinal modülden yeniden dışa aktarıldığı durumda sahip olacağı biçimle eşleşecek şekilde yeniden yazılır. Bu, aynı bağlamanın veya ad alanının `export * from` aracılığıyla aynı ad altında iki kez dışa aktarılmasından kaynaklanan çakışmaların, [Kaynak Metin Modül Kayıtlarının ResolveExport somut metodunun](#sec-resolveexport) [9.e.iii](#step-resolveexport-conflict) adımında belirsiz olarak değerlendirilmek yerine göz ardı edilebilmesini sağlar.
        
         2. *ie*, *importEntries*'ın *[[LocalName]]* değeri *exportEntry*.*[[LocalName]]* olan öğesi olsun.
        
         3. [ExportEntry Kaydı (ExportEntry Record)](#exportentry-record) { *[[ModuleRequest]]*: *ie*.*[[ModuleRequest]]*, *[[ImportName]]*: *ie*.*[[ImportName]]*, *[[LocalName]]*: `null`, *[[ExportName]]*: *exportEntry*.*[[ExportName]]* } değerini *indirectExportEntries*'e ekle.
    2. Aksi takdirde, exportEntry.[[ImportName]] değeri all-but-default ise, o zaman

      1. Assert: exportEntry.[[ExportName]] değeri nulldır.

      2. exportEntry değerini starExportEntries'e ekle.

    3. Aksi takdirde,

      1. exportEntry değerini indirectExportEntries'e ekle.
  11. async, body Contains (içeriyor) await değeri olsun.

  12. Kaynak Metin Modül Kaydı (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 } döndür.

16.2.1.7.2 Modül Kaydı Soyut Metotlarının Somutlanması (Implementation of Module Record Abstract Methods)

Aşağıdakiler, Tablo 39 içinde tanımlanan karşılık gelen Modül Kaydı (Module Record) soyut metotlarını somutlayan, Kaynak Metin Modül Kaydına (Source Text Module Record) ait somut metotlardır.

16.2.1.7.2.1 GetExportedNames ( [ exportStarSet ] )

Kaynak Metin Modül Kaydı (Source Text Module Record) module'ün GetExportedNames somut metodu, isteğe bağlı exportStarSet (bir Kaynak Metin Modül Kayıtlarının (Source Text Module Records) Listesi (List)) argümanını alır ve Dizelerin bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[Status]] değeri new değildir.

  2. exportStarSet mevcut değilse, exportStarSet değerini yeni ve boş bir Liste (List) olarak ayarla.

  3. exportStarSet, module öğesini içeriyorsa, o zaman

    1. Assert: Bir export * döngüselliğinin başlangıç noktasına ulaştık.

    2. Yeni ve boş bir Liste (List) döndür.

  4. module değerini exportStarSet'e ekle.

  5. exportedNames, yeni ve boş bir Liste (List) olsun.

  6. module.[[LocalExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. Assert: module, bu dışa aktarım için doğrudan bağlamayı sağlar.

    2. Assert: e.[[ExportName]] değeri null değildir.

    3. e.[[ExportName]] değerini exportedNames'e ekle.

  7. module.[[IndirectExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. Assert: module, bu dışa aktarım için belirli bir bağlamayı içe aktarır.

    2. Assert: e.[[ExportName]] değeri null değildir.

    3. e.[[ExportName]] değerini exportedNames'e ekle.

  8. module.[[StarExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. Assert: e.[[ModuleRequest]] değeri null değildir.

    2. requestedModule, GetImportedModule(module, e.[[ModuleRequest]]) olsun.

    3. starNames, requestedModule.GetExportedNames(exportStarSet) olsun.

    4. starNames'teki her bir n öğesi için şunları yap:

      1. n değeri "default" değilse, o zaman

         1. *exportedNames*, *n* öğesini içermiyorsa, o zaman
           
                   1. *n* değerini *exportedNames*'e ekle.
  9. exportedNames değerini döndür.

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

Kaynak Metin Modül Kaydı (Source Text Module Record) module'ün ResolveExport somut metodu, exportName (bir Dize) ve isteğe bağlı resolveSet (alanları [[Module]] (bir Modül Kaydı (Module Record)) ve [[ExportName]] (bir Dize) olan Kayıtların (Records) bir Listesi (List)) argümanlarını alır ve bir ResolvedBinding Kaydı (ResolvedBinding Record), null ya da ambiguous döndürür.

ResolveExport, içe aktarılan bir bağlamayı fiili tanımlayıcı modüle ve yerel bağlama adına çözümlemeye çalışır. Tanımlayıcı modül, bu metodun üzerinde çağrıldığı Modül Kaydı (Module Record) tarafından temsil edilen modül veya o modül tarafından içe aktarılan başka bir modül olabilir. resolveSet parametresi, çözümlenmemiş döngüsel içe/dışa aktarım yollarını tespit etmek için kullanılır. Eğer resolveSet içinde halihazırda bulunan belirli bir Modül Kaydı (Module Record) ve exportName ikilisine ulaşılırsa, bir içe aktarım döngüselliğiyle karşılaşılmış demektir. ResolveExport özyinelemeli olarak çağrılmadan önce, module ve exportName ikilisi resolveSet'e eklenir.

Eğer tanımlayıcı bir modül bulunursa, bir ResolvedBinding Kaydı (ResolvedBinding Record) { [[Module]], [[BindingName]] } döndürülür. Yerel bağlaması olmayan bir ad alanının (namespace) dışa aktarılması durumu hariç olmak üzere, bu kayıt orijinal olarak talep edilen dışa aktarımın çözümlenmiş bağlamasını tanımlar. Bu durumda [[BindingName]] değeri namespace olarak ayarlanacaktır. Herhangi bir tanım bulunamazsa veya isteğin döngüsel olduğu tespit edilirse null döndürülür. İsteğin belirsiz olduğu tespit edilirse ambiguous döndürün.

Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[Status]] değeri new değildir.

  2. resolveSet mevcut değilse, resolveSet değerini yeni ve boş bir Liste (List) olarak ayarla.

  3. resolveSet'teki her bir { [[Module]], [[ExportName]] } Kaydı (Record) record için şunları yap:

    1. module ve record.[[Module]] aynı Modül Kaydı (Module Record) ise ve exportName ile record.[[ExportName]] aynı ise, o zaman

      1. Assert: Bu döngüsel bir içe aktarım isteğidir.

      2. null döndür.

  4. { [[Module]]: module, [[ExportName]]: exportName } Kaydını (Record) resolveSet'e ekle.

  5. module.[[LocalExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. e.[[ExportName]] ile exportName aynı ise, o zaman

      1. Assert: module, bu dışa aktarım için doğrudan bağlamayı sağlar.

      2. ResolvedBinding Kaydı (ResolvedBinding Record) { [[Module]]: module, [[BindingName]]: e.[[LocalName]] } döndür.

  6. module.[[IndirectExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. e.[[ExportName]] ile exportName aynı ise, o zaman

      1. Assert: e.[[ModuleRequest]] değeri null değildir.

      2. importedModule, GetImportedModule(module, e.[[ModuleRequest]]) olsun.

      3. e.[[ImportName]] değeri namespace ise, o zaman

         1. [Assert](06_sec-notational-conventions.md#assert): *module*, bu dışa aktarım için doğrudan bağlamayı sağlamaz.
        
         2. [ResolvedBinding Kaydı (ResolvedBinding Record)](#resolvedbinding-record) { *[[Module]]*: *importedModule*, *[[BindingName]]*: `namespace` } döndür.
      4. Assert: module, bu dışa aktarım için belirli bir bağlamayı içe aktarır.

      5. Assert: e.[[ImportName]] bir Dizedir (is a String).

      6. Return importedModule.ResolveExport(e.[[ImportName]], resolveSet).

  7. exportName değeri "default" ise, o zaman

    1. Assert: A default export was not explicitly defined by this module.

    2. Return null.

    3. NOTE: A default export cannot be provided by an export * from "mod" declaration.

  8. starResolution, null olsun.

  9. module.[[StarExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. Assert: e.[[ModuleRequest]] değeri null değildir.

    2. importedModule, GetImportedModule(module, e.[[ModuleRequest]]) olsun.

    3. resolution, importedModule.ResolveExport(exportName, resolveSet) olsun.

    4. resolution değeri ambiguous ise, ambiguous döndür.

    5. resolution değeri null değilse, o zaman

      1. Assert: resolution bir ResolvedBinding Kaydı (ResolvedBinding Record)dur.

      2. starResolution değeri null ise, o zaman

         1. *starResolution* değerini *resolution* olarak ayarla.
      3. Aksi takdirde,

         1. [Assert](06_sec-notational-conventions.md#assert): İstenen adı içeren birden fazla `*` dışa aktarımı vardır.
        
         2. *resolution*.*[[Module]]* ile *starResolution*.*[[Module]]* aynı [Modül Kaydı (Module Record)](#sec-abstract-module-records) değilse, `ambiguous` döndür.
        
         3. *resolution*.*[[BindingName]]* ile *starResolution*.*[[BindingName]]* aynı değilse, `ambiguous` döndür.
  10. starResolution değerini döndür.

16.2.1.7.3 Döngüsel Modül Kaydı Soyut Metotlarının Somutlanması (Implementation of Cyclic Module Record Abstract Methods)

Aşağıdakiler, Tablo 41 içinde tanımlanan karşılık gelen Döngüsel Modül Kaydı (Cyclic Module Record) soyut metotlarını somutlayan, Kaynak Metin Modül Kaydına (Source Text Module Record) ait somut metotlardır.

16.2.1.7.3.1 InitializeEnvironment ( )

Kaynak Metin Modül Kaydı (Source Text Module Record) module'ün InitializeEnvironment somut metodu hiçbir argüman almaz ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. module.[[IndirectExportEntries]]'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:

    1. Assert: e.[[ExportName]] değeri null değildir.

    2. resolution, module.ResolveExport(e.[[ExportName]]) olsun.

    3. resolution değeri null veya ambiguous ise, bir SyntaxError istisnası fırlat.

    4. Assert: resolution bir ResolvedBinding Kaydı (ResolvedBinding Record)dur.

  2. Assert: module'den yapılan tüm adlandırılmış dışa aktarımlar çözümlenebilirdir.

  3. realm, module.[[Realm]] olsun.

  4. Assert: realm değeri undefined değildir.

  5. envRecord, NewModuleEnvironment(realm.[[GlobalEnv]]) olsun.

  6. module.[[Environment]] değerini envRecord olarak ayarla.

  7. module.[[ImportEntries]]'teki her bir ImportEntry Kaydı (ImportEntry Record) in için şunları yap:

    1. importedModule, GetImportedModule(module, in.[[ModuleRequest]]) olsun.

    2. in.[[ImportName]] değeri namespace ise, o zaman

      1. namespace, GetModuleNamespace(importedModule) olsun.

      2. ! envRecord.CreateImmutableBinding(in.[[LocalName]], true) işlemini gerçekleştir.

      3. ! envRecord.InitializeBinding(in.[[LocalName]], namespace) işlemini gerçekleştir.

    3. Aksi takdirde,

      1. Assert: in.[[ImportName]] bir Dizedir (is a String).

      2. resolution, importedModule.ResolveExport(in.[[ImportName]]) olsun.

      3. resolution değeri null veya ambiguous ise, bir SyntaxError istisnası fırlat.

      4. resolution.[[BindingName]] değeri namespace ise, o zaman

         1. *namespace*, [GetModuleNamespace](#sec-getmodulenamespace)(*resolution*.*[[Module]]*) olsun.
        
         2. ! *envRecord*.[CreateImmutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createimmutablebinding)(*in*.*[[LocalName]]*, `true`) işlemini gerçekleştir.
        
         3. ! *envRecord*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*in*.*[[LocalName]]*, *namespace*) işlemini gerçekleştir.
      5. Aksi takdirde,

         1. [CreateImportBinding](10_sec-executable-code-and-execution-contexts.md#sec-createimportbinding)(*envRecord*, *in*.*[[LocalName]]*, *resolution*.*[[Module]]*, *resolution*.*[[BindingName]]*) işlemini gerçekleştir.
  8. moduleContext, yeni bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) olsun.

  9. moduleContext'in Function alanını null olarak ayarla.

  10. Assert: module.[[Realm]] değeri undefined değildir.

  11. moduleContext'in Realm alanını module.[[Realm]] olarak ayarla.

  12. moduleContext'in ScriptOrModule alanını module olarak ayarla.

  13. moduleContext'in VariableEnvironment alanını module.[[Environment]] olarak ayarla.

  14. moduleContext'in LexicalEnvironment alanını module.[[Environment]] olarak ayarla.

  15. moduleContext'in PrivateEnvironment alanını null olarak ayarla.

  16. module.[[Context]] değerini moduleContext olarak ayarla.

  17. moduleContext'i yürütme bağlamı yığınına (execution context stack) it (push); moduleContext artık yürütülmekte olan yürütme bağlamıdır (running execution context).

  18. code, module.[[ECMAScriptCode]] olsun.

  19. variableDecls, code'un VarScopedDeclarations değeri olsun.

  20. declaredVariableNames, yeni ve boş bir Liste (List) olsun.

  21. variableDecls'in her bir d öğesi için şunları yap:

    1. d'nin BoundNames değerindeki her bir dn öğesi için şunları yap:

      1. declaredVariableNames, dn öğesini içermiyorsa, o zaman

         1. ! *envRecord*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*dn*, `false`) işlemini gerçekleştir.
        
         2. ! *envRecord*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*dn*, `undefined`) işlemini gerçekleştir.
        
         3. *dn* değerini *declaredVariableNames*'e ekle.
  22. lexicalDecls, code'un LexicallyScopedDeclarations değeri olsun.

  23. privateEnv, null olsun.

  24. lexicalDecls'in her bir d öğesi için şunları yap:

    1. d'nin BoundNames değerindeki her bir dn öğesi için şunları yap:

      1. d'nin IsConstantDeclaration değeri true ise, o zaman

         1. ! *envRecord*.[CreateImmutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createimmutablebinding)(*dn*, `true`) işlemini gerçekleştir.
      2. Aksi takdirde,

         1. ! *envRecord*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*dn*, `false`) işlemini gerçekleştir.
      3. d; bir FunctionDeclaration, bir GeneratorDeclaration, bir AsyncFunctionDeclaration veya bir AsyncGeneratorDeclaration ise, o zaman

         1. *funcObj*, *envRecord* ve *privateEnv* argümanlarıyla *d*'nin [InstantiateFunctionObject](09_sec-syntax-directed-operations.md#sec-runtime-semantics-instantiatefunctionobject) değeri olsun.
        
         2. ! *envRecord*.[InitializeBinding](10_sec-executable-code-and-execution-contexts.md#abstract-initializebinding)(*dn*, *funcObj*) işlemini gerçekleştir.
  25. moduleContext'i yürütme bağlamı yığınından (execution context stack) çıkar.

  26. unused döndür.

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

Kaynak Metin Modül Kaydı (Source Text Module Record) module'ün ExecuteModule somut metodu, isteğe bağlı capability (bir PromiseCapability Kaydı (PromiseCapability Record)) argümanını alır ve unused içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module bağlanmıştır ve modül ortamındaki bildirimler örneklendirilmiştir (instantiated).

  2. moduleContext, module.[[Context]] olsun.

  3. module.[[HasTLA]] değeri false ise, o zaman

    1. Assert: capability mevcut değildir.

    2. Yürütülmekte olan yürütme bağlamını (running execution context) askıya al (suspend).

    3. moduleContext'i yürütme bağlamı yığınına (execution context stack) it (push); moduleContext artık yürütülmekte olan yürütme bağlamıdır (running execution context).

    4. result, Completion(module.[[ECMAScriptCode]]'un Evaluation (Değerlendirme) değeri) olsun.

    5. moduleContext'i askıya al ve yürütme bağlamı yığınından (execution context stack) çıkar.

    6. Şimdi yürütme bağlamı yığınının (execution context stack) en üstünde olan bağlamı, yürütülmekte olan yürütme bağlamı (running execution context) olarak geri sürdür (resume).

    7. result bir ani tamamlanma (abrupt completion) ise, o zaman

      1. Return ? result.
  4. Aksi takdirde,

    1. Assert: capability bir PromiseCapability Kaydı (PromiseCapability Record)dur.

    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext) işlemini gerçekleştir.

  5. unused döndür.

16.2.1.8 Sentetik Modül Kayıtları (Synthetic Module Records)

Bir Sentetik Modül Kaydı (Synthetic Module Record), spesifikasyonlar tarafından tanımlanan bir modül hakkındaki bilgileri temsil etmek için kullanılır. Dışa aktarılan isimleri oluşturulma sırasında statik olarak tanımlanırken, bunlara karşılık gelen değerler SetSyntheticModuleExport kullanılarak zaman içinde değişebilir. Hiçbir içe aktarımı veya bağımlılığı yoktur.

Tablo 38 içinde tanımlanan alanlara ek olarak, Sentetik Modül Kayıtları, Tablo 57 içinde listelenen ek alanlara sahiptir.

Tablo 57: Sentetik Modül Kayıtlarının (Synthetic Module Records) Ek Alanları

Alan Adı Değer Türü Anlamı
[[ExportNames]] Dizelerin bir Listesi (List) Modülün dışa aktarımlarının adları. Bu liste yinelenen öğeler içermez.
[[EvaluationSteps]] bir Soyut Kapanış (Abstract Closure) Modülün değerlendirilmesi üzerine gerçekleştirilecek, tek argüman olarak Sentetik Modül Kaydını (Synthetic Module Record) alan başlatma mantığı. [[ExportNames]] alanını değiştirmemelidir. Bir ani tamamlanma (abrupt completion) döndürebilir.
16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

Soyut işlem CreateDefaultExportSyntheticModule; defaultExport (bir ECMAScript dil değeri (ECMAScript language value)) argümanını alır ve bir Sentetik Modül Kaydı (Synthetic Module Record) döndürür. Varsayılan dışa aktarımı defaultExport olan bir Sentetik Modül Kaydı (Synthetic Module Record) oluşturur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. realm, geçerli Realm Kaydı (current Realm Record) olsun.

  2. setDefaultExport, (module) parametrelerini alan, defaultExport değerini yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren yeni bir Soyut Kapanış (Abstract Closure) olsun:

    1. SetSyntheticModuleExport(module, "default", defaultExport) işlemini gerçekleştir.

    2. NormalCompletion(unused) döndür.

  3. Sentetik Modül Kaydı (Synthetic Module Record) { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport } döndür.

16.2.1.8.2 ParseJSONModule ( source )

Soyut işlem ParseJSONModule; source (bir Dize) argümanını alır ve ya bir Sentetik Modül Kaydı (Synthetic Module Record) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. parseResult, ? ParseJSON(source) olsun.

  2. CreateDefaultExportSyntheticModule(parseResult.[[Value]]) değerini döndür.

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

Soyut işlem SetSyntheticModuleExport; module (bir Sentetik Modül Kaydı (Synthetic Module Record)), exportName (bir Dize) ve exportValue (bir ECMAScript dil değeri (ECMAScript language value)) argümanlarını alır ve unused döndürür. Bir Sentetik Modül Kaydının (Synthetic Module Record) mevcut bir dışa aktarımı için dışa aktarılan değeri ayarlamak veya değiştirmek amacıyla kullanılabilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module.[[ExportNames]], exportName öğesini içerir.

  2. envRecord, module.[[Environment]] olsun.

  3. Assert: envRecord değeri empty değildir.

  4. ! envRecord.SetMutableBinding(exportName, exportValue, true) işlemini gerçekleştir.

  5. unused döndür.

16.2.1.8.4 Modül Kaydı Soyut Metotlarının Somutlanması (Implementation of Module Record Abstract Methods)

Aşağıdakiler, Tablo 39 içinde tanımlanan karşılık gelen Modül Kaydı (Module Record) soyut metotlarını somutlayan, Sentetik Modül Kaydına (Synthetic Module Record) ait somut metotlardır.

16.2.1.8.4.1 LoadRequestedModules ( [ hostDefined ] )

Sentetik Modül Kaydı (Synthetic Module Record) module'ün LoadRequestedModules somut metodu, isteğe bağlı hostDefined (herhangi bir şey) argümanını alır ve bir Promise döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: LoadRequestedModules somut metodunun bu gerçekleştirimi hostDefined argümanını kullanmaz.

  2. ! PromiseResolve(%Promise%, undefined) işlemini gerçekleştir ve sonucunu döndür.

16.2.1.8.4.2 GetExportedNames ( [ exportStarSet ] )

Sentetik Modül Kaydı (Synthetic Module Record) module'ün GetExportedNames somut metodu, isteğe bağlı exportStarSet (bir Kaynak Metin Modül Kayıtlarının (Source Text Module Records) Listesi (List)) argümanını alır ve Dizelerin bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: GetExportedNames somut metodunun bu gerçekleştirimi exportStarSet argümanını kullanmaz.

  2. module.[[ExportNames]] değerini döndür.

16.2.1.8.4.3 ResolveExport ( exportName [ , resolveSet ] )

Sentetik Modül Kaydı (Synthetic Module Record) module'ün ResolveExport somut metodu, exportName (bir Dize) ve isteğe bağlı resolveSet (alanları [[Module]] (bir Modül Kaydı (Module Record)) ve [[ExportName]] (bir Dize) olan Kayıtların (Records) bir Listesi (List)) argümanlarını alır ve bir ResolvedBinding Kaydı (ResolvedBinding Record), null ya da ambiguous döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. NOTE: ResolveExport somut metodunun bu gerçekleştirimi resolveSet argümanını kullanmaz.

  2. module.[[ExportNames]], exportName öğesini içerir değilse, null döndür.

  3. ResolvedBinding Kaydı (ResolvedBinding Record) { [[Module]]: module, [[BindingName]]: exportName } döndür.

Sentetik Modül Kaydı (Synthetic Module Record) module'ün Link somut metodu hiçbir argüman almaz ve unused içeren bir normal tamamlanma (normal completion) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. realm, module.[[Realm]] olsun.

  2. envRecord, NewModuleEnvironment(realm.[[GlobalEnv]]) olsun.

  3. module.[[Environment]] değerini envRecord olarak ayarla.

  4. module.[[ExportNames]]'teki her bir String exportName için şunları yap:

    1. ! envRecord.CreateMutableBinding(exportName, false) işlemini gerçekleştir.

    2. ! envRecord.InitializeBinding(exportName, undefined) işlemini gerçekleştir.

  5. NormalCompletion(unused) döndür.

16.2.1.8.4.5 Evaluate ( )

Sentetik Modül Kaydı (Synthetic Module Record) module'ün Evaluate somut metodu hiçbir argüman almaz ve bir Promise döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. moduleContext, yeni bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) olsun.

  2. moduleContext'in Function alanını null olarak ayarla.

  3. moduleContext'in Realm alanını module.[[Realm]] olarak ayarla.

  4. moduleContext'in ScriptOrModule alanını module olarak ayarla.

  5. moduleContext'in VariableEnvironment alanını module.[[Environment]] olarak ayarla.

  6. moduleContext'in LexicalEnvironment alanını module.[[Environment]] olarak ayarla.

  7. Yürütülmekte olan yürütme bağlamını (running execution context) askıya al (suspend).

  8. moduleContext'i yürütme bağlamı yığınına (execution context stack) it (push); moduleContext artık yürütülmekte olan yürütme bağlamıdır (running execution context).

  9. steps, module.[[EvaluationSteps]] olsun.

  10. result, Completion(steps(module)) olsun.

  11. moduleContext'i askıya al ve yürütme bağlamı yığınından (execution context stack) çıkar.

  12. Şimdi yürütme bağlamı yığınının (execution context stack) en üstünde olan bağlamı, yürütülmekte olan yürütme bağlamı (running execution context) olarak geri sürdür (resume).

  13. promiseCapability, ! NewPromiseCapability(%Promise%) olsun.

  14. IfAbruptRejectPromise(result, promiseCapability) işlemini gerçekleştir.

  15. Perform ! Call(promiseCapability.[[Resolve]], undefined, « undefined ») işlemini gerçekleştir.

  16. promiseCapability.[[Promise]] değerini döndür.

16.2.1.9 GetImportedModule ( referrer, request )

Soyut işlem GetImportedModule; referrer (bir Cyclic Module Kaydı (Cyclic Module Record)) ve request (bir ModuleRequest Kaydı (ModuleRequest Record)) argümanlarını alır ve bir Modül Kaydı (Module Record) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. records, referrer.[[LoadedModules]]'teki ModuleRequestsEqual(r, request) değeri true olan her bir LoadedModuleRequest Kaydından (LoadedModuleRequest Record) r oluşan bir Liste (List) olsun.

  2. Assert: Bu soyut işlem çağrılmadan önce LoadRequestedModules işlemi referrer üzerinde başarıyla tamamlanmış olduğundan, records tam olarak tek bir öğeye sahiptir.

  3. record, records'un tek öğesi olsun.

  4. record.[[Module]] değerini döndür.

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

Barındırıcı tarafından tanımlanan (host-defined) soyut işlem HostLoadImportedModule; referrer (bir Script Kaydı (Script Record), bir Cyclic Module Kaydı (Cyclic Module Record) veya bir Realm Kaydı (Realm Record)), moduleRequest (bir ModuleRequest Kaydı (ModuleRequest Record)), hostDefined (herhangi bir şey) ve payload (bir GraphLoadingState Kaydı (GraphLoadingState Record) veya bir PromiseCapability Kaydı (PromiseCapability Record)) argümanlarını alır ve unused döndürür.

Bir HostLoadImportedModule gerçekleştirmesi aşağıdaki gereksinimlere uymalıdır:

Gerçekleştirilen fiili süreç barındırıcı tarafından tanımlanır (host-defined), ancak tipik olarak uygun Modül Kaydını (Module Record) yüklemek için gerekli olan her türlü G/Ç (I/O) işlemlerinin gerçekleştirilmesini içerir. Birden fazla farklı (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) üçlüsü aynı Modül Kaydı (Module Record) örneğine (instance) eşlenebilir. Fiili eşleme anlambilimi barındırıcı tarafından tanımlanır (host-defined), ancak tipik olarak eşleme sürecinin bir parçası olarak specifier üzerinde bir normalleştirme süreci uygulanır. Tipik bir normalleştirme süreci, göreceli ve kısaltılmış yol belirteçlerinin genişletilmesi gibi eylemleri içerir.

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

Soyut işlem FinishLoadingImportedModule; referrer (bir Script Kaydı (Script Record), bir Cyclic Module Kaydı (Cyclic Module Record) veya bir Realm Kaydı (Realm Record)), moduleRequest (bir ModuleRequest Kaydı (ModuleRequest Record)), payload (bir GraphLoadingState Kaydı (GraphLoadingState Record) veya bir PromiseCapability Kaydı (PromiseCapability Record)) ve result (bir Modül Kaydı (Module Record) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion)) argümanlarını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. result bir normal tamamlanma (normal completion) ise, o zaman

    1. referrer.[[LoadedModules]], ModuleRequestsEqual(record, moduleRequest) değeri true olan bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record) record içeriyorsa, o zaman

      1. Assert: record.[[Module]] ile result.[[Value]] aynı Modül Kaydı (Module Record) nesneleridir.
    2. Aksi takdirde,

      1. { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] } LoadedModuleRequest Kaydını (LoadedModuleRequest Record) referrer.[[LoadedModules]] listesine ekle.
  2. If payload is a GraphLoadingState Record, then

    1. Perform ContinueModuleLoading(payload, result).
  3. Else,

    1. Perform ContinueDynamicImport(payload, result).
  4. Return unused.

16.2.1.12 AllImportAttributesSupported ( attrs )

Soyut işlem AllImportAttributesSupported; attrs (bir ImportAttribute Kayıtlarının (ImportAttribute Records) Listesi (List)) argümanını alır ve bir Boole değeri döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. supported olsun HostGetSupportedImportAttributes().

  2. attrs'taki her bir ImportAttribute Kaydı (ImportAttribute Record) attr için şunları yap:

    1. supported, attr.[[Key]] öğesini içermiyorsa, return false.
  3. Return true.

16.2.1.12.1 HostGetSupportedImportAttributes ( )

Barındırıcı tarafından tanımlanan (host-defined) soyut işlem HostGetSupportedImportAttributes hiçbir argüman almaz ve Dizelerin bir Listesini (List) döndürür. Barındırıcı ortamların (host environments) hangi içe aktarım özniteliklerini desteklediklerini belirtmelerine olanak tanır. Yalnızca desteklenen anahtarlara sahip öznitelikler barındırıcıya (host) sağlanacaktır.

Bir HostGetSupportedImportAttributes gerçekleştirmesi aşağıdaki gereksinimlere uymalıdır:

  • Her biri desteklenen bir özniteliği belirten, Dizelerin bir Listesini (List) döndürmelidir.

  • Bu işlem her çağrıldığında, aynı içeriğe sahip aynı Listeyi (List) aynı sırada döndürmelidir.

HostGetSupportedImportAttributes varsayılan gerçekleştirmesi, yeni ve boş bir Liste (List) döndürmektir.

16.2.1.13 GetModuleNamespace ( module )

Soyut işlem GetModuleNamespace; module (Modül Kaydı (Module Record) nesnesinin somut bir alt sınıfının örneği) argümanını alır ve bir Modül Ad Alanı Nesnesi (Module Namespace Object) döndürür. module'ün dışa aktarımlarını temsil eden Modül Ad Alanı Nesnesini getirir; ilk talep edildiğinde tembelce (lazily) oluşturur ve gelecekte tekrar getirmek üzere module.[[Namespace]] içinde saklar. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: module bir Cyclic Module Kaydı (Cyclic Module Record) ise, o zaman module.[[Status]] değeri new veya unlinked değildir.

  2. namespace, module.[[Namespace]] olsun.

  3. namespace değeri empty ise, o zaman

    1. exportedNames, module.GetExportedNames() olsun.

    2. unambiguousNames, yeni ve boş bir Liste (List) olsun.

    3. exportedNames'in her bir name öğesi için şunları yap:

      1. resolution, module.ResolveExport(name) olsun.

      2. resolution bir ResolvedBinding Kaydı (ResolvedBinding Record) ise, name değerini unambiguousNames'e ekle.

    4. namespace değerini ModuleNamespaceCreate(module, unambiguousNames) olarak ayarla.

  4. namespace değerini döndür.

16.2.1.14 Çalışma Zamanı Anlambilimi: Evaluation

Module Module : [empty]

  1. undefined döndür.

ModuleBody ModuleBody : ModuleItemList

  1. result, Completion(ModuleItemList'in Evaluation (Değerlendirme) değeri) olsun.

  2. result bir normal tamamlanma (normal completion) ise ve result.[[Value]] değeri empty ise, o zaman

    1. undefined döndür.
  3. Return ? result.

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. sl, ? Evaluation of ModuleItemList olsun.

  2. s, Completion(Evaluation of ModuleItem) olsun.

  3. Return ? UpdateEmpty(s, sl).

ModuleItem ModuleItem : ImportDeclaration

  1. empty döndür.

16.2.2 İçe Aktarımlar (Imports)

Sözdizimi

ImportDeclaration ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ;

ImportClause ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports

ImportedDefaultBinding ImportedDefaultBinding : ImportedBinding

NameSpaceImport NameSpaceImport : ***** as ImportedBinding

NamedImports NamedImports : { } { ImportsList } { ImportsList , }

FromClause FromClause : from ModuleSpecifier

ImportsList ImportsList : ImportSpecifier ImportsList , ImportSpecifier

ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding

ModuleSpecifier ModuleSpecifier : StringLiteral

ImportedBinding ImportedBinding : BindingIdentifier[~Yield, +Await]

WithClause WithClause : with { } with { WithEntries ,opt }

WithEntries WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries

AttributeKey AttributeKey : IdentifierName StringLiteral

16.2.2.1 Statik Anlambilim: Erken Hatalar

ModuleItem ModuleItem : ImportDeclaration

WithClause WithClause : with { WithEntries ,opt }

  • WithClause'un WithClauseToAttributes değeri, a.[[Key]] ile b.[[Key]] aynı olacak şekilde iki farklı a ve b girdisine sahipse bu bir Sözdizimi Hatasıdır.

16.2.2.2 Statik Anlambilim: ImportEntries

Sözdizimi yönelimli işlem (syntax-directed operation) ImportEntries hiçbir argüman almaz ve ImportEntry Kayıtlarının (ImportEntry Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

Module Module : [empty]

  1. Yeni ve boş bir Liste (List) döndür.

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. entries1, ModuleItemList'in ImportEntries değeri olsun.

  2. entries2, ModuleItem'in ImportEntries değeri olsun.

  3. entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.

ModuleItem ModuleItem : ExportDeclaration StatementListItem

  1. Yeni ve boş bir Liste (List) döndür.

ImportDeclaration ImportDeclaration : import ImportClause FromClause WithClauseopt ;

  1. module, ImportDeclaration'ın ModuleRequests değerinin tek öğesi olsun.

  2. Argüman olarak module verilerek ImportClause'un ImportEntriesForModule değerini döndür.

ImportDeclaration ImportDeclaration : import ModuleSpecifier WithClauseopt ;

  1. Yeni ve boş bir Liste (List) döndür.

16.2.2.3 Statik Anlambilim: ImportEntriesForModule

Sözdizimi yönelimli işlem (syntax-directed operation) ImportEntriesForModule, module (bir ModuleRequest Kaydı (ModuleRequest Record)) argümanını alır ve ImportEntry Kayıtlarının (ImportEntry Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

ImportClause ImportClause : ImportedDefaultBinding , NameSpaceImport

  1. entries1, argüman olarak module verilerek ImportedDefaultBinding'in ImportEntriesForModule değeri olsun.

  2. entries2, argüman olarak module verilerek NameSpaceImport'in ImportEntriesForModule değeri olsun.

  3. entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.

ImportClause ImportClause : ImportedDefaultBinding , NamedImports

  1. entries1, argüman olarak module verilerek ImportedDefaultBinding'in ImportEntriesForModule değeri olsun.

  2. entries2, argüman olarak module verilerek NamedImports'in ImportEntriesForModule değeri olsun.

  3. entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.

ImportedDefaultBinding ImportedDefaultBinding : ImportedBinding

  1. localName, ImportedBinding'in BoundNames değerinin tek öğesi olsun.

  2. defaultEntry, ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName } olsun.

  3. « defaultEntry » döndür.

NameSpaceImport NameSpaceImport : ***** as ImportedBinding

  1. localName, ImportedBinding'in StringValue değeri olsun.

  2. entry, ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: localName } olsun.

  3. « entry » döndür.

NamedImports NamedImports : { }

  1. Yeni ve boş bir Liste (List) döndür.

ImportsList ImportsList : ImportsList , ImportSpecifier

  1. specs1, argüman olarak module verilerek ImportsList'in ImportEntriesForModule değeri olsun.

  2. specs2, argüman olarak module verilerek ImportSpecifier'in ImportEntriesForModule değeri olsun.

  3. specs1 ve specs2 değerlerinin liste birleşimini (list-concatenation) döndür.

ImportSpecifier ImportSpecifier : ImportedBinding

  1. localName, ImportedBinding'in BoundNames değerinin tek öğesi olsun.

  2. entry, ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName } olsun.

  3. « entry » döndür.

ImportSpecifier ImportSpecifier : ModuleExportName as ImportedBinding

  1. importName, ModuleExportName'in StringValue değeri olsun.

  2. localName, ImportedBinding'in StringValue değeri olsun.

  3. entry, ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName } olsun.

  4. « entry » döndür.

16.2.2.4 Statik Anlambilim: WithClauseToAttributes

Sözdizimi yönelimli işlem (syntax-directed operation) WithClauseToAttributes hiçbir argüman almaz ve ImportAttribute Kayıtlarının (ImportAttribute Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

WithClause WithClause : with { }

  1. Yeni ve boş bir Liste (List) döndür.

WithClause WithClause : with { WithEntries ,opt }

  1. attrs, WithEntries'in WithClauseToAttributes değeri olsun.

  2. attrs listesini, her bir alanın değerini UTF-16 kod birimi değerleri dizisi olarak ele alarak, [[Key]] alanlarının sözlük sırasına (lexicographic order) göre sırala. NOTE: Bu sıralama yalnızca barındırıcıların (hosts), özniteliklerin numaralandırılma sırasına dayanarak davranışlarını değiştirmelerinin yasaklanmış olması bakımından gözlemlenebilirdir.

  3. attrs değerini döndür.

WithEntries WithEntries : AttributeKey : StringLiteral

  1. key, AttributeKey'in PropName değeri olsun.

  2. entry, ImportAttribute Kaydı (ImportAttribute Record) { [[Key]]: key, [[Value]]: StringLiteral'ın SV değeri } olsun.

  3. « entry » döndür.

WithEntries WithEntries : AttributeKey : StringLiteral , WithEntries

  1. key, AttributeKey'in PropName değeri olsun.

  2. entry, ImportAttribute Kaydı (ImportAttribute Record) { [[Key]]: key, [[Value]]: StringLiteral'ın SV değeri } olsun.

  3. rest, WithEntries'in WithClauseToAttributes değeri olsun.

  4. « entry » ve rest değerlerinin liste birleşimini (list-concatenation) döndür.

16.2.3 Dışa Aktarımlar (Exports)

Sözdizimi

ExportDeclaration 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 ExportFromClause : ***** ***** as ModuleExportName NamedExports

NamedExports NamedExports : { } { ExportsList } { ExportsList , }

ExportsList ExportsList : ExportSpecifier ExportsList , ExportSpecifier

ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 Statik Anlambilim: Erken Hatalar

ExportDeclaration ExportDeclaration : export NamedExports ;

16.2.3.2 Statik Anlambilim: ExportedBindings

Sözdizimi yönelimli işlem (syntax-directed operation) ExportedBindings hiçbir argüman almaz ve Dizelerin bir Listesini (List) döndürür.

Aşağıdaki üretimler üzerinden parça parça tanımlanır:

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. names1, ModuleItemList'in ExportedBindings değeri olsun.

  2. names2, ModuleItem'in ExportedBindings değeri olsun.

  3. names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.

ModuleItem ModuleItem : ImportDeclaration StatementListItem

  1. Yeni ve boş bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;

  1. Yeni ve boş bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export NamedExports ;

  1. NamedExports'ın ExportedBindings değerini döndür.

ExportDeclaration ExportDeclaration : export VariableStatement

  1. VariableStatement'in BoundNames değerini döndür.

ExportDeclaration ExportDeclaration : export Declaration

  1. Declaration'in BoundNames değerini döndür.

ExportDeclaration ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;

  1. Bu ExportDeclaration'ın BoundNames değerini döndür.

NamedExports NamedExports : { }

  1. Yeni ve boş bir Liste (List) döndür.

ExportsList ExportsList : ExportsList , ExportSpecifier

  1. names1, ExportsList'in ExportedBindings değeri olsun.

  2. names2, ExportSpecifier'in ExportedBindings değeri olsun.

  3. names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName

  1. Tek öğesi ModuleExportName'in StringValue değeri olan bir Liste (List) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName

  1. Tek öğesi ilk ModuleExportName'in StringValue değeri olan bir Liste (List) döndür.

16.2.3.3 Statik Anlambilim: ExportedNames

Sözdizimi yönelimli işlem (syntax-directed operation) ExportedNames hiçbir argüman almaz ve Dizelerin bir Listesini (List) döndürür.

Aşağıdaki üretimler üzerinden parça parça tanımlanır:

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. names1, ModuleItemList'in ExportedNames değeri olsun.

  2. names2, ModuleItem'in ExportedNames değeri olsun.

  3. names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.

ModuleItem ModuleItem : ExportDeclaration

  1. ExportDeclaration'ın ExportedNames değerini döndür.

ModuleItem ModuleItem : ImportDeclaration StatementListItem

  1. Yeni ve boş bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;

  1. ExportFromClause'un ExportedNames değerini döndür.

ExportFromClause ExportFromClause : *****

  1. Yeni ve boş bir Liste (List) döndür.

ExportFromClause ExportFromClause : ***** as ModuleExportName

  1. Tek öğesi ModuleExportName'in StringValue değeri olan bir Liste (List) döndür.

ExportFromClause ExportFromClause : NamedExports

  1. NamedExports'ın ExportedNames değerini döndür.

ExportDeclaration ExportDeclaration : export VariableStatement

  1. VariableStatement'in BoundNames değerini döndür.

ExportDeclaration ExportDeclaration : export Declaration

  1. Declaration'in BoundNames değerini döndür.

ExportDeclaration ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;

  1. « "default" » döndür.

NamedExports NamedExports : { }

  1. Yeni ve boş bir Liste (List) döndür.

ExportsList ExportsList : ExportsList , ExportSpecifier

  1. names1, ExportsList'in ExportedNames değeri olsun.

  2. names2, ExportSpecifier'in ExportedNames değeri olsun.

  3. names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName

  1. Tek öğesi ModuleExportName'in StringValue değeri olan bir Liste (List) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName

  1. Tek öğesi ikinci ModuleExportName'in StringValue değeri olan bir Liste (List) döndür.

16.2.3.4 Statik Anlambilim: ExportEntries

Sözdizimi yönelimli işlem (syntax-directed operation) ExportEntries hiçbir argüman almaz ve ExportEntry Kayıtlarının (ExportEntry Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

Module Module : [empty]

  1. Yeni ve boş bir Liste (List) döndür.

ModuleItemList ModuleItemList : ModuleItemList ModuleItem

  1. entries1, ModuleItemList'in ExportEntries değeri olsun.

  2. entries2, ModuleItem'in ExportEntries değeri olsun.

  3. entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.

ModuleItem ModuleItem : ImportDeclaration StatementListItem

  1. Yeni ve boş bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;

  1. module, ExportDeclaration'ın ModuleRequests değerinin tek öğesi olsun.

  2. Argümanı module olan, ExportFromClause'un ExportEntriesForModule değerini döndür.

ExportDeclaration ExportDeclaration : export NamedExports ;

  1. Argümanı null olan, NamedExports'ın ExportEntriesForModule değerini döndür.

ExportDeclaration ExportDeclaration : export VariableStatement

  1. entries, yeni ve boş bir Liste (List) olsun.

  2. names, VariableStatement'in BoundNames değeri olsun.

  3. names listesinin her bir name öğesi için sırayla şunları yap:

    1. ExportEntry Kaydını (ExportEntry Record) { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } entries listesine ekle.
  4. entries değerini döndür.

ExportDeclaration ExportDeclaration : export Declaration

  1. entries, yeni ve boş bir Liste (List) olsun.

  2. names, Declaration'ın BoundNames değeri olsun.

  3. names listesinin her bir name öğesi için sırayla şunları yap:

    1. ExportEntry Kaydını (ExportEntry Record) { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name } entries listesine ekle.
  4. entries değerini döndür.

ExportDeclaration ExportDeclaration : export default HoistableDeclaration

  1. names, HoistableDeclaration'ın BoundNames değeri olsun.

  2. localName, names listesinin tek öğesi olsun.

  3. Tek öğesi yeni bir ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } olan bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export default ClassDeclaration

  1. names, ClassDeclaration'ın BoundNames değeri olsun.

  2. localName, names listesinin tek öğesi olsun.

  3. Tek öğesi yeni bir ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" } olan bir Liste (List) döndür.

ExportDeclaration ExportDeclaration : export default AssignmentExpression ;

  1. entry, ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" } olsun.

  2. « entry » döndür.

16.2.3.5 Statik Anlambilim: ExportEntriesForModule

Sözdizimi yönelimli işlem (syntax-directed operation) ExportEntriesForModule, module (bir ModuleRequest Kaydı (ModuleRequest Record) veya null) argümanını alır ve ExportEntry Kayıtlarının (ExportEntry Records) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

ExportFromClause ExportFromClause : *****

  1. entry, ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null } olsun.

  2. « entry » döndür.

ExportFromClause ExportFromClause : ***** as ModuleExportName

  1. exportName, ModuleExportName'in StringValue değeri olsun.

  2. entry, ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: namespace, [[LocalName]]: null, [[ExportName]]: exportName } olsun.

  3. « entry » döndür.

NamedExports NamedExports : { }

  1. Yeni ve boş bir Liste (List) döndür.

ExportsList ExportsList : ExportsList , ExportSpecifier

  1. specs1, argümanı module olan, ExportsList'in ExportEntriesForModule değeri olsun.

  2. specs2, argümanı module olan, ExportSpecifier'in ExportEntriesForModule değeri olsun.

  3. specs1 ve specs2 değerlerinin liste birleşimini (list-concatenation) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName

  1. sourceName, ModuleExportName'in StringValue değeri olsun.

  2. Eğer module null ise, o halde

    1. localName, sourceName olsun.

    2. importName, null olsun.

  3. Değilse,

    1. localName, null olsun.

    2. importName, sourceName olsun.

  4. Tek öğesi yeni bir ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } olan bir Liste (List) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName

  1. sourceName, ilk ModuleExportName'in StringValue değeri olsun.

  2. exportName, ikinci ModuleExportName'in StringValue değeri olsun.

  3. Eğer module null ise, o halde

    1. localName, sourceName olsun.

    2. importName, null olsun.

  4. Değilse,

    1. localName, null olsun.

    2. importName, sourceName olsun.

  5. Tek öğesi yeni bir ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } olan bir Liste (List) döndür.

16.2.3.6 Statik Anlambilim: ReferencedBindings

Sözdizimi yönelimli işlem (syntax-directed operation) ReferencedBindings hiçbir argüman almaz ve Ayrıştırma Düğümlerinin (Parse Nodes) bir Listesini (List) döndürür. Aşağıdaki üretimler üzerinden parça parça tanımlanır:

NamedExports NamedExports : { }

  1. Yeni ve boş bir Liste (List) döndür.

ExportsList ExportsList : ExportsList , ExportSpecifier

  1. names1, ExportsList'in ReferencedBindings değeri olsun.

  2. names2, ExportSpecifier'in ReferencedBindings değeri olsun.

  3. names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.

ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName

  1. İlk ModuleExportName'in ReferencedBindings değerini döndür.

ModuleExportName ModuleExportName : IdentifierName

  1. Tek öğesi IdentifierName olan bir Liste (List) döndür.

ModuleExportName ModuleExportName : StringLiteral

  1. Tek öğesi StringLiteral olan bir Liste (List) döndür.

16.2.3.7 Çalışma Zamanı Anlambilimi: Değerlendirme (Evaluation)

ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;

  1. empty döndür.

ExportDeclaration ExportDeclaration : export VariableStatement

  1. ? VariableStatement'in Evaluation değerini döndür.

ExportDeclaration ExportDeclaration : export Declaration

  1. ? Declaration'in Evaluation değerini döndür.

ExportDeclaration ExportDeclaration : export default HoistableDeclaration

  1. ? HoistableDeclaration'in Evaluation değerini döndür.

ExportDeclaration ExportDeclaration : export default ClassDeclaration

  1. value, ? ClassDeclaration'ın BindingClassDeclarationEvaluation değeri olsun.

  2. className, ClassDeclaration'ın BoundNames değerinin tek öğesi olsun.

  3. Eğer className "*default*" ise, o halde

    1. envRecord, yürütülmekte olan yürütme bağlamının (running execution context) LexicalEnvironment'ı olsun.

    2. ? InitializeBoundName("*default*", value, envRecord) işlemini gerçekleştir.

  4. empty döndür.

ExportDeclaration ExportDeclaration : export default AssignmentExpression ;

  1. Eğer IsAnonymousFunctionDefinition(AssignmentExpression) değeri true ise, o halde

    1. value, argümanı "default" olan, AssignmentExpression'in ? NamedEvaluation değeri olsun.
  2. Değilse,

    1. rhs, AssignmentExpression'in ? Evaluation değeri olsun.

    2. value, ? GetValue(rhs) olsun.

  3. envRecord, yürütülmekte olan yürütme bağlamının (running execution context) LexicalEnvironment'ı olsun.

  4. ? InitializeBoundName("*default*", value, envRecord) işlemini gerçekleştir.

  5. empty döndür.