Hata Yönetimi ve Dil Genişletmeleri
Bir gerçekleştirim (implementation), hataların çoğunu ilgili ECMAScript dil yapısı değerlendirildiği sırada rapor etmelidir. Erken hata (early error), hatayı içeren Script içindeki herhangi bir yapının değerlendirilmesinden önce tespit edilebilen ve rapor edilebilen bir hatadır. Bir erken hatanın varlığı, söz konusu yapının değerlendirilmesini engeller. Bir gerçekleştirim, bir Script içindeki erken hataları, o Script'in ParseScript içindeki ayrıştırılmasının bir parçası olarak rapor etmelidir. Bir Module içindeki erken hatalar, Module'ün değerlendirileceği noktada rapor edilir ve Module asla başlatılmaz (initialized). eval kodu içindeki erken hatalar, eval çağrıldığı sırada rapor edilir ve eval kodunun değerlendirilmesini engeller. Erken hata olmayan tüm hatalar çalışma zamanı (runtime) hatalarıdır.
Bir gerçekleştirim, bu şartnamenin bir “Statik Anlambilim: Erken Hatalar (Static Semantics: Early Errors)” alt maddesinde listelenen herhangi bir durumun gerçekleşmesini bir erken hata olarak rapor etmelidir.
Derleyici (compiler), bir yapının hiçbir koşulda hatasız çalışamayacağını kanıtlayabilse bile, bir gerçekleştirim diğer hata türlerini erken hatalar olarak ele almamalıdır. Bir gerçekleştirim böyle bir durumda erken bir uyarı (early warning) verebilir, ancak ilgili yapı gerçekten yürütülene kadar hatayı rapor etmemelidir.
Aşağıdakiler hariç olmak üzere, bir gerçekleştirim tüm hataları belirtildiği şekilde rapor etmelidir:
17.1 içinde kısıtlanan durumlar hariç olmak üzere, bir barındırıcı (host) veya gerçekleştirim; Script sözdizimini, Module sözdizimini ve düzenli ifade (regular expression) kalıbı veya bayrak sözdizimini genişletebilir. Buna izin vermek için,
SyntaxErrorfırlatmasına izin verilen tüm işlemler (örneğinevalçağırmak, bir düzenli ifade sabit değeri (literal) kullanmak veya Function ya da RegExp yapıcısını (constructor) kullanmak gibi), betik sözdizimine veya düzenli ifade kalıbına ya da bayrak sözdizimine yönelik barındırıcı tarafından tanımlanmış (host-defined) bir genişletmeyle karşılaştıklarındaSyntaxErrorfırlatmak yerine barındırıcı tarafından tanımlanmış (host-defined) davranış sergileyebilir.17.1 içinde kısıtlanan durumlar hariç olmak üzere, bir barındırıcı (host) veya gerçekleştirim, bu şartnamede açıklananların ötesinde ek türler, değerler, nesneler, özellikler ve işlevler sağlayabilir. Bu durum, bazı yapıların (global kapsamda bir değişken araması yapmak gibi) bir hata fırlatmak (örneğin
ReferenceError) yerine barındırıcı tarafından tanımlanmış (host-defined) bir davranışa sahip olmasına neden olabilir.
17.1 Yasaklanmış Genişletmeler (Forbidden Extensions)
Bir gerçekleştirim bu şartnameyi aşağıdaki şekillerde genişletmemelidir:
Katı mod kodundaki (strict mode code) sözdizimsel yapıcılar (constructors) kullanılarak tanımlanan ECMAScript işlev nesneleri (function objects),
"caller"veya"arguments"adında kendi özelliklerine (own properties) sahip olacak şekilde oluşturulmamalıdır. Tanımın katı mod kodunda (strict mode code) yer alıp almadığına bakılmaksızın; bir ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration, AsyncFunctionExpression veya AsyncArrowFunction kullanılarak tanımlanan işlev nesneleri (function objects) için de bu tür kendi özellikleri oluşturulmamalıdır. Yerleşik işlevler (built-in functions), Function yapıcısı (constructor) kullanılarak oluşturulan katı işlevler (strict functions), Generator yapıcısı (constructor) kullanılarak oluşturulan üreteç (generator) işlevleri, AsyncFunction yapıcısı (constructor) kullanılarak oluşturulan async işlevler vebindyöntemi kullanılarak oluşturulan işlevler de bu tür kendi özellikleriyle oluşturulmamalıdır.Eğer bir gerçekleştirim herhangi bir işlev nesnesini (function object)
"caller"adında kendi özellik (own property) ile genişletirse, bu özelliğin [[Get]] veya [[GetOwnProperty]] kullanılarak gözlemlenen değeri bir katı işlev (strict function) nesnesi olmamalıdır. Eğer bu bir erişici özellik (accessor property) ise, özelliğin [[Get]] özniteliğinin (attribute) değeri olan işlev çağrıldığında asla bir katı işlev (strict function) döndürmemelidir.Ne eşlenmiş (mapped) ne de eşlenmemiş (unmapped) arguments nesneleri
"caller"adında kendi bir özellik (own property) ile oluşturulamaz.ECMA-402'de belirtilen yerleşik yöntemlerin (built-in methods) davranışı (örneğin
toLocaleStringadındakiler), ECMA-402'de belirtilenler dışında genişletilmemelidir.22.2.1 ve B.1.2 içindeki RegExp kalıp dilbilgileri (RegExp pattern grammars), [UnicodeMode] dilbilgisi parametresi mevcut olduğunda A-Z veya a-z kaynak karakterlerinden herhangi birini IdentityEscape[+UnicodeMode] olarak tanıyacak şekilde genişletilmemelidir.
Sözdizimsel Dilbilgisi (Syntactic Grammar),
:belirtecinin (token), BindingIdentifier uç birim olmayan (nonterminal) sembolüyle eşleşen kaynak metni hemen takip etmesine izin verecek şekilde hiçbir şekilde genişletilmemelidir.Katı mod kodu (strict mode code) işlenirken, bir gerçekleştirim 12.9.3.1 içindeki erken hata (early error) kurallarını gevşetmemelidir.
TemplateEscapeSequence, 12.9.4 içinde tanımlandığı şekliyle LegacyOctalEscapeSequence veya NonOctalDecimalEscapeSequence'i içerecek şekilde genişletilmemelidir.
Katı mod kodu (strict mode code) işlenirken, B.3.1, B.3.2, B.3.3 ve B.3.5 içinde tanımlanan genişletmeler desteklenmemelidir.
Module hedef sembolü (goal symbol) için ayrıştırma yapılırken, B.1.1 içinde tanımlanan sözlüksel dilbilgisi (lexical grammar) genişletmeleri desteklenmemelidir.
ImportCall genişletilmemelidir.