Bir kök (root) module için asenkron yürütme tamamlandığında (fulfilled), bu işlev bu tamamlanma üzerine eşzamanlı (synchronously) olarak birlikte yürütülebilecek modüllerin listesini belirler ve bunları execList 'e doldurur.
# 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:
module .[[Status]] değeri evaluated ise, o zaman
Assert : module .[[EvaluationError]] değeri empty değildir.
unused döndür.
Assert : module .[[Status]] değeri evaluating-async durumundadır.
Assert : module .[[AsyncEvaluationOrder]] bir tamsayıdır (integer) .
Assert : module .[[EvaluationError]] değeri emptydir.
module .[[AsyncEvaluationOrder]] değerini done olarak ayarla.
module .[[Status]] değerini evaluated olarak ayarla.
module .[[TopLevelCapability]] değeri empty değilse, o zaman
Assert : module .[[CycleRoot]] ve module aynı Modül Kaydı (Module Record) dur.
Perform ! Call (module .[[TopLevelCapability]] .[[Resolve]] , undefined, « undefined ») işlemini gerçekleştir.
execList , yeni ve boş bir Liste (List) olsun.
GatherAvailableAncestors (module , execList ) işlemini gerçekleştir.
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.
sortedExecList , execList 'in öğelerinden oluşan ve [[AsyncEvaluationOrder]] alanlarına göre artan sırada sıralanmış bir Liste (List) olsun.
sortedExecList 'teki her bir Cyclic Module Kaydı (Cyclic Module Record) ancestorModule için şunları yap:
ancestorModule .[[Status]] değeri evaluated ise, o zaman
Assert : ancestorModule .[[EvaluationError]] değeri empty değildir.
Aksi takdirde, ancestorModule .[[HasTLA]] değeri true ise, o zaman
ExecuteAsyncModule (ancestorModule ) işlemini gerçekleştir.
Aksi takdirde,
result , Completion (ancestorModule .ExecuteModule ()) olsun.
result bir ani tamamlanma (abrupt completion) ise, o zaman
1. [AsyncModuleExecutionRejected](#sec-async-module-execution-rejected)(*ancestorModule*, *result*.*[[Value]]*) işlemini gerçekleştir.
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.
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:
module .[[Status]] değeri evaluated ise, o zaman
Assert : module .[[EvaluationError]] değeri empty değildir.
unused döndür.
Assert : module .[[Status]] değeri evaluating-async durumundadır.
Assert : module .[[AsyncEvaluationOrder]] bir tamsayıdır (integer) .
Assert : module .[[EvaluationError]] değeri emptydir.
module .[[EvaluationError]] değerini ThrowCompletion (error ) olarak ayarla.
module .[[Status]] değerini evaluated olarak ayarla.
module .[[AsyncEvaluationOrder]] değerini done olarak ayarla.
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.
module .[[TopLevelCapability]] değeri empty değilse, o zaman
Assert : module .[[CycleRoot]] ve module aynı Modül Kaydı (Module Record) dur.
Perform ! Call (module .[[TopLevelCapability]] .[[Reject]] , undefined, « error ») işlemini gerçekleştir.
module .[[AsyncParentModules]] 'teki her bir Cyclic Module Kaydı (Cyclic Module Record) ancestorModule için şunları yap:
AsyncModuleExecutionRejected (ancestorModule , error ) işlemini gerçekleştir.
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ı
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.
NOT
Tablo 54 , sözdizimsel içe aktarım biçimlerini temsil etmek için kullanılan ImportEntry kaydı alanlarına örnekler vermektedir:
Tablo 54 (Bilgilendirici): İçe Aktarım Biçimlerinin ImportEntry Kayıtları (ImportEntry Records) ile Eşleşmeleri
İçe Aktarım İfadesi Biçimi
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
Bir ImportEntry Kaydı (ImportEntry Record) oluşturulmaz.
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.
NOT
Tablo 56 , sözdizimsel dışa aktarım biçimlerini temsil etmek için kullanılan ExportEntry kaydı alanlarına örnekler vermektedir:
Tablo 56 (Bilgilendirici): Dışa Aktarım Biçimlerinin ExportEntry Kayıtları (ExportEntry Records) ile Eşleşmeleri
Dışa Aktarım İfadesi Biçimi
[[ExportName]]
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
export var v;
"v"
null
null
"v"
export default function f() {}
"default"
null
null
"f"
export default function () {}
"default"
null
null
"*default*"
export default 42;
"default"
null
null
"*default*"
export {x};
"x"
null
null
"x"
export {v as x};
"x"
null
null
"v"
export {x} from "mod";
"x"
"mod"
"x"
null
export {v as x} from "mod";
"x"
"mod"
"v"
null
export * from "mod";
null
"mod"
all-but-default
null
export * as ns from "mod";
"ns"
"mod"
namespace
null
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:
body , ParseText (sourceText , Module ) olsun.
body bir hata Listesi (List) ise, body değerini döndür.
requestedModules , body 'nin ModuleRequests değeri olsun.
importEntries , body 'nin ImportEntries değeri olsun.
importedBoundNames , ImportedLocalNames (importEntries ) olsun.
indirectExportEntries , yeni ve boş bir Liste (List) olsun.
localExportEntries , yeni ve boş bir Liste (List) olsun.
starExportEntries , yeni ve boş bir Liste (List) olsun.
exportEntries , body 'nin ExportEntries değeri olsun.
exportEntries 'taki her bir ExportEntry Kaydı (ExportEntry Record) exportEntry için şunları yap:
exportEntry .[[ModuleRequest]] değeri null ise, o zaman
importedBoundNames , exportEntry .[[LocalName]] öğesini içermiyorsa, o zaman
1. *exportEntry* değerini *localExportEntries*'e ekle.
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.
Aksi takdirde, exportEntry .[[ImportName]] değeri all-but-default ise, o zaman
Assert : exportEntry .[[ExportName]] değeri nulldır.
exportEntry değerini starExportEntries 'e ekle.
Aksi takdirde,
exportEntry değerini indirectExportEntries 'e ekle.
async , body Contains (içeriyor) await değeri olsun.
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.
NOT
Bir gerçekleştirim, modül kaynak metnini ayrıştırabilir ve o modül kaynak metni için ParseModule değerlendirilmeden önce Erken Hata (Early Error) koşulları açısından analiz edebilir. Ancak, hataların raporlanması bu spesifikasyonun söz konusu kaynak metin üzerinde ParseModule işlemini fiilen gerçekleştirdiği ana kadar ertelenmelidir.
# 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:
Assert : module .[[Status]] değeri new değildir.
exportStarSet mevcut değilse, exportStarSet değerini yeni ve boş bir Liste (List) olarak ayarla.
exportStarSet , module öğesini içeriyorsa, o zaman
Assert : Bir export * döngüselliğinin başlangıç noktasına ulaştık.
Yeni ve boş bir Liste (List) döndür.
module değerini exportStarSet 'e ekle.
exportedNames , yeni ve boş bir Liste (List) olsun.
module .[[LocalExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
Assert : module , bu dışa aktarım için doğrudan bağlamayı sağlar.
Assert : e .[[ExportName]] değeri null değildir.
e .[[ExportName]] değerini exportedNames 'e ekle.
module .[[IndirectExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
Assert : module , bu dışa aktarım için belirli bir bağlamayı içe aktarır.
Assert : e .[[ExportName]] değeri null değildir.
e .[[ExportName]] değerini exportedNames 'e ekle.
module .[[StarExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
Assert : e .[[ModuleRequest]] değeri null değildir.
requestedModule , GetImportedModule (module , e .[[ModuleRequest]] ) olsun.
starNames , requestedModule .GetExportedNames (exportStarSet ) olsun.
starNames 'teki her bir n öğesi için şunları yap:
n değeri "default" değilse, o zaman
1. *exportedNames*, *n* öğesini içermiyorsa, o zaman
1. *n* değerini *exportedNames*'e ekle.
exportedNames değerini döndür.
NOT
GetExportedNames , belirsiz star export bağlamalarına sahip adları filtrelemez veya bunlar için bir istisna fırlatmaz.
# 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:
Assert : module .[[Status]] değeri new değildir.
resolveSet mevcut değilse, resolveSet değerini yeni ve boş bir Liste (List) olarak ayarla.
resolveSet 'teki her bir { [[Module]] , [[ExportName]] } Kaydı (Record) record için şunları yap:
module ve record .[[Module]] aynı Modül Kaydı (Module Record) ise ve exportName ile record .[[ExportName]] aynı ise, o zaman
Assert : Bu döngüsel bir içe aktarım isteğidir.
null döndür.
{ [[Module]] : module , [[ExportName]] : exportName } Kaydını (Record) resolveSet 'e ekle.
module .[[LocalExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
e .[[ExportName]] ile exportName aynı ise, o zaman
Assert : module , bu dışa aktarım için doğrudan bağlamayı sağlar.
ResolvedBinding Kaydı (ResolvedBinding Record) { [[Module]] : module , [[BindingName]] : e .[[LocalName]] } döndür.
module .[[IndirectExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
e .[[ExportName]] ile exportName aynı ise, o zaman
Assert : e .[[ModuleRequest]] değeri null değildir.
importedModule , GetImportedModule (module , e .[[ModuleRequest]] ) olsun.
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.
Assert : module , bu dışa aktarım için belirli bir bağlamayı içe aktarır.
Assert : e .[[ImportName]] bir Dizedir (is a String) .
Return importedModule .ResolveExport (e .[[ImportName]] , resolveSet ).
exportName değeri "default" ise, o zaman
Assert : A default export was not explicitly defined by this module.
Return null.
NOTE : A default export cannot be provided by an export * from "mod" declaration.
starResolution , null olsun.
module .[[StarExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
Assert : e .[[ModuleRequest]] değeri null değildir.
importedModule , GetImportedModule (module , e .[[ModuleRequest]] ) olsun.
resolution , importedModule .ResolveExport (exportName , resolveSet ) olsun.
resolution değeri ambiguous ise, ambiguous döndür.
resolution değeri null değilse, o zaman
Assert : resolution bir ResolvedBinding Kaydı (ResolvedBinding Record) dur.
starResolution değeri null ise, o zaman
1. *starResolution* değerini *resolution* olarak ayarla.
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.
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:
module .[[IndirectExportEntries]] 'teki her bir ExportEntry Kaydı (ExportEntry Record) e için şunları yap:
Assert : e .[[ExportName]] değeri null değildir.
resolution , module .ResolveExport (e .[[ExportName]] ) olsun.
resolution değeri null veya ambiguous ise, bir SyntaxError istisnası fırlat.
Assert : resolution bir ResolvedBinding Kaydı (ResolvedBinding Record) dur.
Assert : module 'den yapılan tüm adlandırılmış dışa aktarımlar çözümlenebilirdir.
realm , module .[[Realm]] olsun.
Assert : realm değeri undefined değildir.
envRecord , NewModuleEnvironment (realm .[[GlobalEnv]] ) olsun.
module .[[Environment]] değerini envRecord olarak ayarla.
module .[[ImportEntries]] 'teki her bir ImportEntry Kaydı (ImportEntry Record) in için şunları yap:
importedModule , GetImportedModule (module , in .[[ModuleRequest]] ) olsun.
in .[[ImportName]] değeri namespace ise, o zaman
namespace , GetModuleNamespace (importedModule ) olsun.
! envRecord .CreateImmutableBinding (in .[[LocalName]] , true) işlemini gerçekleştir.
! envRecord .InitializeBinding (in .[[LocalName]] , namespace ) işlemini gerçekleştir.
Aksi takdirde,
Assert : in .[[ImportName]] bir Dizedir (is a String) .
resolution , importedModule .ResolveExport (in .[[ImportName]] ) olsun.
resolution değeri null veya ambiguous ise, bir SyntaxError istisnası fırlat.
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.
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.
moduleContext , yeni bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) olsun.
moduleContext 'in Function alanını null olarak ayarla.
Assert : module .[[Realm]] değeri undefined değildir.
moduleContext 'in Realm alanını module .[[Realm]] olarak ayarla.
moduleContext 'in ScriptOrModule alanını module olarak ayarla.
moduleContext 'in VariableEnvironment alanını module .[[Environment]] olarak ayarla.
moduleContext 'in LexicalEnvironment alanını module .[[Environment]] olarak ayarla.
moduleContext 'in PrivateEnvironment alanını null olarak ayarla.
module .[[Context]] değerini moduleContext olarak ayarla.
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) .
code , module .[[ECMAScriptCode]] olsun.
variableDecls , code 'un VarScopedDeclarations değeri olsun.
declaredVariableNames , yeni ve boş bir Liste (List) olsun.
variableDecls 'in her bir d öğesi için şunları yap:
d 'nin BoundNames değerindeki her bir dn öğesi için şunları yap:
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.
lexicalDecls , code 'un LexicallyScopedDeclarations değeri olsun.
privateEnv , null olsun.
lexicalDecls 'in her bir d öğesi için şunları yap:
d 'nin BoundNames değerindeki her bir dn öğesi için şunları yap:
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.
Aksi takdirde,
1. ! *envRecord*.[CreateMutableBinding](10_sec-executable-code-and-execution-contexts.md#abstract-createmutablebinding)(*dn*, `false`) işlemini gerçekleştir.
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.
moduleContext 'i yürütme bağlamı yığınından (execution context stack) çıkar.
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:
Assert : module bağlanmıştır ve modül ortamındaki bildirimler örneklendirilmiştir (instantiated).
moduleContext , module .[[Context]] olsun.
module .[[HasTLA]] değeri false ise, o zaman
Assert : capability mevcut değildir.
Yürütülmekte olan yürütme bağlamını (running execution context) askıya al (suspend).
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) .
result , Completion (module .[[ECMAScriptCode]] 'un Evaluation (Değerlendirme) değeri) olsun.
moduleContext 'i askıya al ve yürütme bağlamı yığınından (execution context stack) çıkar.
Ş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).
result bir ani tamamlanma (abrupt completion) ise, o zaman
Return ? result .
Aksi takdirde,
Assert : capability bir PromiseCapability Kaydı (PromiseCapability Record) dur.
AsyncBlockStart (capability , module .[[ECMAScriptCode]] , moduleContext ) işlemini gerçekleştir.
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.
NOT
Bir Sentetik Modül Kaydı (Synthetic Module Record), çeşitli modül türlerini tanımlamak için kullanılabilir: örneğin, JSON modülleri veya CSS modülleri.
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ı
# 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:
realm , geçerli Realm Kaydı (current Realm Record) olsun.
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:
SetSyntheticModuleExport (module , "default", defaultExport ) işlemini gerçekleştir.
NormalCompletion (unused) döndür.
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:
parseResult , ? ParseJSON (source ) olsun.
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:
Assert : module .[[ExportNames]] , exportName öğesini içerir.
envRecord , module .[[Environment]] olsun.
Assert : envRecord değeri empty değildir.
! envRecord .SetMutableBinding (exportName , exportValue , true) işlemini gerçekleştir.
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:
NOTE : LoadRequestedModules somut metodunun bu gerçekleştirimi hostDefined argümanını kullanmaz.
! PromiseResolve (%Promise% , undefined) işlemini gerçekleştir ve sonucunu döndür.
NOT
Sentetik Modül Kayıtlarının (Synthetic Module Records) hiçbir bağımlılığı yoktur.
# 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:
NOTE : GetExportedNames somut metodunun bu gerçekleştirimi exportStarSet argümanını kullanmaz.
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:
NOTE : ResolveExport somut metodunun bu gerçekleştirimi resolveSet argümanını kullanmaz.
module .[[ExportNames]] , exportName öğesini içerir değilse, null döndür.
ResolvedBinding Kaydı (ResolvedBinding Record) { [[Module]] : module , [[BindingName]] : exportName } döndür.
# 16.2.1.8.4.4 Link ( )
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:
realm , module .[[Realm]] olsun.
envRecord , NewModuleEnvironment (realm .[[GlobalEnv]] ) olsun.
module .[[Environment]] değerini envRecord olarak ayarla.
module .[[ExportNames]] 'teki her bir String exportName için şunları yap:
! envRecord .CreateMutableBinding (exportName , false) işlemini gerçekleştir.
! envRecord .InitializeBinding (exportName , undefined) işlemini gerçekleştir.
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:
moduleContext , yeni bir ECMAScript kodu yürütme bağlamı (ECMAScript code execution context) olsun.
moduleContext 'in Function alanını null olarak ayarla.
moduleContext 'in Realm alanını module .[[Realm]] olarak ayarla.
moduleContext 'in ScriptOrModule alanını module olarak ayarla.
moduleContext 'in VariableEnvironment alanını module .[[Environment]] olarak ayarla.
moduleContext 'in LexicalEnvironment alanını module .[[Environment]] olarak ayarla.
Yürütülmekte olan yürütme bağlamını (running execution context) askıya al (suspend).
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) .
steps , module .[[EvaluationSteps]] olsun.
result , Completion (steps (module )) olsun.
moduleContext 'i askıya al ve yürütme bağlamı yığınından (execution context stack) çıkar.
Ş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).
promiseCapability , ! NewPromiseCapability (%Promise% ) olsun.
IfAbruptRejectPromise (result , promiseCapability ) işlemini gerçekleştir.
Perform ! Call (promiseCapability .[[Resolve]] , undefined, « undefined ») işlemini gerçekleştir.
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:
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.
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.
record , records 'un tek öğesi olsun.
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.
NOT
referrer parametresinin bir Realm Kaydı (Realm Record) olabileceği duruma örnek olarak web tarayıcısı olan bir barındırıcı (host) verilebilir. Burada, eğer bir kullanıcı şu şekilde tanımlanmış bir kontrol elemanına tıklarsa:
<button type="button" onclick="import('./foo.mjs')">Click me</button>
import() ifadesinin çalıştığı sırada hiçbir aktif betik veya modül (active script or module) olmayacaktır. Daha genel olarak bu durum, barındırıcının (host) , ScriptOrModule bileşenleri null olan yürütme bağlamlarını (execution contexts) yürütme bağlamı yığınına (execution context stack) ittiği herhangi bir durumda meydana gelebilir.
Bir HostLoadImportedModule gerçekleştirmesi aşağıdaki gereksinimlere uymalıdır:
Barındırıcı ortam (host environment) ; result değeri ya yüklenen Modül Kaydını (Module Record) içeren bir normal tamamlanma (normal completion) ya da bir fırlatma tamamlanması (throw completion) olacak şekilde, eşzamanlı (synchronously) veya asenkron (asynchronously) olarak FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) işlemini gerçekleştirrmelidir.
Bu işlem, şu şekilde iki adet (referrer , moduleRequest ) ikilisi ile birden fazla kez çağrılırsa:
ilk referrer ile ikinci referrer aynı ise;
ModuleRequestsEqual (ilk moduleRequest , ikinci moduleRequest ) değeri true ise;
ve result bir normal tamamlanma (normal completion) olacak şekilde FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) işlemini gerçekleştirirse, o zaman her seferinde aynı result değeriyle FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) işlemini gerçekleştirmelidir.
moduleRequest .[[Attributes]] içinde, entry .[[Key]] değeri "type" ve entry .[[Value]] değeri "json" olan bir entry girdisi varsa, barındırıcı ortam (host environment) FinishLoadingImportedModule (referrer , moduleRequest , payload , result ) işlemini gerçekleştirdiğinde, result ya bir ParseJSONModule çağrısından dönen Tamamlanma Kaydı (Completion Record) ya da bir fırlatma tamamlanması (throw completion) olmalıdır.
Bu işlem, payload değerini FinishLoadingImportedModule işlemine doğrudan aktarılacak opak (opaque) bir değer olarak ele almalı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.
NOT
Yukarıdaki metin, type: "json" ile içe aktarıldığında (ve HostLoadImportedModule normal şekilde tamamlandığında) barındırıcıların (hosts) JSON modüllerini desteklemesini gerektirir, ancak barındırıcıların (hosts) type: "json" olmadan içe aktarılan JSON modüllerini desteklemesini yasaklamaz.
# 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:
result bir normal tamamlanma (normal completion) ise, o zaman
referrer .[[LoadedModules]] , ModuleRequestsEqual (record , moduleRequest ) değeri true olan bir LoadedModuleRequest Kaydı (LoadedModuleRequest Record) record içeriyorsa, o zaman
Assert : record .[[Module]] ile result .[[Value]] aynı Modül Kaydı (Module Record) nesneleridir.
Aksi takdirde,
{ [[Specifier]] : moduleRequest .[[Specifier]] , [[Attributes]] : moduleRequest .[[Attributes]] , [[Module]] : result .[[Value]] } LoadedModuleRequest Kaydını (LoadedModuleRequest Record) referrer .[[LoadedModules]] listesine ekle.
If payload is a GraphLoadingState Record , then
Perform ContinueModuleLoading (payload , result ).
Else,
Perform ContinueDynamicImport (payload , result ).
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:
supported olsun HostGetSupportedImportAttributes ().
attrs 'taki her bir ImportAttribute Kaydı (ImportAttribute Record) attr için şunları yap:
supported , attr .[[Key]] öğesini içermiyorsa, return false.
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.
NOT
Tüm öznitelikleri barındırıcıya (host) aktarmak ve hangilerini işlemek istediğini seçmesine izin vermek yerine, barındırıcının desteklediği içe aktarım özniteliklerini belirtmesini gerektirme amacı, desteklenmeyen özniteliklerin farklı barındırıcılar (hosts) arasında tutarlı bir şekilde işlenmesini sağlamaktır.
# 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:
Assert : module bir Cyclic Module Kaydı (Cyclic Module Record) ise, o zaman module .[[Status]] değeri new veya unlinked değildir.
namespace , module .[[Namespace]] olsun.
namespace değeri empty ise, o zaman
exportedNames , module .GetExportedNames () olsun.
unambiguousNames , yeni ve boş bir Liste (List) olsun.
exportedNames 'in her bir name öğesi için şunları yap:
resolution , module .ResolveExport (name ) olsun.
resolution bir ResolvedBinding Kaydı (ResolvedBinding Record) ise, name değerini unambiguousNames 'e ekle.
namespace değerini ModuleNamespaceCreate (module , unambiguousNames ) olarak ayarla.
namespace değerini döndür.
NOT
GetModuleNamespace hiçbir zaman istisna fırlatmaz. Bunun yerine, çözümlenemeyen isimler bu noktada ad alanından (namespace) hariç tutulur. Başka bir yerde açıkça talep edilmeyen tümü belirsiz star export'lar olmadıkları sürece, bunlar daha sonra gerçek bir bağlama hatasına yol açacaktır.
# 16.2.1.14 Çalışma Zamanı Anlambilimi: Evaluation
Module Module : [empty]
undefined döndür.
ModuleBody ModuleBody : ModuleItemList
result , Completion (ModuleItemList 'in Evaluation (Değerlendirme) değeri) olsun.
result bir normal tamamlanma (normal completion) ise ve result .[[Value]] değeri empty ise, o zaman
undefined döndür.
Return ? result .
ModuleItemList ModuleItemList : ModuleItemList ModuleItem
sl , ? Evaluation of ModuleItemList olsun.
s , Completion (Evaluation of ModuleItem ) olsun.
Return ? UpdateEmpty (s , sl ).
NOT
Bir ModuleItemList 'in değeri, ModuleItemList içindeki son değer üreten öğenin değeridir.
ModuleItem ModuleItem : ImportDeclaration
empty döndür.
# 16.2.2 İçe Aktarımlar (Imports)
# Sözdizimi
ImportDeclaration ImportDeclaration : import ImportClause FromClause WithClause opt ; import ModuleSpecifier WithClause opt ;
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 }
# 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]
Yeni ve boş bir Liste (List) döndür.
ModuleItemList ModuleItemList : ModuleItemList ModuleItem
entries1 , ModuleItemList 'in ImportEntries değeri olsun.
entries2 , ModuleItem 'in ImportEntries değeri olsun.
entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.
ModuleItem ModuleItem : ExportDeclaration StatementListItem
Yeni ve boş bir Liste (List) döndür.
ImportDeclaration ImportDeclaration : import ImportClause FromClause WithClause opt ;
module , ImportDeclaration 'ın ModuleRequests değerinin tek öğesi olsun.
Argüman olarak module verilerek ImportClause 'un ImportEntriesForModule değerini döndür.
ImportDeclaration ImportDeclaration : import ModuleSpecifier WithClause opt ;
Yeni ve boş bir Liste (List) döndür.
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
entries1 , argüman olarak module verilerek ImportedDefaultBinding 'in ImportEntriesForModule değeri olsun.
entries2 , argüman olarak module verilerek NameSpaceImport 'in ImportEntriesForModule değeri olsun.
entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.
ImportClause ImportClause : ImportedDefaultBinding , NamedImports
entries1 , argüman olarak module verilerek ImportedDefaultBinding 'in ImportEntriesForModule değeri olsun.
entries2 , argüman olarak module verilerek NamedImports 'in ImportEntriesForModule değeri olsun.
entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.
ImportedDefaultBinding ImportedDefaultBinding : ImportedBinding
localName , ImportedBinding 'in BoundNames değerinin tek öğesi olsun.
defaultEntry , ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : "default", [[LocalName]] : localName } olsun.
« defaultEntry » döndür.
NameSpaceImport NameSpaceImport : ***** as ImportedBinding
localName , ImportedBinding 'in StringValue değeri olsun.
entry , ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : namespace, [[LocalName]] : localName } olsun.
« entry » döndür.
NamedImports NamedImports : { }
Yeni ve boş bir Liste (List) döndür.
ImportsList ImportsList : ImportsList , ImportSpecifier
specs1 , argüman olarak module verilerek ImportsList 'in ImportEntriesForModule değeri olsun.
specs2 , argüman olarak module verilerek ImportSpecifier 'in ImportEntriesForModule değeri olsun.
specs1 ve specs2 değerlerinin liste birleşimini (list-concatenation) döndür.
ImportSpecifier ImportSpecifier : ImportedBinding
localName , ImportedBinding 'in BoundNames değerinin tek öğesi olsun.
entry , ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : localName , [[LocalName]] : localName } olsun.
« entry » döndür.
ImportSpecifier ImportSpecifier : ModuleExportName as ImportedBinding
importName , ModuleExportName 'in StringValue değeri olsun.
localName , ImportedBinding 'in StringValue değeri olsun.
entry , ImportEntry Kaydı (ImportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : importName , [[LocalName]] : localName } olsun.
« 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 { }
Yeni ve boş bir Liste (List) döndür.
WithClause WithClause : with { WithEntries ,opt }
attrs , WithEntries 'in WithClauseToAttributes değeri olsun.
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.
attrs değerini döndür.
WithEntries WithEntries : AttributeKey : StringLiteral
key , AttributeKey 'in PropName değeri olsun.
entry , ImportAttribute Kaydı (ImportAttribute Record) { [[Key]] : key , [[Value]] : StringLiteral 'ın SV değeri } olsun.
« entry » döndür.
WithEntries WithEntries : AttributeKey : StringLiteral , WithEntries
key , AttributeKey 'in PropName değeri olsun.
entry , ImportAttribute Kaydı (ImportAttribute Record) { [[Key]] : key , [[Value]] : StringLiteral 'ın SV değeri } olsun.
rest , WithEntries 'in WithClauseToAttributes değeri olsun.
« 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 WithClause opt ; 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 ;
NOT
Yukarıdaki kural, NamedExports 'ın her bir ReferencedBindings değerinin bir IdentifierReference olarak ele alındığı anlamına gelir.
# 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.
NOT
ExportedBindings, bir Module 'ün ExportedNames değeriyle açıkça ilişkili olan yerel olarak bağlı isimlerdir.
Aşağıdaki üretimler üzerinden parça parça tanımlanır:
ModuleItemList ModuleItemList : ModuleItemList ModuleItem
names1 , ModuleItemList 'in ExportedBindings değeri olsun.
names2 , ModuleItem 'in ExportedBindings değeri olsun.
names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.
ModuleItem ModuleItem : ImportDeclaration StatementListItem
Yeni ve boş bir Liste (List) döndür.
ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClause opt ;
Yeni ve boş bir Liste (List) döndür.
ExportDeclaration ExportDeclaration : export NamedExports ;
NamedExports 'ın ExportedBindings değerini döndür.
ExportDeclaration ExportDeclaration : export VariableStatement
VariableStatement 'in BoundNames değerini döndür.
ExportDeclaration ExportDeclaration : export Declaration
Declaration 'in BoundNames değerini döndür.
ExportDeclaration ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
Bu ExportDeclaration 'ın BoundNames değerini döndür.
NamedExports NamedExports : { }
Yeni ve boş bir Liste (List) döndür.
ExportsList ExportsList : ExportsList , ExportSpecifier
names1 , ExportsList 'in ExportedBindings değeri olsun.
names2 , ExportSpecifier 'in ExportedBindings değeri olsun.
names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName
Tek öğesi ModuleExportName 'in StringValue değeri olan bir Liste (List) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName
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.
NOT
ExportedNames, bir Module 'ün kendi yerel isim bağlamalarından birine açıkça eşlediği, dışarıdan görülebilen isimlerdir.
Aşağıdaki üretimler üzerinden parça parça tanımlanır:
ModuleItemList ModuleItemList : ModuleItemList ModuleItem
names1 , ModuleItemList 'in ExportedNames değeri olsun.
names2 , ModuleItem 'in ExportedNames değeri olsun.
names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.
ModuleItem ModuleItem : ExportDeclaration
ExportDeclaration 'ın ExportedNames değerini döndür.
ModuleItem ModuleItem : ImportDeclaration StatementListItem
Yeni ve boş bir Liste (List) döndür.
ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClause opt ;
ExportFromClause 'un ExportedNames değerini döndür.
ExportFromClause ExportFromClause : *****
Yeni ve boş bir Liste (List) döndür.
ExportFromClause ExportFromClause : ***** as ModuleExportName
Tek öğesi ModuleExportName 'in StringValue değeri olan bir Liste (List) döndür.
ExportFromClause ExportFromClause : NamedExports
NamedExports 'ın ExportedNames değerini döndür.
ExportDeclaration ExportDeclaration : export VariableStatement
VariableStatement 'in BoundNames değerini döndür.
ExportDeclaration ExportDeclaration : export Declaration
Declaration 'in BoundNames değerini döndür.
ExportDeclaration ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
« "default" » döndür.
NamedExports NamedExports : { }
Yeni ve boş bir Liste (List) döndür.
ExportsList ExportsList : ExportsList , ExportSpecifier
names1 , ExportsList 'in ExportedNames değeri olsun.
names2 , ExportSpecifier 'in ExportedNames değeri olsun.
names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName
Tek öğesi ModuleExportName 'in StringValue değeri olan bir Liste (List) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName
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]
Yeni ve boş bir Liste (List) döndür.
ModuleItemList ModuleItemList : ModuleItemList ModuleItem
entries1 , ModuleItemList 'in ExportEntries değeri olsun.
entries2 , ModuleItem 'in ExportEntries değeri olsun.
entries1 ve entries2 değerlerinin liste birleşimini (list-concatenation) döndür.
ModuleItem ModuleItem : ImportDeclaration StatementListItem
Yeni ve boş bir Liste (List) döndür.
ExportDeclaration ExportDeclaration : export ExportFromClause FromClause WithClause opt ;
module , ExportDeclaration 'ın ModuleRequests değerinin tek öğesi olsun.
Argümanı module olan, ExportFromClause 'un ExportEntriesForModule değerini döndür.
ExportDeclaration ExportDeclaration : export NamedExports ;
Argümanı null olan, NamedExports 'ın ExportEntriesForModule değerini döndür.
ExportDeclaration ExportDeclaration : export VariableStatement
entries , yeni ve boş bir Liste (List) olsun.
names , VariableStatement 'in BoundNames değeri olsun.
names listesinin her bir name öğesi için sırayla şunları yap:
ExportEntry Kaydını (ExportEntry Record) { [[ModuleRequest]] : null, [[ImportName]] : null, [[LocalName]] : name , [[ExportName]] : name } entries listesine ekle.
entries değerini döndür.
ExportDeclaration ExportDeclaration : export Declaration
entries , yeni ve boş bir Liste (List) olsun.
names , Declaration 'ın BoundNames değeri olsun.
names listesinin her bir name öğesi için sırayla şunları yap:
ExportEntry Kaydını (ExportEntry Record) { [[ModuleRequest]] : null, [[ImportName]] : null, [[LocalName]] : name , [[ExportName]] : name } entries listesine ekle.
entries değerini döndür.
ExportDeclaration ExportDeclaration : export default HoistableDeclaration
names , HoistableDeclaration 'ın BoundNames değeri olsun.
localName , names listesinin tek öğesi olsun.
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
names , ClassDeclaration 'ın BoundNames değeri olsun.
localName , names listesinin tek öğesi olsun.
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 ;
entry , ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]] : null, [[ImportName]] : null, [[LocalName]] : "*default*", [[ExportName]] : "default" } olsun.
« entry » döndür.
NOT
"*default*" ifadesi, bu şartname içinde anonim varsayılan dışa aktarım (default export) değerleri için sentetik bir isim olarak kullanılır. Daha fazla ayrıntı için bu nota bakın.
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 : *****
entry , ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : all-but-default, [[LocalName]] : null, [[ExportName]] : null } olsun.
« entry » döndür.
ExportFromClause ExportFromClause : ***** as ModuleExportName
exportName , ModuleExportName 'in StringValue değeri olsun.
entry , ExportEntry Kaydı (ExportEntry Record) { [[ModuleRequest]] : module , [[ImportName]] : namespace, [[LocalName]] : null, [[ExportName]] : exportName } olsun.
« entry » döndür.
NamedExports NamedExports : { }
Yeni ve boş bir Liste (List) döndür.
ExportsList ExportsList : ExportsList , ExportSpecifier
specs1 , argümanı module olan, ExportsList 'in ExportEntriesForModule değeri olsun.
specs2 , argümanı module olan, ExportSpecifier 'in ExportEntriesForModule değeri olsun.
specs1 ve specs2 değerlerinin liste birleşimini (list-concatenation) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName
sourceName , ModuleExportName 'in StringValue değeri olsun.
Eğer module null ise, o halde
localName , sourceName olsun.
importName , null olsun.
Değilse,
localName , null olsun.
importName , sourceName olsun.
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
sourceName , ilk ModuleExportName 'in StringValue değeri olsun.
exportName , ikinci ModuleExportName 'in StringValue değeri olsun.
Eğer module null ise, o halde
localName , sourceName olsun.
importName , null olsun.
Değilse,
localName , null olsun.
importName , sourceName olsun.
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 : { }
Yeni ve boş bir Liste (List) döndür.
ExportsList ExportsList : ExportsList , ExportSpecifier
names1 , ExportsList 'in ReferencedBindings değeri olsun.
names2 , ExportSpecifier 'in ReferencedBindings değeri olsun.
names1 ve names2 değerlerinin liste birleşimini (list-concatenation) döndür.
ExportSpecifier ExportSpecifier : ModuleExportName as ModuleExportName
İlk ModuleExportName 'in ReferencedBindings değerini döndür.
ModuleExportName ModuleExportName : IdentifierName
Tek öğesi IdentifierName olan bir Liste (List) döndür.
ModuleExportName ModuleExportName : StringLiteral
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 WithClause opt ; export NamedExports ;
empty döndür.
ExportDeclaration ExportDeclaration : export VariableStatement
? VariableStatement 'in Evaluation değerini döndür.
ExportDeclaration ExportDeclaration : export Declaration
? Declaration 'in Evaluation değerini döndür.
ExportDeclaration ExportDeclaration : export default HoistableDeclaration
? HoistableDeclaration 'in Evaluation değerini döndür.
ExportDeclaration ExportDeclaration : export default ClassDeclaration
value , ? ClassDeclaration 'ın BindingClassDeclarationEvaluation değeri olsun.
className , ClassDeclaration 'ın BoundNames değerinin tek öğesi olsun.
Eğer className "*default*" ise, o halde
envRecord , yürütülmekte olan yürütme bağlamının (running execution context) LexicalEnvironment'ı olsun.
? InitializeBoundName ("*default*", value , envRecord ) işlemini gerçekleştir.
empty döndür.
ExportDeclaration ExportDeclaration : export default AssignmentExpression ;
Eğer IsAnonymousFunctionDefinition (AssignmentExpression ) değeri true ise, o halde
value , argümanı "default" olan, AssignmentExpression 'in ? NamedEvaluation değeri olsun.
Değilse,
rhs , AssignmentExpression 'in ? Evaluation değeri olsun.
value , ? GetValue (rhs ) olsun.
envRecord , yürütülmekte olan yürütme bağlamının (running execution context) LexicalEnvironment'ı olsun.
? InitializeBoundName ("*default*", value , envRecord ) işlemini gerçekleştir.
empty döndür.
← önceki 15 ECMAScript Dili: İşlevler ve Sınıflar
sonraki → 17 Hata Yönetimi ve Dil Genişletmeleri