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

Yürütülebilir Kod ve Yürütme Bağlamları

9.1 Ortam Kayıtları

Ortam Kaydı, Identifier'ların belirli değişkenler ve işlevlerle ilişkilendirilmesini, ECMAScript kodunun sözcüksel yuvalanma yapısına dayalı olarak tanımlamak için kullanılan bir belirtim türüdür. Genellikle bir Ortam Kaydı, bir FunctionDeclaration, bir BlockStatement veya bir TryStatement'ın Catch maddesi gibi ECMAScript kodunun bazı belirli sözdizimsel yapılarıyla ilişkilendirilir. Bu tür bir kod her değerlendirildiğinde, o kod tarafından oluşturulan tanımlayıcı bağlamalarını kaydetmek için yeni bir Ortam Kaydı oluşturulur.

Her Ortam Kaydı, null veya bir dış Ortam Kaydı'na başvuru olan bir [[OuterEnv]] alanına sahiptir. Bu, Ortam Kaydı değerlerinin mantıksal yuvalanmasını modellemek için kullanılır. Bir (iç) Ortam Kaydı'nın dış başvurusu, iç Ortam Kaydı'nı mantıksal olarak çevreleyen Ortam Kaydı'na bir başvurudur. Bir dış Ortam Kaydı elbette kendi dış Ortam Kaydı'na sahip olabilir. Bir Ortam Kaydı, birden çok iç Ortam Kaydı için dış ortam olarak hizmet edebilir. Örneğin, bir FunctionDeclaration iç içe iki FunctionDeclaration içeriyorsa, iç içe işlevlerin her birinin Ortam Kayıtları, dış Ortam Kaydı olarak çevreleyen işlevin geçerli değerlendirmesinin Ortam Kaydı'na sahip olacaktır.

Ortam Kayıtları tamamen belirtim mekanizmalarıdır ve bir ECMAScript gerçekleştiriminin herhangi bir belirli yapıtına karşılık gelmek zorunda değildir. Bir ECMAScript programının bu tür değerlere doğrudan erişmesi veya onları işlemesi olanaksızdır.

9.1.1 Ortam Kaydı Tür Hiyerarşisi

Ortam Kayıtları, Ortam Kaydı'nın üç somut alt sınıfa sahip soyut bir sınıf olduğu basit bir nesne yönelimli hiyerarşide mevcut olarak düşünülebilir: Bildirimsel Ortam Kaydı, Nesne Ortam Kaydı ve Küresel Ortam Kaydı. İşlev Ortam Kayıtları ve Modül Ortam Kayıtları, Bildirimsel Ortam Kaydı'nın alt sınıflarıdır.

  • Ortam Kaydı (soyut)

    • Bir Bildirimsel Ortam Kaydı, FunctionDeclaration'lar, VariableDeclaration'lar ve tanımlayıcı bağlamalarını doğrudan ECMAScript dil değerleriyle ilişkilendiren Catch maddeleri gibi ECMAScript dil sözdizimsel öğelerinin etkisini tanımlamak için kullanılır.

      - Bir *[İşlev Ortam Kaydı](#sec-function-environment-records)*, bir ECMAScript [işlev nesnesinin](07_sec-ecmascript-data-types-and-values.md#function-object) çağrılmasına karşılık gelir ve bu işlev içindeki en üst düzey bildirimler için bağlamaları içerir. Yeni bir `this` bağlaması oluşturabilir. Ayrıca `super` yöntem çağrılarını desteklemek için gerekli durumu yakalar.
      
      - Bir *[Modül Ortam Kaydı](#sec-module-environment-records)*, bir *[Module](17_sec-ecmascript-language-scripts-and-modules.md#prod-Module)*'ün en üst düzey bildirimleri için bağlamaları içerir. Aynı zamanda *[Module](17_sec-ecmascript-language-scripts-and-modules.md#prod-Module)* tarafından açıkça içe aktarılan bağlamaları da içerir. *[[OuterEnv]]*'i bir [Küresel Ortam Kaydı](#sec-global-environment-records)'dır.
    • Bir Nesne Ortam Kaydı, tanımlayıcı bağlamalarını bir nesnenin özellikleriyle ilişkilendiren WithStatement gibi ECMAScript öğelerinin etkisini tanımlamak için kullanılır.

    • Bir Küresel Ortam Kaydı, Script küresel bildirimleri için kullanılır. Bir dış ortamı yoktur; [[OuterEnv]]'i null'dır. Tanımlayıcı bağlamalarıyla önceden doldurulabilir ve özellikleri küresel ortamın tanımlayıcı bağlamalarından bazılarını sağlayan ilişkili bir küresel nesne içerir. ECMAScript kodu yürütüldükçe, küresel nesneye ek özellikler eklenebilir ve başlangıç özellikleri değiştirilebilir.

Ortam Kaydı soyut sınıfı, Tablo 14'te tanımlanan soyut belirtim yöntemlerini içerir. Bu soyut yöntemler, somut alt sınıfların her biri için farklı somut algoritmalara sahiptir.

Tablo 14: Ortam Kayıtlarının Soyut Yöntemleri

Yöntem Amacı Tanımlar
HasBinding ( name ) Soyut yöntem HasBinding, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı'nın name için bir bağlamaya sahip olup olmadığını belirler. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.1 Bildirimsel Ortam Kaydı - 9.1.1.2.1 Nesne Ortam Kaydı - 9.1.1.4.1 Küresel Ortam Kaydı
CreateMutableBinding ( name, deletable ) Soyut yöntem CreateMutableBinding, name (bir String) ve deletable (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı içinde yeni ancak ilklendirilmemiş bir değişebilir bağlama oluşturur. name, bağlı adın metnidir. deletable true ise, bağlama daha sonra silinebilir. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.2 Bildirimsel Ortam Kaydı - 9.1.1.2.2 Nesne Ortam Kaydı - 9.1.1.4.2 Küresel Ortam Kaydı
CreateImmutableBinding ( name, strict ) Soyut yöntem CreateImmutableBinding, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı içinde yeni ancak ilklendirilmemiş bir değişmez bağlama oluşturur. name, bağlı adın metnidir. strict true ise, ilklendirildikten sonra onu ayarlama girişimleri, o bağlamaya atıfta bulunan işlemlerin katı kip ayarından bağımsız olarak her zaman bir kuraldışı durum fırlatacaktır. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.3 Bildirimsel Ortam Kaydı - 9.1.1.4.3 Küresel Ortam Kaydı
InitializeBinding ( name, value ) Soyut yöntem InitializeBinding, name (bir String) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı içinde zaten mevcut ancak ilklendirilmemiş bir bağlamanın değerini ayarlar. name, bağlı adın metnidir. value, bağlama için değerdir. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.4 Bildirimsel Ortam Kaydı - 9.1.1.2.4 Nesne Ortam Kaydı - 9.1.1.4.4 Küresel Ortam Kaydı
SetMutableBinding ( name, value, strict ) Soyut yöntem SetMutableBinding, name (bir String), value (bir ECMAScript dil değeri) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı içinde zaten mevcut olan değişebilir bir bağlamanın değerini ayarlar. name, bağlı adın metnidir. value, bağlama için değerdir. strict true ise ve bağlama ayarlanamazsa, bu bir TypeError kuraldışı durumu fırlatır. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.5 Bildirimsel Ortam Kaydı - 9.1.1.2.5 Nesne Ortam Kaydı - 9.1.1.4.5 Küresel Ortam Kaydı
GetBindingValue ( name, strict ) Soyut yöntem GetBindingValue, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı'ndan zaten mevcut olan bir bağlamanın değerini döndürür. name, bağlı adın metnidir. strict, katı kip kodunda ortaya çıkan veya aksi takdirde katı kip başvuru anlambilimi gerektiren başvuruları tanımlamak için kullanılır. strict true ise ve bağlama mevcut değilse, bu bir ReferenceError kuraldışı durumu fırlatır. Bağlama mevcut ancak ilklendirilmemişse, strict değerine bakılmaksızın bir ReferenceError fırlatılır. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.6 Bildirimsel Ortam Kaydı - 9.1.1.2.6 Nesne Ortam Kaydı - 9.1.1.4.6 Küresel Ortam Kaydı - 9.1.1.5.1 Modül Ortam Kaydı
DeleteBinding ( name ) Soyut yöntem DeleteBinding, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı'ndan bir bağlamayı siler. name, bağlı adın metnidir. name için bir bağlama mevcutsa, bu bağlamayı kaldırır ve true döndürür. Bağlama mevcut ancak kaldırılamıyorsa, false döndürür. Bağlama mevcut değilse, true döndürür. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.7 Bildirimsel Ortam Kaydı - 9.1.1.2.7 Nesne Ortam Kaydı - 9.1.1.4.7 Küresel Ortam Kaydı
HasThisBinding ( ) Soyut yöntem HasThisBinding hiçbir argüman almaz ve bir Boolean döndürür. Bir Ortam Kaydı'nın bir this bağlaması oluşturup oluşturmadığını belirler. Oluşturuyorsa true, oluşturmuyorsa false döndürür. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.8 Bildirimsel Ortam Kaydı - 9.1.1.2.8 Nesne Ortam Kaydı - 9.1.1.3.2 İşlev Ortam Kaydı - 9.1.1.4.8 Küresel Ortam Kaydı - 9.1.1.5.3 Modül Ortam Kaydı
GetThisBinding ( ) Soyut yöntem GetThisBinding hiçbir argüman almaz ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bu Ortam Kaydı'nın this bağlamasının değerini döndürür. this bağlaması ilklendirilmemişse bir ReferenceError fırlatır. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.3.3 İşlev Ortam Kaydı - 9.1.1.4.9 Küresel Ortam Kaydı - 9.1.1.5.4 Modül Ortam Kaydı
HasSuperBinding ( ) Soyut yöntem HasSuperBinding hiçbir argüman almaz ve bir Boolean döndürür. Bir Ortam Kaydı'nın bir super yöntem bağlaması oluşturup oluşturmadığını belirler. Oluşturuyorsa true, oluşturmuyorsa false döndürür. true döndürmesi, ters çıkarım geçerli olmasa da, Ortam Kaydı'nın bir İşlev Ortam Kaydı olduğunu ima eder. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.10 Bildirimsel Ortam Kaydı - 9.1.1.2.10 Nesne Ortam Kaydı - 9.1.1.3.4 İşlev Ortam Kaydı - 9.1.1.4.10 Küresel Ortam Kaydı
WithBaseObject ( ) Soyut yöntem WithBaseObject hiçbir argüman almaz ve bir Object veya undefined döndürür. Bu Ortam Kaydı bir with deyimi ile ilişkilendirilmişse, with nesnesini döndürür. Aksi takdirde undefined döndürür. Aşağıdaki türlerde somut tanımları vardır: - 9.1.1.1.11 Bildirimsel Ortam Kaydı - 9.1.1.2.11 Nesne Ortam Kaydı - 9.1.1.4.11 Küresel Ortam Kaydı

9.1.1.1 Bildirimsel Ortam Kayıtları

Her Bildirimsel Ortam Kaydı, değişken, sabit, let, sınıf, modül, içe aktarma ve/veya işlev bildirimleri içeren bir ECMAScript program kapsamıyla ilişkilendirilir. Bir Bildirimsel Ortam Kaydı, kapsamı içinde bulunan bildirimlerle tanımlanan tanımlayıcı kümesini bağlar.

9.1.1.1.1 HasBinding ( name )

Bir Bildirimsel Ortam Kaydı envRecord'un HasBinding somut yöntemi, name (bir String) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Argüman tanımlayıcısının, kayıt tarafından bağlanan tanımlayıcılardan biri olup olmadığını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord, name için bir bağlamaya sahipse, true döndür.

  2. false döndür.

9.1.1.1.2 CreateMutableBinding ( name, deletable )

Bir Bildirimsel Ortam Kaydı envRecord'un CreateMutableBinding somut yöntemi, name (bir String) ve deletable (bir Boolean) argümanlarını alır ve unused içeren normal tamamlanma döndürür. name adı için ilklendirilmemiş yeni bir değişebilir bağlama oluşturur. Bu Ortam Kaydı içinde name için zaten bir bağlama bulunmamalıdır. deletable true ise, yeni bağlama silinmeye tabi olarak işaretlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için zaten bir bağlamaya sahip değildir.

  2. envRecord içinde name için değişebilir bir bağlama oluştur ve ilklendirilmemiş olduğunu kaydet. deletable true ise, yeni oluşturulan bağlamanın sonraki bir DeleteBinding çağrısıyla silinebileceğini kaydet.

  3. unused döndür.

9.1.1.1.3 CreateImmutableBinding ( name, strict )

Bir Bildirimsel Ortam Kaydı envRecord'un CreateImmutableBinding somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve unused içeren normal tamamlanma döndürür. name adı için ilklendirilmemiş yeni bir değişmez bağlama oluşturur. Bu Ortam Kaydı içinde name için zaten bir bağlama bulunmamalıdır. strict true ise, yeni bağlama katı bağlama olarak işaretlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için zaten bir bağlamaya sahip değildir.

  2. envRecord içinde name için değişmez bir bağlama oluştur ve ilklendirilmemiş olduğunu kaydet. strict true ise, yeni oluşturulan bağlamanın katı bir bağlama olduğunu kaydet.

  3. unused döndür.

9.1.1.1.4 InitializeBinding ( name, value )

Bir Bildirimsel Ortam Kaydı envRecord'un InitializeBinding somut yöntemi, name (bir String) ve value (bir ECMAScript dil değeri) argümanlarını alır ve unused içeren normal tamamlanma döndürür. Adı name olan tanımlayıcının mevcut bağlamasının bağlı değerini value değerine ayarlamak için kullanılır. name için ilklendirilmemiş bir bağlama zaten mevcut olmalıdır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için ilklendirilmemiş bir bağlamaya sahip olmalıdır.

  2. envRecord içindeki name için bağlı değeri value olarak ayarla.

  3. envRecord içindeki name bağlamasının ilklendirildiğini kaydet.

  4. unused döndür.

9.1.1.1.5 SetMutableBinding ( name, value, strict )

Bir Bildirimsel Ortam Kaydı envRecord'un SetMutableBinding somut yöntemi, name (bir String), value (bir ECMAScript dil değeri) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan tanımlayıcının mevcut bağlamasının bağlı değerini value değerine değiştirmeye çalışır. name için bir bağlama normalde zaten mevcuttur, ancak nadir durumlarda mevcut olmayabilir. Bağlama değişmez bir bağlamaysa, strict true ise bir TypeError fırlatılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord, name için bir bağlamaya sahip değilse, o zaman

    1. Eğer strict true ise, bir ReferenceError kuraldışı durumu fırlat.

    2. ! envRecord.CreateMutableBinding(name, true) işlemini gerçekleştir.

    3. ! envRecord.InitializeBinding(name, value) işlemini gerçekleştir.

    4. unused döndür.

  2. Eğer envRecord içindeki name bağlaması katı bir bağlamaysa, strict'i true olarak ayarla.

  3. Eğer envRecord içindeki name bağlaması henüz ilklendirilmemişse, o zaman

    1. Bir ReferenceError kuraldışı durumu fırlat.
  4. Değilse, eğer envRecord içindeki name bağlaması değişebilir bir bağlamaysa, o zaman

    1. Bağlı değerini value olarak değiştir.
  5. Değilse,

    1. Assert: Bu, değişmez bir bağlamanın değerini değiştirme girişimidir.

    2. Eğer strict true ise, bir TypeError kuraldışı durumu fırlat.

  6. unused döndür.

9.1.1.1.6 GetBindingValue ( name, strict )

Bir Bildirimsel Ortam Kaydı envRecord'un GetBindingValue somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan bağlı tanımlayıcısının değerini döndürür. Bağlama mevcut ancak ilklendirilmemişse, strict değerine bakılmaksızın bir ReferenceError fırlatılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için bir bağlamaya sahiptir.

  2. Eğer envRecord içindeki name bağlaması ilklendirilmemiş bir bağlamaysa, bir ReferenceError kuraldışı durumu fırlat.

  3. envRecord içinde şu anda name'e bağlı olan değeri döndür.

9.1.1.1.7 DeleteBinding ( name )

Bir Bildirimsel Ortam Kaydı envRecord'un DeleteBinding somut yöntemi, name (bir String) argümanını alır ve bir Boolean içeren normal tamamlanma döndürür. Yalnızca açıkça silinmeye tabi olarak belirlenmiş bağlamaları silebilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için bir bağlamaya sahiptir.

  2. Eğer envRecord içindeki name bağlaması silinemiyorsa, false döndür.

  3. envRecord'dan name bağlamasını kaldır.

  4. true döndür.

9.1.1.1.8 HasThisBinding ( )

Bir Bildirimsel Ortam Kaydı envRecord'un HasThisBinding somut yöntemi hiçbir argüman almaz ve false döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.
9.1.1.1.9 GetThisBinding ( )

Bir Bildirimsel Ortam Kaydı'nın GetThisBinding somut yöntemi bu belirtim içerisinde hiçbir zaman kullanılmaz.

9.1.1.1.10 HasSuperBinding ( )

Bir Bildirimsel Ortam Kaydı envRecord'un HasSuperBinding somut yöntemi hiçbir argüman almaz ve false döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.
9.1.1.1.11 WithBaseObject ( )

Bir Bildirimsel Ortam Kaydı envRecord'un WithBaseObject somut yöntemi hiçbir argüman almaz ve undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. undefined döndür.

9.1.1.2 Nesne Ortam Kayıtları

Her Nesne Ortam Kaydı, bağlama nesnesi olarak adlandırılan bir nesne ile ilişkilendirilir. Bir Nesne Ortam Kaydı, bağlama nesnesinin özellik adlarına doğrudan karşılık gelen dize tanımlayıcı adları kümesini bağlar. Bir IdentifierName biçiminde dize olmayan özellik anahtarları, bağlı tanımlayıcılar kümesine dahil edilmez. [[Enumerable]] niteliklerinin ayarına bakılmaksızın hem kendi özellikleri hem de kalıtılan özellikler kümeye dahil edilir. Nesnelere dinamik olarak özellik eklenip çıkarılabildiğinden, bir Nesne Ortam Kaydı tarafından bağlanan tanımlayıcılar kümesi, özellik ekleyen veya silen herhangi bir işlemin yan etkisi olarak potansiyel olarak değişebilir. Böyle bir yan etkinin sonucu olarak oluşturulan herhangi bir bağlama, karşılık gelen özelliğin Writable niteliği false olsa bile değişebilir bir bağlama olarak kabul edilir. Nesne Ortam Kayıtları için değişmez bağlamalar mevcut değildir.

with deyimleri (14.11) için oluşturulan Nesne Ortam Kayıtları, işlev çağrılarında kullanılmak üzere bağlama nesnelerini örtük bir this değeri olarak sağlayabilir. Bu yetenek, bir Boolean [[IsWithEnvironment]] alanı tarafından denetlenir.

Nesne Ortam Kayıtları, Tablo 15'te listelenen ek durum alanlarına sahiptir.

Tablo 15: Nesne Ortam Kayıtlarının Ek Alanları

Alan Adı Değer Anlamı
[[BindingObject]] bir Object Bu Ortam Kaydı'nın bağlama nesnesi.
[[IsWithEnvironment]] bir Boolean Bu Ortam Kaydı'nın bir with deyimi için oluşturulup oluşturulmadığını belirtir.
9.1.1.2.1 HasBinding ( name )

Bir Nesne Ortam Kaydı envRecord'un HasBinding somut yöntemi, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. İlişkili bağlama nesnesinin adı name olan bir özelliğe sahip olup olmadığını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. bindingObj = envRecord.[[BindingObject]] olsun.

  2. foundBinding = ? HasProperty(bindingObj, name) olsun.

  3. Eğer foundBinding false ise, false döndür.

  4. Eğer envRecord.[[IsWithEnvironment]] false ise, true döndür.

  5. unscopables = ? Get(bindingObj, %Symbol.unscopables%) olsun.

  6. Eğer unscopables bir Object ise, o zaman

    1. blocked = ToBoolean(? Get(unscopables, name)) olsun.

    2. Eğer blocked true ise, false döndür.

  7. true döndür.

9.1.1.2.2 CreateMutableBinding ( name, deletable )

Bir Nesne Ortam Kaydı envRecord'un CreateMutableBinding somut yöntemi, name (bir String) ve deletable (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Bir Ortam Kaydı'nın ilişkili bağlama nesnesinde adı name olan bir özellik oluşturur ve onu undefined değerine ilklendirir. deletable true ise, yeni özelliğin [[Configurable]] niteliği true olarak ayarlanır; aksi takdirde false olarak ayarlanır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. bindingObj = envRecord.[[BindingObject]] olsun.

  2. ? DefinePropertyOrThrow(bindingObj, name, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable }) işlemini gerçekleştir.

  3. unused döndür.

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Bir Nesne Ortam Kaydı'nın CreateImmutableBinding somut yöntemi bu belirtim içerisinde hiçbir zaman kullanılmaz.

9.1.1.2.4 InitializeBinding ( name, value )

Bir Nesne Ortam Kaydı envRecord'un InitializeBinding somut yöntemi, name (bir String) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan tanımlayıcının mevcut bağlamasının bağlı değerini value değerine ayarlamak için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. ? envRecord.SetMutableBinding(name, value, false) işlemini gerçekleştir.

  2. unused döndür.

9.1.1.2.5 SetMutableBinding ( name, value, strict )

Bir Nesne Ortam Kaydı envRecord'un SetMutableBinding somut yöntemi, name (bir String), value (bir ECMAScript dil değeri) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Ortam Kaydı'nın ilişkili bağlama nesnesinin adı name olan özelliğinin değerini value değerine ayarlamaya çalışır. name adında bir özellik normalde zaten mevcuttur, ancak mevcut değilse veya şu anda yazılabilir değilse, hata yönetimi strict tarafından belirlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. bindingObj = envRecord.[[BindingObject]] olsun.

  2. stillExists = ? HasProperty(bindingObj, name) olsun.

  3. Eğer stillExists false ise ve strict true ise, bir ReferenceError kuraldışı durumu fırlat.

  4. ? Set(bindingObj, name, value, strict) işlemini gerçekleştir.

  5. unused döndür.

9.1.1.2.6 GetBindingValue ( name, strict )

Bir Nesne Ortam Kaydı envRecord'un GetBindingValue somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. İlişkili bağlama nesnesinin adı name olan özelliğinin değerini döndürür. Özellik zaten mevcut olmalıdır, ancak mevcut değilse sonuç strict'e bağlıdır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. bindingObj = envRecord.[[BindingObject]] olsun.

  2. value = ? HasProperty(bindingObj, name) olsun.

  3. Eğer value false ise, o zaman

    1. Eğer strict false ise, undefined döndür.

    2. Bir ReferenceError kuraldışı durumu fırlat.

  4. ? Get(bindingObj, name) döndür.

9.1.1.2.7 DeleteBinding ( name )

Bir Nesne Ortam Kaydı envRecord'un DeleteBinding somut yöntemi, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Yalnızca, [[Configurable]] niteliği true değerine sahip olan ortam nesnesinin özelliklerine karşılık gelen bağlamaları silebilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. bindingObj = envRecord.[[BindingObject]] olsun.

  2. ? bindingObj.[[Delete]](name) döndür.

9.1.1.2.8 HasThisBinding ( )

Bir Nesne Ortam Kaydı envRecord'un HasThisBinding somut yöntemi hiçbir argüman almaz ve false döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.
9.1.1.2.9 GetThisBinding ( )

Bir Nesne Ortam Kaydı'nın GetThisBinding somut yöntemi bu belirtim içerisinde hiçbir zaman kullanılmaz.

9.1.1.2.10 HasSuperBinding ( )

Bir Nesne Ortam Kaydı envRecord'un HasSuperBinding somut yöntemi hiçbir argüman almaz ve false döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.
9.1.1.2.11 WithBaseObject ( )

Bir Nesne Ortam Kaydı envRecord'un WithBaseObject somut yöntemi hiçbir argüman almaz ve bir Object veya undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord.[[IsWithEnvironment]] true ise, envRecord.[[BindingObject]] döndür.

  2. undefined döndür.

9.1.1.3 İşlev Ortam Kayıtları

Bir İşlev Ortam Kaydı, bir işlevin en üst düzey kapsamını temsil etmek için kullanılan ve işlev bir ArrowFunction veya AsyncArrowFunction değilse bir this bağlaması sağlayan bir Bildirimsel Ortam Kaydı'dır. Bir işlev bir ArrowFunction veya AsyncArrowFunction değilse ve super'a başvuruyorsa, İşlev Ortam Kaydı aynı zamanda işlev içinden super yöntem çağrılarını gerçekleştirmek için kullanılan durumu da içerir.

İşlev Ortam Kayıtları, Tablo 16'da listelenen ek durum alanlarına sahiptir.

Tablo 16: İşlev Ortam Kayıtlarının Ek Alanları

Alan Adı Değer Anlamı
[[ThisValue]] bir ECMAScript dil değeri Bu, işlevin bu çağrılışı için kullanılan this değeridir.
[[ThisBindingStatus]] lexical, initialized veya uninitialized Değer lexical ise, bu bir ArrowFunction veya AsyncArrowFunction'dur ve yerel bir this değerine sahip değildir.
[[FunctionObject]] bir ECMAScript işlev nesnesi Çağrılması bu Ortam Kaydı'nın oluşturulmasına neden olan işlev nesnesi.
[[NewTarget]] bir oluşturucu veya undefined Bu Ortam Kaydı [[Construct]] iç yöntemi tarafından oluşturulmuşsa, [[NewTarget]], [[Construct]] newTarget parametresinin değeridir. Aksi takdirde değeri undefined'dır.

İşlev Ortam Kayıtları, Tablo 14'te listelenen Bildirimsel Ortam Kaydı yöntemlerinin tümünü destekler ve HasThisBinding, GetThisBinding ve HasSuperBinding dışındaki tüm bu yöntemler için aynı belirtimleri paylaşır.

9.1.1.3.1 BindThisValue ( envRecord, value )

Soyut işlem BindThisValue, envRecord (bir İşlev Ortam Kaydı) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. envRecord.[[ThisValue]]'ı ayarlar ve ilklendirildiğini kaydeder. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord.[[ThisBindingStatus]] lexical değildir.

  2. Eğer envRecord.[[ThisBindingStatus]] initialized ise, bir ReferenceError kuraldışı durumu fırlat.

  3. envRecord.[[ThisValue]]value olarak ayarla.

  4. envRecord.[[ThisBindingStatus]]initialized olarak ayarla.

  5. unused döndür.

9.1.1.3.2 HasThisBinding ( )

Bir İşlev Ortam Kaydı envRecord'un HasThisBinding somut yöntemi hiçbir argüman almaz ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord.[[ThisBindingStatus]] lexical ise, false döndür.

  2. true döndür.

9.1.1.3.3 GetThisBinding ( )

Bir İşlev Ortam Kaydı envRecord'un GetThisBinding somut yöntemi hiçbir argüman almaz ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord.[[ThisBindingStatus]] lexical değildir.

  2. Eğer envRecord.[[ThisBindingStatus]] uninitialized ise, bir ReferenceError kuraldışı durumu fırlat.

  3. envRecord.[[ThisValue]] döndür.

9.1.1.3.4 HasSuperBinding ( )

Bir İşlev Ortam Kaydı envRecord'un HasSuperBinding somut yöntemi hiçbir argüman almaz ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord.[[ThisBindingStatus]] lexical ise, false döndür.

  2. Eğer envRecord.[[FunctionObject]].[[HomeObject]] undefined ise, false döndür.

  3. true döndür.

9.1.1.3.5 GetSuperBase ( envRecord )

Soyut işlem GetSuperBase, envRecord (bir İşlev Ortam Kaydı) argümanını alır ve bir Object, null veya undefined döndürür. envRecord içinde bağlı olan super özellik erişimleri için taban olan nesneyi döndürür. undefined değeri, bu tür erişimlerin çalışma zamanı hataları üreteceğini belirtir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. home = envRecord.[[FunctionObject]].[[HomeObject]] olsun.

  2. Eğer home undefined ise, undefined döndür.

  3. Assert: home bir sıradan nesnedir.

  4. ! home.[[GetPrototypeOf]]() döndür.

9.1.1.4 Küresel Ortam Kayıtları

Bir Küresel Ortam Kaydı, ortak bir gerçeklik alanında işlenen tüm ECMAScript Script öğeleri tarafından paylaşılan en dış kapsamı temsil etmek için kullanılır. Bir Küresel Ortam Kaydı, yerleşik küreseller (madde 19), küresel nesnenin özellikleri ve bir Script içinde yer alan tüm en üst düzey bildirimler (8.2.9, 8.2.11) için bağlamaları sağlar.

Bir Küresel Ortam Kaydı mantıksal olarak tek bir kayıttır, ancak bir Nesne Ortam Kaydı ve bir Bildirimsel Ortam Kaydı'nı kapsülleyen bir bileşik olarak belirtilir. Nesne Ortam Kaydı, temel nesnesi olarak ilişkili Realm Record'un küresel nesnesine sahiptir. Bu küresel nesne, Küresel Ortam Kaydı'nın GetThisBinding somut yöntemi tarafından döndürülen değerdir. Bir Küresel Ortam Kaydı'nın Nesne Ortam Kaydı bileşeni, tüm yerleşik küreseller (madde 19) ve küresel kodda bulunan bir FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration veya VariableStatement tarafından getirilen tüm bağlamalar için bağlamaları içerir. Küresel koddaki diğer tüm ECMAScript bildirimleri için bağlamalar, Küresel Ortam Kaydı'nın Bildirimsel Ortam Kaydı bileşeninde bulunur.

Özellikler doğrudan bir küresel nesne üzerinde oluşturulabilir. Dolayısıyla, bir Küresel Ortam Kaydı'nın Nesne Ortam Kaydı bileşeni, hem FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration veya VariableDeclaration bildirimleri tarafından açıkça oluşturulan bağlamaları hem de küresel nesnenin özellikleri olarak örtük olarak oluşturulan bağlamaları içerebilir.

Küresel Ortam Kayıtları, Tablo 17'de listelenen ek alanlara sahiptir.

Tablo 17: Küresel Ortam Kayıtlarının Ek Alanları

Alan Adı Değer Anlamı
[[ObjectRecord]] bir Nesne Ortam Kaydı Bağlama nesnesi küresel nesnedir. İlişkili gerçeklik alanı için küresel koddaki FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration ve VariableDeclaration bağlamalarının yanı sıra küresel yerleşik bağlamaları içerir.
[[GlobalThisValue]] bir Object Küresel kapsamda this tarafından döndürülen değer. Konaklar herhangi bir ECMAScript Object değeri sağlayabilir.
[[DeclarativeRecord]] bir Bildirimsel Ortam Kaydı İlişkili gerçeklik alanı için küresel koddaki FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration ve VariableDeclaration bağlamaları dışındaki tüm bildirimler için bağlamaları içerir.
9.1.1.4.1 HasBinding ( name )

Bir Küresel Ortam Kaydı envRecord'un HasBinding somut yöntemi, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Argüman tanımlayıcısının, kayıt tarafından bağlanan tanımlayıcılardan biri olup olmadığını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, true döndür.

  3. objRecord = envRecord.[[ObjectRecord]] olsun.

  4. ? objRecord.HasBinding(name) döndür.

9.1.1.4.2 CreateMutableBinding ( name, deletable )

Bir Küresel Ortam Kaydı envRecord'un CreateMutableBinding somut yöntemi, name (bir String) ve deletable (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. name adı için ilklendirilmemiş yeni bir değişebilir bağlama oluşturur. Bağlama, ilişkili DeclarativeRecord içinde oluşturulur. DeclarativeRecord'da name için zaten bir bağlama bulunmamalıdır. deletable true ise, yeni bağlama silinmeye tabi olarak işaretlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, bir TypeError kuraldışı durumu fırlat.

  3. ! declRecord.CreateMutableBinding(name, deletable) döndür.

9.1.1.4.3 CreateImmutableBinding ( name, strict )

Bir Küresel Ortam Kaydı envRecord'un CreateImmutableBinding somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. name adı için ilklendirilmemiş yeni bir değişmez bağlama oluşturur. Bu Ortam Kaydı içinde name için zaten bir bağlama bulunmamalıdır. strict true ise, yeni bağlama katı bağlama olarak işaretlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, bir TypeError kuraldışı durumu fırlat.

  3. ! declRecord.CreateImmutableBinding(name, strict) döndür.

9.1.1.4.4 InitializeBinding ( name, value )

Bir Küresel Ortam Kaydı envRecord'un InitializeBinding somut yöntemi, name (bir String) ve value (bir ECMAScript dil değeri) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan tanımlayıcının mevcut bağlamasının bağlı değerini value değerine ayarlamak için kullanılır. name için ilklendirilmemiş bir bağlama zaten mevcut olmalıdır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, o zaman

    1. ! declRecord.InitializeBinding(name, value) döndür.
  3. Assert: Bağlama mevcutsa, Nesne Ortam Kaydı içinde olmalıdır.

  4. objRecord = envRecord.[[ObjectRecord]] olsun.

  5. ? objRecord.InitializeBinding(name, value) döndür.

9.1.1.4.5 SetMutableBinding ( name, value, strict )

Bir Küresel Ortam Kaydı envRecord'un SetMutableBinding somut yöntemi, name (bir String), value (bir ECMAScript dil değeri) ve strict (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan tanımlayıcının mevcut bağlamasının bağlı değerini value değerine değiştirmeye çalışır. Bağlama değişmez bir bağlamaysa ve strict true ise, bir TypeError fırlatılır. name adında bir bağlama normalde zaten mevcuttur, ancak mevcut değilse veya şu anda yazılabilir değilse, hata yönetimi strict tarafından belirlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, o zaman

    1. ? declRecord.SetMutableBinding(name, value, strict) döndür.
  3. objRecord = envRecord.[[ObjectRecord]] olsun.

  4. ? objRecord.SetMutableBinding(name, value, strict) döndür.

9.1.1.4.6 GetBindingValue ( name, strict )

Bir Küresel Ortam Kaydı envRecord'un GetBindingValue somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan bağlı tanımlayıcısının değerini döndürür. Bağlama ilklendirilmemiş bir bağlamaysa, bir ReferenceError kuraldışı durumu fırlatır. name adında bir bağlama normalde zaten mevcuttur, ancak mevcut değilse veya şu anda yazılabilir değilse, hata yönetimi strict tarafından belirlenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, o zaman

    1. ? declRecord.GetBindingValue(name, strict) döndür.
  3. objRecord = envRecord.[[ObjectRecord]] olsun.

  4. ? objRecord.GetBindingValue(name, strict) döndür.

9.1.1.4.7 DeleteBinding ( name )

Bir Küresel Ortam Kaydı envRecord'un DeleteBinding somut yöntemi, name (bir String) argümanını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Yalnızca açıkça silinmeye tabi olarak belirlenmiş bağlamaları silebilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. Eğer ! declRecord.HasBinding(name) true ise, o zaman

    1. ! declRecord.DeleteBinding(name) döndür.
  3. objRecord = envRecord.[[ObjectRecord]] olsun.

  4. globalObj = objRecord.[[BindingObject]] olsun.

  5. existingProperty = ? HasOwnProperty(globalObj, name) olsun.

  6. Eğer existingProperty true ise, o zaman

    1. ? objRecord.DeleteBinding(name) döndür.
  7. true döndür.

9.1.1.4.8 HasThisBinding ( )

Bir Küresel Ortam Kaydı envRecord'un HasThisBinding somut yöntemi hiçbir argüman almaz ve true döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. true döndür.
9.1.1.4.9 GetThisBinding ( )

Bir Küresel Ortam Kaydı envRecord'un GetThisBinding somut yöntemi hiçbir argüman almaz ve bir Object içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord.[[GlobalThisValue]] döndür.
9.1.1.4.10 HasSuperBinding ( )

Bir Küresel Ortam Kaydı envRecord'un HasSuperBinding somut yöntemi hiçbir argüman almaz ve false döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. false döndür.
9.1.1.4.11 WithBaseObject ( )

Bir Küresel Ortam Kaydı envRecord'un WithBaseObject somut yöntemi hiçbir argüman almaz ve undefined döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. undefined döndür.
9.1.1.4.12 HasLexicalDeclaration ( envRecord, name )

Soyut işlem HasLexicalDeclaration, envRecord (bir Küresel Ortam Kaydı) ve name (bir String) argümanlarını alır ve bir Boolean döndürür. Argüman tanımlayıcısının, LexicalDeclaration veya ClassDeclaration gibi bir sözcüksel bildirim kullanılarak oluşturulmuş bir bağlamaya envRecord içinde sahip olup olmadığını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. declRecord = envRecord.[[DeclarativeRecord]] olsun.

  2. ! declRecord.HasBinding(name) döndür.

9.1.1.4.13 HasRestrictedGlobalProperty ( envRecord, name )

Soyut işlem HasRestrictedGlobalProperty, envRecord (bir Küresel Ortam Kaydı) ve name (bir String) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Argüman tanımlayıcısının, küresel nesnenin küresel bir sözcüksel bağlama tarafından gölgelenmemesi gereken bir özelliğinin adı olup olmadığını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = envRecord.[[ObjectRecord]] olsun.

  2. globalObj = objRecord.[[BindingObject]] olsun.

  3. existingProperty = ? globalObj.[[GetOwnProperty]](name) olsun.

  4. Eğer existingProperty undefined ise, false döndür.

  5. Eğer existingProperty.[[Configurable]] true ise, false döndür.

  6. true döndür.

9.1.1.4.14 CanDeclareGlobalVar ( envRecord, name )

Soyut işlem CanDeclareGlobalVar, envRecord (bir Küresel Ortam Kaydı) ve name (bir String) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Aynı argüman name için çağrıldığında karşılık gelen bir CreateGlobalVarBinding çağrısının başarılı olup olmayacağını belirler. Gereksiz var bildirimlerine ve önceden var olan küresel nesne özellikleri için var bildirimlerine izin verilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = envRecord.[[ObjectRecord]] olsun.

  2. globalObj = objRecord.[[BindingObject]] olsun.

  3. hasProperty = ? HasOwnProperty(globalObj, name) olsun.

  4. Eğer hasProperty true ise, true döndür.

  5. ? IsExtensible(globalObj) döndür.

9.1.1.4.15 CanDeclareGlobalFunction ( envRecord, name )

Soyut işlem CanDeclareGlobalFunction, envRecord (bir Küresel Ortam Kaydı) ve name (bir String) argümanlarını alır ve ya bir Boolean içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Aynı argüman name için çağrıldığında karşılık gelen bir CreateGlobalFunctionBinding çağrısının başarılı olup olmayacağını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = envRecord.[[ObjectRecord]] olsun.

  2. globalObj = objRecord.[[BindingObject]] olsun.

  3. existingProperty = ? globalObj.[[GetOwnProperty]](name) olsun.

  4. Eğer existingProperty undefined ise, ? IsExtensible(globalObj) döndür.

  5. Eğer existingProperty.[[Configurable]] true ise, true döndür.

  6. Eğer IsDataDescriptor(existingProperty) true ise ve existingProperty { [[Writable]]: true, [[Enumerable]]: true } nitelik değerlerine sahipse, true döndür.

  7. false döndür.

9.1.1.4.16 CreateGlobalVarBinding ( envRecord, name, deletable )

Soyut işlem CreateGlobalVarBinding, envRecord (bir Küresel Ortam Kaydı), name (bir String) ve deletable (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. İlişkili Nesne Ortam Kaydı içinde değişebilir bir bağlama oluşturur ve ilklendirir. Bir bağlama zaten mevcutsa, yeniden kullanılır ve ilklendirilmiş olduğu varsayılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = envRecord.[[ObjectRecord]] olsun.

  2. globalObj = objRecord.[[BindingObject]] olsun.

  3. hasProperty = ? HasOwnProperty(globalObj, name) olsun.

  4. extensible = ? IsExtensible(globalObj) olsun.

  5. Eğer hasProperty false ise ve extensible true ise, o zaman

    1. ? objRecord.CreateMutableBinding(name, deletable) işlemini gerçekleştir.

    2. ? objRecord.InitializeBinding(name, undefined) işlemini gerçekleştir.

  6. unused döndür.

9.1.1.4.17 CreateGlobalFunctionBinding ( envRecord, name, value, deletable )

Soyut işlem CreateGlobalFunctionBinding, envRecord (bir Küresel Ortam Kaydı), name (bir String), value (bir ECMAScript işlev nesnesi) ve deletable (bir Boolean) argümanlarını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. İlişkili Nesne Ortam Kaydı içinde değişebilir bir bağlama oluşturur ve ilklendirir. Bir bağlama zaten mevcutsa, değiştirilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = envRecord.[[ObjectRecord]] olsun.

  2. globalObj = objRecord.[[BindingObject]] olsun.

  3. existingProperty = ? globalObj.[[GetOwnProperty]](name) olsun.

  4. Eğer existingProperty undefined ise veya existingProperty.[[Configurable]] true ise, o zaman

    1. propertyDesc, PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable } olsun.
  5. Değilse,

    1. propertyDesc, PropertyDescriptor { [[Value]]: value } olsun.
  6. ? DefinePropertyOrThrow(globalObj, name, propertyDesc) işlemini gerçekleştir.

  7. ? Set(globalObj, name, value, false) işlemini gerçekleştir.

  8. unused döndür.

9.1.1.5 Modül Ortam Kayıtları

Bir Modül Ortam Kaydı, bir ECMAScript Module'ünün dış kapsamını temsil etmek için kullanılan bir Bildirimsel Ortam Kaydı'dır. Normal değişebilir ve değişmez bağlamalara ek olarak, Modül Ortam Kayıtları, başka bir Ortam Kaydı içinde var olan bir hedef bağlamaya dolaylı erişim sağlayan bağlamalar olan değişmez içe aktarma bağlamaları da sağlar.

Modül Ortam Kayıtları, Tablo 14'te listelenen Bildirimsel Ortam Kaydı yöntemlerinin tümünü destekler ve GetBindingValue, DeleteBinding, HasThisBinding ve GetThisBinding dışındaki tüm bu yöntemler için aynı belirtimleri paylaşır.

9.1.1.5.1 GetBindingValue ( name, strict )

Bir Modül Ortam Kaydı envRecord'un GetBindingValue somut yöntemi, name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Adı name olan bağlı tanımlayıcısının değerini döndürür. Ancak, bağlama dolaylı bir bağlamaysa, hedef bağlamanın değeri döndürülür. Bağlama mevcut ancak ilklendirilmemişse bir ReferenceError fırlatılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: strict true'dur.

  2. Assert: envRecord, name için bir bağlamaya sahiptir.

  3. Eğer name için bağlama dolaylı bir bağlamaysa, o zaman

    1. module ve targetName, name için bu bağlama oluşturulduğunda sağlanan yönlendirme değerleri olsun.

    2. targetEnv = module.[[Environment]] olsun.

    3. Eğer targetEnv empty ise, bir ReferenceError kuraldışı durumu fırlat.

    4. ? targetEnv.GetBindingValue(targetName, true) döndür.

  4. Eğer envRecord içindeki name bağlaması ilklendirilmemiş bir bağlamaysa, bir ReferenceError kuraldışı durumu fırlat.

  5. envRecord içinde şu anda name'e bağlı olan değeri döndür.

9.1.1.5.2 DeleteBinding ( name )

Bir Modül Ortam Kaydı'nın DeleteBinding somut yöntemi bu belirtim içerisinde hiçbir zaman kullanılmaz.

9.1.1.5.3 HasThisBinding ( )

Bir Modül Ortam Kaydı envRecord'un HasThisBinding somut yöntemi hiçbir argüman almaz ve true döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. true döndür.
9.1.1.5.4 GetThisBinding ( )

Bir Modül Ortam Kaydı envRecord'un GetThisBinding somut yöntemi hiçbir argüman almaz ve undefined içeren normal tamamlanma döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. undefined döndür.
9.1.1.5.5 CreateImportBinding ( envRecord, name, targetModule, targetName )

Soyut işlem CreateImportBinding, envRecord (bir Modül Ortam Kaydı), name (bir String), targetModule (bir Module Record) ve targetName (bir String) argümanlarını alır ve unused döndürür. name adı için yeni, ilklendirilmiş, değişmez, dolaylı bir bağlama oluşturur. envRecord içinde name için zaten bir bağlama bulunmamalıdır. targetName, targetModule'ün Modül Ortam Kaydı içinde var olan bir bağlamanın adıdır. Yeni bağlamanın değerine erişimler, dolaylı olarak hedef bağlamanın bağlı değerine erişecektir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: envRecord, name için zaten bir bağlamaya sahip değildir.

  2. Assert: targetModule.[[Environment]] somutlaştırıldığında, targetName için doğrudan bir bağlamaya sahip olacaktır.

  3. envRecord içinde name için, hedef bağlaması olarak targetModule ve targetName'e başvuran değişmez dolaylı bir bağlama oluştur ve bağlamanın ilklendirildiğini kaydet.

  4. unused döndür.

9.1.2 Ortam Kaydı İşlemleri

Aşağıdaki soyut işlemler, bu belirtimde Ortam Kayıtları üzerinde işlem yapmak için kullanılır:

9.1.2.1 GetIdentifierReference ( envRecord, name, strict )

Soyut işlem GetIdentifierReference, envRecord (bir Ortam Kaydı veya null), name (bir String) ve strict (bir Boolean) argümanlarını alır ve ya bir Reference Record içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord null ise, o zaman

    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } döndür.
  2. exists = ? envRecord.HasBinding(name) olsun.

  3. Eğer exists true ise, o zaman

    1. Reference Record { [[Base]]: envRecord, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty } döndür.
  4. outer = envRecord.[[OuterEnv]] olsun.

  5. ? GetIdentifierReference(outer, name, strict) döndür.

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

Soyut işlem NewDeclarativeEnvironment, outerEnv (bir Ortam Kaydı veya null) argümanını alır ve bir Bildirimsel Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord, hiçbir bağlama içermeyen yeni bir Bildirimsel Ortam Kaydı olsun.

  2. envRecord.[[OuterEnv]]'i outerEnv olarak ayarla.

  3. envRecord döndür.

9.1.2.3 NewObjectEnvironment ( obj, isWithEnv, outerEnv )

Soyut işlem NewObjectEnvironment, obj (bir Object), isWithEnv (bir Boolean) ve outerEnv (bir Ortam Kaydı veya null) argümanlarını alır ve bir Nesne Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord, yeni bir Nesne Ortam Kaydı olsun.

  2. envRecord.[[BindingObject]]'i obj olarak ayarla.

  3. envRecord.[[IsWithEnvironment]]isWithEnv olarak ayarla.

  4. envRecord.[[OuterEnv]]'i outerEnv olarak ayarla.

  5. envRecord döndür.

9.1.2.4 NewFunctionEnvironment ( func, newTarget )

Soyut işlem NewFunctionEnvironment, func (bir ECMAScript işlev nesnesi) ve newTarget (bir Object veya undefined) argümanlarını alır ve bir İşlev Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord, hiçbir bağlama içermeyen yeni bir İşlev Ortam Kaydı olsun.

  2. envRecord.[[FunctionObject]]'i func olarak ayarla.

  3. Eğer func.[[ThisMode]] lexical ise, envRecord.[[ThisBindingStatus]]lexical olarak ayarla.

  4. Değilse, envRecord.[[ThisBindingStatus]]uninitialized olarak ayarla.

  5. envRecord.[[NewTarget]]newTarget olarak ayarla.

  6. envRecord.[[OuterEnv]]'i func.[[Environment]] olarak ayarla.

  7. envRecord döndür.

9.1.2.5 NewGlobalEnvironment ( obj, thisValue )

Soyut işlem NewGlobalEnvironment, obj (bir Object) ve thisValue (bir Object) argümanlarını alır ve bir Küresel Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. objRecord = NewObjectEnvironment(obj, false, null) olsun.

  2. declRecord = NewDeclarativeEnvironment(null) olsun.

  3. envRecord, yeni bir Küresel Ortam Kaydı olsun.

  4. envRecord.[[ObjectRecord]]'u objRecord olarak ayarla.

  5. envRecord.[[GlobalThisValue]]thisValue olarak ayarla.

  6. envRecord.[[DeclarativeRecord]]declRecord olarak ayarla.

  7. envRecord.[[OuterEnv]]'i null olarak ayarla.

  8. envRecord döndür.

9.1.2.6 NewModuleEnvironment ( outerEnv )

Soyut işlem NewModuleEnvironment, outerEnv (bir Küresel Ortam Kaydı) argümanını alır ve bir Modül Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord, hiçbir bağlama içermeyen yeni bir Modül Ortam Kaydı olsun.

  2. envRecord.[[OuterEnv]]'i outerEnv olarak ayarla.

  3. envRecord döndür.

9.2 Özel Ortam Kayıtları

Bir Özel Ortam Kaydı, ECMAScript kodundaki ClassDeclaration ve ClassExpression'ların sözcüksel yuvalanma yapısına dayalı olarak Private Name'leri izlemek için kullanılan bir belirtim mekanizmasıdır. Bunlar, Ortam Kayıtları'na benzer, ancak onlardan farklıdır. Her Özel Ortam Kaydı, bir ClassDeclaration veya ClassExpression ile ilişkilendirilir. Böyle bir sınıf her değerlendirildiğinde, o sınıf tarafından bildirilen Private Name'leri kaydetmek için yeni bir Özel Ortam Kaydı oluşturulur.

Her Özel Ortam Kaydı, Tablo 18'de tanımlanan alanlara sahiptir.

Tablo 18: Özel Ortam Kaydı Alanları

Alan Adı Değer Türü Anlamı
[[OuterPrivateEnvironment]] bir Özel Ortam Kaydı veya null En yakın içeren sınıfın Özel Ortam Kaydı. Bu Özel Ortam Kaydı'nın ilişkili olduğu sınıf başka bir sınıf tarafından içerilmiyorsa null.
[[Names]] Private Name'lerden oluşan bir Liste Bu sınıf tarafından bildirilen Private Name'ler.

9.2.1 Özel Ortam Kaydı İşlemleri

Aşağıdaki soyut işlemler, bu belirtimde Özel Ortam Kayıtları üzerinde işlem yapmak için kullanılır:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

Soyut işlem NewPrivateEnvironment, outerPrivateEnv (bir Özel Ortam Kaydı veya null) argümanını alır ve bir Özel Ortam Kaydı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. names, yeni bir boş Liste olsun.

  2. Özel Ortam Kaydı { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names } döndür.

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

Soyut işlem ResolvePrivateIdentifier, privateEnv (bir Özel Ortam Kaydı) ve identifier (bir String) argümanlarını alır ve bir Private Name döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. names = privateEnv.[[Names]] olsun.

  2. names'in her bir Private Name privateName öğesi için,

    1. Eğer privateName.[[Description]] identifier ise, o zaman

      1. privateName döndür.
  3. outerPrivateEnv = privateEnv.[[OuterPrivateEnvironment]] olsun.

  4. Assert: outerPrivateEnv null değildir.

  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier) döndür.

9.3 Gerçeklik Alanları

Değerlendirilmeden önce, tüm ECMAScript kodu bir gerçeklik alanıyla ilişkilendirilmelidir. Kavramsal olarak, bir gerçeklik alanı bir dizi içkin nesne, bir ECMAScript küresel ortamı, bu küresel ortamın kapsamına yüklenen tüm ECMAScript kodu ve diğer ilişkili durum ve kaynaklardan oluşur.

Bir gerçeklik alanı, bu belirtimde Tablo 19'da belirtilen alanlara sahip bir Realm Record olarak temsil edilir:

Tablo 19: Realm Record Alanları

Alan Adı Değer Anlamı
[[AgentSignifier]] bir etmen imleyicisi Bu gerçeklik alanına sahip olan etmen.
[[Intrinsics]] alan adları içkin anahtarlar ve değerleri nesneler olan bir Record Bu gerçeklik alanı ile ilişkili kod tarafından kullanılan içkin değerler.
[[GlobalObject]] bir Object Bu gerçeklik alanı için küresel nesne.
[[GlobalEnv]] bir Küresel Ortam Kaydı Bu gerçeklik alanı için küresel ortam.
[[TemplateMap]] [[Site]] (bir TemplateLiteral Parse Node) ve [[Array]] (bir Array) alanlarına sahip Record'lardan oluşan bir Liste Şablon nesneleri, her gerçeklik alanı için, onun Realm Record'unun [[TemplateMap]]'i kullanılarak ayrı ayrı kanonikleştirilir. Her [[Site]] değeri, bir TemplateLiteral olan bir Parse Node'dur. İlişkili [[Array]] değeri, bir etiket işlevine geçirilen karşılık gelen şablon nesnesidir. > [!NOTE] > Bir Parse Node erişilemez hale geldiğinde, karşılık gelen [[Array]] değeri de erişilemez olur ve bir gerçekleştirimin çifti [[TemplateMap]] listesinden kaldırması gözlemlenemez olurdu.
[[LoadedModules]] LoadedModuleRequest Record'lardan oluşan bir Liste Bu gerçeklik alanı tarafından içe aktarılan belirteç dizgilerinden çözümlenmiş Module Record'a bir eşleme. Liste, ModuleRequestsEqual(r1, r2) değeri true olacak şekilde iki farklı Record r1 ve r2 içermez. > [!NOTE] > HostLoadImportedModule (16.2.1.10 Not 1)'da belirtildiği gibi, Realm Record'lardaki [[LoadedModules]] yalnızca, etkin betik veya modülün olmadığı bir bağlamda bir import() ifadesi çalıştırılırken kullanılır.
[[HostDefined]] herhangi bir şey (varsayılan değer undefined) Bir Realm Record ile ek bilgi ilişkilendirmesi gereken konaklar tarafından kullanılmak üzere ayrılmış alan.

9.3.1 InitializeHostDefinedRealm ( )

Soyut işlem InitializeHostDefinedRealm hiçbir argüman almaz ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. realm, yeni bir Realm Record olsun.

  2. CreateIntrinsics(realm) işlemini gerçekleştir.

  3. realm.[[AgentSignifier]]AgentSignifier() olarak ayarla.

  4. realm.[[TemplateMap]]'i yeni bir boş Liste olarak ayarla.

  5. newContext, yeni bir yürütme bağlamı olsun.

  6. newContext'in Function bileşenini null olarak ayarla.

  7. newContext'in Realm bileşenini realm olarak ayarla.

  8. newContext'in ScriptOrModule bileşenini null olarak ayarla.

  9. newContext'i yürütme bağlamı yığınına it; newContext artık çalışan yürütme bağlamıdır.

  10. Eğer konak, realm'in küresel nesnesi olarak hizmet etmesi için belirli bir nesnenin kullanılmasını gerektiriyorsa, o zaman

    1. global, konak tanımlı bir şekilde oluşturulan böyle bir nesne olsun.
  11. Değilse,

    1. global = OrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]]) olsun.
  12. Eğer konak, realm'in küresel kapsamındaki this bağlamasının küresel nesne dışında bir nesne döndürmesini gerektiriyorsa, o zaman

    1. thisValue, konak tanımlı bir şekilde oluşturulan böyle bir nesne olsun.
  13. Değilse,

    1. thisValue = global olsun.
  14. realm.[[GlobalObject]]'i global olarak ayarla.

  15. realm.[[GlobalEnv]]'i NewGlobalEnvironment(global, thisValue) olarak ayarla.

  16. ? SetDefaultGlobalBindings(realm) işlemini gerçekleştir.

  17. global üzerinde herhangi bir konak tanımlı küresel nesne özelliği oluştur.

  18. unused döndür.

9.3.2 CreateIntrinsics ( realmRecord )

Soyut işlem CreateIntrinsics, realmRecord (bir Realm 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. realmRecord.[[Intrinsics]]'i yeni bir Record olarak ayarla.

  2. realmRecord.[[Intrinsics]]'in alanlarını Tablo 6'da listelenen değerlerle ayarla. Alan adları, tablonun “Intrinsic Name” sütununda listelenen adlardır. Her alanın değeri, 19 ila 28 maddelerindeki her bir nesnenin belirtimi ile tanımlanan özellik değerleriyle tam ve özyineli olarak doldurulmuş yeni bir nesne değeridir. Tüm nesne özellik değerleri yeni oluşturulmuş nesne değerleridir. Yerleşik işlev nesneleri olan tüm değerler, CreateBuiltinFunction(adımlar, uzunluk, ad, yuvalar, realmRecord, proto, async) işlemi gerçekleştirilerek oluşturulur; burada adımlar, bu belirtim tarafından sağlanan o işlevin tanımıdır, ad, işlevin "name" özelliğinin başlangıç değeridir, uzunluk, işlevin "length" özelliğinin başlangıç değeridir, yuvalar, varsa işlevin belirtilen iç yuvalarının adlarının bir listesidir, proto, işlevin [[Prototype]] iç yuvasının belirtilen değeridir ve async, işlev “async” olarak tanımlanmışsa true, aksi takdirde false'dır. İçkinlerin ve özelliklerinin oluşturulması, henüz oluşturulmamış nesnelere olan bağımlılıklardan kaçınacak şekilde sıralanmalıdır.

  3. AddRestrictedFunctionProperties(realmRecord.[[Intrinsics]].[[%Function.prototype%]], realmRecord) işlemini gerçekleştir.

  4. unused döndür.

9.3.3 SetDefaultGlobalBindings ( realmRecord )

Soyut işlem SetDefaultGlobalBindings, realmRecord (bir Realm Record) argümanını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. global = realmRecord.[[GlobalObject]] olsun.

  2. Madde 19'da belirtilen Küresel Nesnenin her özelliği için,

    1. name, özellik adının String değeri olsun.

    2. propertyDesc, özellik için belirtilen nitelikleri içeren, tam olarak doldurulmuş veri Property Descriptor olsun. 19.2, 19.3 veya 19.4'te listelenen özellikler için [[Value]] niteliğinin değeri, realmRecord'dan karşılık gelen içkin nesnedir.

    3. ? DefinePropertyOrThrow(global, name, propertyDesc) işlemini gerçekleştir.

  3. unused döndür.

9.4 Yürütme Bağlamları

Bir yürütme bağlamı, bir ECMAScript gerçekleştirimi tarafından kodun çalışma zamanı değerlendirmesini izlemek için kullanılan bir belirtim aygıtıdır. Herhangi bir zamanda, etmen başına fiilen kod yürüten en fazla bir yürütme bağlamı vardır. Bu, etmen'in çalışan yürütme bağlamı olarak bilinir. Bu belirtimde çalışan yürütme bağlamına yapılan tüm atıflar, çevreleyen etmenin çalışan yürütme bağlamını belirtir.

Yürütme bağlamı yığını, yürütme bağlamlarını izlemek için kullanılır. Çalışan yürütme bağlamı her zaman bu yığının en üst öğesidir. Denetim, şu anki çalışan yürütme bağlamı ile ilişkili yürütülebilir koddan, bu yürütme bağlamıyla ilişkili olmayan yürütülebilir koda aktarıldığında yeni bir yürütme bağlamı oluşturulur. Yeni oluşturulan yürütme bağlamı yığına itilir ve çalışan yürütme bağlamı olur.

Bir yürütme bağlamı, ilişkili kodunun yürütme ilerlemesini izlemek için gerekli olan gerçekleştirime özgü durumu içerir. Her yürütme bağlamı, Tablo 20'de listelenen durum bileşenlerine en azından sahiptir.

Tablo 20: Tüm Yürütme Bağlamları için Durum Bileşenleri

Bileşen Amacı
kod değerlendirme durumu Bu yürütme bağlamı ile ilişkili kodun değerlendirmesini gerçekleştirmek, askıya almak ve sürdürmek için gereken herhangi bir durum.
Function Bu yürütme bağlamı bir işlev nesnesinin kodunu değerlendiriyorsa, bu bileşenin değeri o işlev nesnesidir. Bağlam bir Script veya Module kodunu değerlendiriyorsa, değer null'dır.
Realm İlişkili kodun ECMAScript kaynaklarına eriştiği Realm Record.
ScriptOrModule İlişkili kodun kaynaklandığı Module Record veya Script Record. InitializeHostDefinedRealm'de oluşturulan orijinal yürütme bağlamı için olduğu gibi, kaynaklanan bir betik veya modül yoksa değer null'dır.

Çalışan yürütme bağlamı tarafından kodun Değerlendirilmesi, bu belirtim içinde tanımlanan çeşitli noktalarda askıya alınabilir. Çalışan yürütme bağlamı askıya alındıktan sonra, farklı bir yürütme bağlamı çalışan yürütme bağlamı olabilir ve kendi kodunu değerlendirmeye başlayabilir. Daha sonraki bir zamanda, askıya alınmış bir yürütme bağlamı tekrar çalışan yürütme bağlamı olabilir ve daha önce askıya alındığı noktada kodunu değerlendirmeye devam edebilir. Çalışan yürütme bağlamı durumunun yürütme bağlamları arasında geçişi genellikle yığın benzeri son giren ilk çıkar şeklinde gerçekleşir. Ancak, bazı ECMAScript özellikleri çalışan yürütme bağlamının LIFO olmayan geçişlerini gerektirir.

Çalışan yürütme bağlamının Realm bileşeninin değeri aynı zamanda geçerli Realm Record olarak da adlandırılır. Çalışan yürütme bağlamının Function bileşeninin değeri aynı zamanda etkin işlev nesnesi olarak da adlandırılır.

ECMAScript kodu yürütme bağlamları, Tablo 21'de listelenen ek durum bileşenlerine sahiptir.

Tablo 21: ECMAScript Kodu Yürütme Bağlamları için Ek Durum Bileşenleri

Bileşen Amacı
LexicalEnvironment Bu yürütme bağlamı içindeki kod tarafından yapılan tanımlayıcı başvurularını çözümlemek için kullanılan Ortam Kaydı'nı tanımlar.
VariableEnvironment Bu yürütme bağlamı içindeki VariableStatement'lar tarafından oluşturulan bağlamaları tutan Ortam Kaydı'nı tanımlar.
PrivateEnvironment En yakın içeren sınıftaki ClassElement'ler tarafından oluşturulan Private Name'leri tutan Özel Ortam Kaydı'nı tanımlar. İçeren bir sınıf yoksa null.

Bir yürütme bağlamının LexicalEnvironment ve VariableEnvironment bileşenleri her zaman Ortam Kayıtları'dır.

Üreteçlerin değerlendirmesini temsil eden yürütme bağlamları, Tablo 22'de listelenen ek durum bileşenlerine sahiptir.

Tablo 22: Üreteç Yürütme Bağlamları için Ek Durum Bileşenleri

Bileşen Amacı
Generator Bu yürütme bağlamının değerlendirdiği Üreteç.

Çoğu durumda, bu belirtim içindeki algoritmalar tarafından yalnızca çalışan yürütme bağlamı (yürütme bağlamı yığınının en üstü) doğrudan işlenir. Bu nedenle, “LexicalEnvironment” ve “VariableEnvironment” terimleri niteleme olmaksızın kullanıldığında, çalışan yürütme bağlamının bu bileşenlerine atıfta bulunurlar.

Bir yürütme bağlamı tamamen bir belirtim mekanizmasıdır ve bir ECMAScript gerçekleştiriminin herhangi bir belirli yapıtına karşılık gelmek zorunda değildir. ECMAScript kodunun bir yürütme bağlamına doğrudan erişmesi veya onu gözlemlemesi olanaksızdır.

9.4.1 GetActiveScriptOrModule ( )

Soyut işlem GetActiveScriptOrModule hiçbir argüman almaz ve bir Script Record, bir Module Record veya null döndürür. Çalışan yürütme bağlamına dayalı olarak çalışan betiği veya modülü belirlemek için kullanılır. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer yürütme bağlamı yığını boşsa, null döndür.

  2. executionContext, yürütme bağlamı yığını üzerindeki, ScriptOrModule bileşeni null olmayan en üstteki yürütme bağlamı olsun.

  3. Eğer böyle bir yürütme bağlamı yoksa, null döndür.

  4. executionContext'in ScriptOrModule bileşenini döndür.

9.4.2 ResolveBinding ( name [ , envRecord ] )

Soyut işlem ResolveBinding, name (bir String) argümanını ve isteğe bağlı envRecord (bir Ortam Kaydı veya undefined) argümanını alır ve ya bir Reference Record içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. name'in bağlamasını belirlemek için kullanılır. envRecord, bağlamanın aranacağı Ortam Kaydı'nı açıkça sağlamak için kullanılabilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer envRecord mevcut değilse veya envRecord undefined ise, o zaman

    1. envRecord'u çalışan yürütme bağlamının LexicalEnvironment'ı olarak ayarla.
  2. Assert: envRecord bir Ortam Kaydı'dır.

  3. strict = IsStrict(değerlendirilmekte olan sözdizimsel üretim) olsun.

  4. ? GetIdentifierReference(envRecord, name, strict) döndür.

9.4.3 GetThisEnvironment ( )

Soyut işlem GetThisEnvironment hiçbir argüman almaz ve bir Ortam Kaydı döndürür. Şu anda this anahtar sözcüğünün bağlamasını sağlayan Ortam Kaydı'nı bulur. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord, çalışan yürütme bağlamının LexicalEnvironment'ı olsun.

  2. Tekrar et,

    1. exists = envRecord.HasThisBinding() olsun.

    2. Eğer exists true ise, envRecord döndür.

    3. outer = envRecord.[[OuterEnv]] olsun.

    4. Assert: outer null değildir.

    5. envRecord'u outer olarak ayarla.

9.4.4 ResolveThisBinding ( )

Soyut işlem ResolveThisBinding hiçbir argüman almaz ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çalışan yürütme bağlamının LexicalEnvironment'ını kullanarak this anahtar sözcüğünün bağlamasını belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord = GetThisEnvironment() olsun.

  2. ? envRecord.GetThisBinding() döndür.

9.4.5 GetNewTarget ( )

Soyut işlem GetNewTarget hiçbir argüman almaz ve bir Object veya undefined döndürür. Çalışan yürütme bağlamının LexicalEnvironment'ını kullanarak NewTarget değerini belirler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. envRecord = GetThisEnvironment() olsun.

  2. Assert: envRecord bir [[NewTarget]] alanına sahiptir.

  3. envRecord.[[NewTarget]] döndür.

9.4.6 GetGlobalObject ( )

Soyut işlem GetGlobalObject hiçbir argüman almaz ve bir Object döndürür. Şu anda çalışan yürütme bağlamı tarafından kullanılan küresel nesneyi döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. currentRealm = geçerli Realm Record olsun.

  2. currentRealm.[[GlobalObject]] döndür.

9.4.7 RunSuspendedContext ( context, completionRecord )

Soyut işlem RunSuspendedContext, context (bir yürütme bağlamı) ve completionRecord (bir Completion Record) argümanlarını alır ve ya bir ECMAScript dil değeri veya unused içeren normal tamamlanma ya da bir ani tamamlanma döndürür. context'i sürdürür (sürdürme değeri olarak completionRecord'u gönderir) ve sonucu bekler. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. callerContext, çalışan yürütme bağlamı olsun.

  2. callerContext'i askıya al.

  3. context'i yürütme bağlamı yığınına it; context artık çalışan yürütme bağlamıdır.

  4. context'in askıya alınmış değerlendirmesini, onu askıya alan işlemin sonucu olarak completionRecord'u kullanarak sürdür. result, sürdürülen hesaplama tarafından döndürülen Completion Record olsun.

  5. Assert: Bu adıma ulaştığımızda, context yürütme bağlamı yığınından zaten kaldırılmıştır ve callerContext yeniden çalışan yürütme bağlamıdır.

  6. Completion(result) döndür.

9.5 İşler ve İşleri Kuyruğa Almak için Konak İşlemleri

Bir İş, şu anda başka hiçbir ECMAScript hesaplaması devam etmezken bir ECMAScript hesaplamasını başlatan, parametresiz bir Abstract Closure'dır.

İşler, belirli bir etmen içindeki ECMAScript konak ortamları tarafından yürütülmek üzere zamanlanır. Bu belirtim, işleri zamanlamak için konak kancaları olan HostEnqueueGenericJob, HostEnqueueFinalizationRegistryCleanupJob, HostEnqueuePromiseJob ve HostEnqueueTimeoutJob'u açıklar. Bu belirtimdeki konak kancaları, işlerin zamanlanmasına getirilen ek kısıtlamalara göre düzenlenmiştir. Konaklar, işleri zamanlayan ek soyut işlemler tanımlayabilir. Bu tür işlemler, parametre olarak bir İş Abstract Closure ve bir gerçeklik alanı (bir Realm Record veya null) kabul eder. Bir Realm Record sağlanırsa, bu işlemler işi, sağlanan gerçeklik alanında, gerçeklik alanına sahip olan etmen içinde gelecekteki bir zamanda gerçekleştirilmek üzere zamanlar. Gerçeklik alanı için null sağlanırsa, iş ECMAScript kodu değerlendirmez. Gerçekleştirimleri aşağıdaki gerekliliklere uymak zorundadır:

Herhangi bir zamanda, aşağıdaki koşulların tümü doğruysa, scriptOrModule (bir Script Record, bir Module Record veya null) etkin betik veya modüldür:

Herhangi bir zamanda, aşağıdaki koşulların tümü doğruysa, bir yürütme ECMAScript kodunu değerlendirmeye hazırdır:

Belirli İş türlerinin ek uygunluk gereklilikleri vardır.

9.5.1 JobCallback Kayıtları

Bir JobCallback Record, bir işlev nesnesini ve konak tanımlı bir değeri depolamak için kullanılan bir Record değeridir. Konak tarafından kuyruğa alınan bir İş aracılığıyla çağrılan İşlev nesneleri, ek konak tanımlı bağlama sahip olabilir. Durumu yaymak için, İş Abstract Closure'ları işlev nesnelerini doğrudan yakalamamalı ve çağırmamalıdır. Bunun yerine, HostMakeJobCallback ve HostCallJobCallback kullanın.

JobCallback Kayıtları, Tablo 23'te listelenen alanlara sahiptir.

Tablo 23: JobCallback Record Alanları

Alan Adı Değer Anlamı
[[Callback]] bir işlev nesnesi İş çağrıldığında çağrılacak işlev.
[[HostDefined]] herhangi bir şey (varsayılan değer empty) Konaklar tarafından kullanılmak üzere ayrılmış alan.

9.5.2 HostMakeJobCallback ( callback )

Konak tanımlı soyut işlem HostMakeJobCallback, callback (bir işlev nesnesi) argümanını alır ve bir JobCallback Record döndürür.

HostMakeJobCallback'ın bir gerçekleştirimi aşağıdaki gerekliliklere uymak zorundadır:

HostMakeJobCallback'ın varsayılan gerçekleştirimi çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty } döndür.

Web tarayıcısı olmayan ECMAScript konakları, HostMakeJobCallback'ın varsayılan gerçekleştirimini kullanmak zorundadır.

9.5.3 HostCallJobCallback ( jobCallback, value, argList )

Konak tanımlı soyut işlem HostCallJobCallback, jobCallback (bir JobCallback Record), value (bir ECMAScript dil değeri) ve argList (ECMAScript dil değerlerinden oluşan bir Liste) argümanlarını alır ve ya bir ECMAScript dil değeri içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür.

HostCallJobCallback'ın bir gerçekleştirimi aşağıdaki gerekliliklere uymak zorundadır:

  • Call(jobCallback.[[Callback]], value, argList) işlemini gerçekleştirmeli ve sonucunu döndürmelidir.

HostCallJobCallback'ın varsayılan gerçekleştirimi çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: IsCallable(jobCallback.[[Callback]]) true'dur.

  2. ? Call(jobCallback.[[Callback]], value, argList) döndür.

Web tarayıcısı olmayan ECMAScript konakları, HostCallJobCallback'ın varsayılan gerçekleştirimini kullanmak zorundadır.

9.5.4 HostEnqueueGenericJob ( job, realm )

Konak tanımlı soyut işlem HostEnqueueGenericJob, job (bir İş Abstract Closure) ve realm (bir Realm Record) argümanlarını alır ve unused döndürür. job'u, realm.[[AgentSignifier]] tarafından imlenen etmen içindeki gerçeklik alanı realm'de gelecekteki bir zamanda gerçekleştirilmek üzere zamanlar. Bu algoritma ile kullanılan Abstract Closure'ların, öncelik ve sıralama gibi ek kısıtlamalar olmaksızın zamanlanması amaçlanmıştır.

HostEnqueueGenericJob'ın bir gerçekleştirimi, 9.5'teki gerekliliklere uymak zorundadır.

9.5.5 HostEnqueuePromiseJob ( job, realm )

Konak tanımlı soyut işlem HostEnqueuePromiseJob, job (bir İş Abstract Closure) ve realm (bir Realm Record veya null) argümanlarını alır ve unused döndürür. job'u gelecekteki bir zamanda gerçekleştirilmek üzere zamanlar. Bu algoritma ile kullanılan Abstract Closure'ların, Promise'lerin işlenmesiyle ilgili olması veya aksi takdirde Promise işleme işlemleriyle eşit öncelikte zamanlanması amaçlanmıştır.

HostEnqueuePromiseJob'ın bir gerçekleştirimi, 9.5'teki gerekliliklere ve aşağıdakilere uymak zorundadır:

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

Konak tanımlı soyut işlem HostEnqueueTimeoutJob, timeoutJob (bir İş Abstract Closure), realm (bir Realm Record) ve milliseconds (negatif olmayan sonlu bir Number) argümanlarını alır ve unused döndürür. timeoutJob'u, realm.[[AgentSignifier]] tarafından imlenen etmen içindeki gerçeklik alanı realm'de, en az milliseconds milisaniye sonra gerçekleştirilmek üzere zamanlar.

HostEnqueueTimeoutJob'ın bir gerçekleştirimi, 9.5'teki gerekliliklere uymak zorundadır.

9.6 Etmenler

Bir etmen, bir dizi ECMAScript yürütme bağlamı, bir yürütme bağlamı yığını, bir çalışan yürütme bağlamı, bir Agent Record ve bir yürüten iş parçacığından oluşur. Yürüten iş parçacığı hariç, bir etmenin bileşenleri yalnızca o etmene aittir.

Bir etmenin yürüten iş parçacığı, diğer etmenlerden bağımsız olarak etmenin yürütme bağlamları üzerinde algoritmik adımları yürütür; ancak bir yürüten iş parçacığı, iş parçacığını paylaşan etmenlerden hiçbirinin [[CanBlock]] alanı true olan bir Agent Record'a sahip olmaması koşuluyla, birden çok etmen tarafından yürüten iş parçacığı olarak kullanılabilir.

Bir etmenin yürüten iş parçacığı algoritmik adımları yürütürken, etmen bu adımlar için çevreleyen etmendir. Adımlar, etmen içinde tutulan belirtim düzeyindeki yürütme nesnelerine erişmek için çevreleyen etmeni kullanır: çalışan yürütme bağlamı, yürütme bağlamı yığını ve Agent Record'un alanları.

Bir etmen imleyicisi, bir Etmeni tanımlamak için kullanılan küresel olarak benzersiz, opak bir değerdir.

Tablo 24: Agent Record Alanları

Alan Adı Değer Anlamı
[[LittleEndian]] bir Boolean GetValueFromBuffer ve SetValueInBuffer algoritmaları tarafından ihtiyaç duyulduğunda isLittleEndian parametresi için hesaplanan varsayılan değer. Seçim gerçekleştirim tanımlıdır ve gerçekleştirim için en verimli olan alternatif olmalıdır.
[[CanBlock]] bir Boolean Etmenin engellenip engellenemeyeceğini belirler.
[[Signifier]] bir etmen imleyicisi Etmeni, etmen kümesi içinde benzersiz olarak tanımlar.
[[IsLockFree1]] bir Boolean Bir baytlık değerler üzerindeki atomik işlemler kilitsiz ise true, aksi takdirde false.
[[IsLockFree2]] bir Boolean İki baytlık değerler üzerindeki atomik işlemler kilitsiz ise true, aksi takdirde false.
[[IsLockFree8]] bir Boolean Sekiz baytlık değerler üzerindeki atomik işlemler kilitsiz ise true, aksi takdirde false.
[[CandidateExecution]] bir aday yürütme Record Bkz. bellek modeli.
[[KeptAlive]] Object veya Symbol'lerden oluşan bir Liste Başlangıçta yeni bir boş Liste, geçerli İş sonuna kadar canlı tutulacak nesnelerin ve/veya sembollerin listesini temsil eder.
[[ModuleAsyncEvaluationCount]] bir tamsayı Başlangıçta 0, eşzamansız olan veya eşzamansız bağımlılıkları olan modüllerin [[AsyncEvaluationOrder]] alanına benzersiz artan değerler atamak için kullanılır.

[[LittleEndian]], [[Signifier]], [[IsLockFree1]], [[IsLockFree2]] ve [[IsLockFree8]] değerleri değişemez.

9.6.1 AgentSignifier ( )

Soyut işlem AgentSignifier hiçbir argüman almaz ve bir etmen imleyicisi döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen etmenin Agent Record'u olsun.

  2. agentRecord.[[Signifier]] döndür.

9.6.2 AgentCanSuspend ( )

Soyut işlem AgentCanSuspend hiçbir argüman almaz ve bir Boolean döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen etmenin Agent Record'u olsun.

  2. agentRecord.[[CanBlock]] döndür.

9.6.3 IncrementModuleAsyncEvaluationCount ( )

Soyut işlem IncrementModuleAsyncEvaluationCount hiçbir argüman almaz ve negatif olmayan bir tamsayı döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen etmenin Agent Record'u olsun.

  2. count = agentRecord.[[ModuleAsyncEvaluationCount]] olsun.

  3. agentRecord.[[ModuleAsyncEvaluationCount]]count + 1 olarak ayarla.

  4. count döndür.

9.7 Etmen Kümeleri

Bir etmen kümesi, paylaşımlı bellek üzerinde işlem yaparak iletişim kurabilen en büyük etmenler kümesidir.

Her etmen tam olarak bir etmen kümesine aittir.

Bir küme içindeki tüm etmenler, kendi Agent Record'larındaki [[LittleEndian]] alanı için aynı değere sahip olmalıdır.

Bir küme içindeki tüm etmenler, kendi Agent Record'larındaki [[IsLockFree1]] alanı için aynı değerlere sahip olmalıdır; aynı şekilde [[IsLockFree2]] ve [[IsLockFree8]] alanları için de.

Bir küme içindeki tüm etmenler, kendi Agent Record'larındaki [[Signifier]] alanı için farklı değerlere sahip olmalıdır.

Bir gömme, bir etmeni etmenin bilgisi veya işbirliği olmaksızın devre dışı bırakabilir (ilerlemeyi durdurabilir) veya etkinleştirebilir (ilerlemeyi sürdürebilir). Eğer gömme bunu yaparsa, kümedeki bazı etmenleri etkin bırakırken kümedeki diğer etmenleri süresiz olarak devre dışı bırakmamalıdır.

Bir gömme, bir etmeni, etmenin kümesindeki diğer etmenlerin önceden bilgisi veya işbirliği olmaksızın sonlandırabilir. Bir etmen, kendisinin veya kümedeki başka bir etmenin programatik eylemiyle değil de kümeye dışsal güçler tarafından sonlandırılırsa, gömme iki stratejiden birini seçmelidir: Ya kümedeki tüm etmenleri sonlandır, ya da kümedeki etmenlerin, kümenin en az bir kalan üyesinin sonlandırmayı tespit edebilmesini sağlayacak şekilde koordine olmalarına izin veren güvenilir API'ler sağla; sonlandırma verileri, sonlandırılan etmeni tanımlamak için yeterli bilgiyi içermelidir.

Aşağıdaki belirtim değerlerinin her biri ve onlardan geçişli olarak erişilebilen değerler, tam olarak bir etmen kümesine aittir.

Bir kümedeki herhangi bir etmen tarafından herhangi bir ECMAScript kodunun herhangi bir değerlendirmesinden önce, kümedeki tüm etmenler için Agent Record'un [[CandidateExecution]] alanı, başlangıç aday yürütmeye ayarlanır. Başlangıç aday yürütme, [[EventsRecords]] alanı, her etmen için, [[AgentSignifier]] alanı o etmenin etmen imleyicisi olan ve [[EventList]] ve [[AgentSynchronizesWith]] alanları boş Listeler olan bir Agent Events Record içeren bir Liste olan bir boş aday yürütmedir.

9.8 İleri İlerleme

Bir etmenin ileri ilerleme kaydetmesi, bu belirtime göre bir değerlendirme adımı gerçekleştirmesidir.

Bir etmen, çalışan yürütme bağlamı harici bir olayı eşzamanlı ve süresiz olarak beklediğinde engellenmiş olur. Yalnızca Agent Record'u [[CanBlock]] alanı true olan etmenler bu anlamda engellenebilir. Engellenmemiş bir etmen, engellenmiş olmayandır.

Gerçekleştirimler aşağıdakileri sağlamalıdır:

9.9 WeakRef ve FinalizationRegistry Hedeflerinin İşleme Modeli

9.9.1 Amaçlar

Bu belirtim, herhangi bir nesnenin veya sembolün çöp toplanacağına dair hiçbir garanti vermez. Canlı olmayan nesneler veya semboller uzun süreler sonra veya hiçbir zaman serbest bırakılmayabilir. Bu nedenle, bu belirtim çöp toplama tarafından tetiklenen davranışı tanımlarken “may” (olasılık belirten) terimini kullanır.

WeakRef'lerin ve FinalizationRegistry'lerin anlambilimi, zaman içinde belirli noktalarda gerçekleşen iki işleme dayanır:

  • WeakRef.prototype.deref çağrıldığında, başvurulan (eğer undefined döndürülmezse) canlı tutulur, böylece sonraki, eşzamanlı erişimler de aynı değeri döndürür. Bu liste, ClearKeptObjects soyut işlemi kullanılarak eşzamanlı iş tamamlandığında sıfırlanır.

  • Bir FinalizationRegistry'ye kayıtlı bir nesne veya sembol erişilemez hale geldiğinde, eşzamanlı ECMAScript yürütmesi tamamlandıktan sonra, FinalizationRegistry'nin temizleme geri çağrısının bir çağrısı nihayetinde yapılabilir. FinalizationRegistry temizliği, CleanupFinalizationRegistry soyut işlemi ile gerçekleştirilir.

Bu eylemlerin hiçbiri (ClearKeptObjects veya CleanupFinalizationRegistry) eşzamanlı ECMAScript yürütmesini kesintiye uğratamaz. Konaklar daha uzun, eşzamanlı ECMAScript yürütme çalışmaları oluşturabileceğinden, bu belirtim ClearKeptObjects ve CleanupFinalizationRegistry'nin zamanlanmasını konak ortamına erteler.

Bazı ECMAScript gerçekleştirimleri, ECMAScript boşta olduğunda da dahil olmak üzere, arka planda çalışan çöp toplayıcı gerçekleştirimleri içerir. Konak ortamının CleanupFinalizationRegistry'yi zamanlamasına izin vermek, tutulan değerleri serbest bırakabilecek ve genel bellek kullanımını azaltabilecek sonlandırıcı işini çalıştırmak için ECMAScript yürütmesini sürdürmesini sağlar.

9.9.2 Canlılık

Bazı nesne ve/veya sembol kümesi objSet için, objSet'e göre varsayımsal bir WeakRef-kayıtsız yürütme, başvurulanı objSet'in bir öğesi olan bir WeakRef'in WeakRefDeref soyut işleminin her zaman undefined döndürdüğü bir yürütmedir.

Değerlendirme sırasında herhangi bir noktada, bir nesne ve/veya sembol kümesi objSet, aşağıdaki koşullardan biri karşılanıyorsa canlı kabul edilir:

  • objSet'teki herhangi bir öğe, herhangi bir etmenin [[KeptAlive]] Listesinde yer alır.

  • objSet'teki herhangi bir değerin kimliğini gözlemleyen, objSet'e göre geçerli bir gelecekteki varsayımsal WeakRef-kayıtsız yürütme mevcuttur.

9.9.3 Yürütme

Herhangi bir zamanda, bir nesne ve/veya sembol kümesi objSet canlı değilse, bir ECMAScript gerçekleştirimi aşağıdaki adımları atomik olarak gerçekleştirebilir:

  1. objSet'in her bir value öğesi için,

    1. ref.[[WeakRefTarget]]'i value olan her WeakRef ref için,

      1. ref.[[WeakRefTarget]]'i empty olarak ayarla.
    2. fg.[[Cells]]'i, cell.[[WeakRefTarget]]'i value olan bir Record cell içeren her FinalizationRegistry fg için,

      1. cell.[[WeakRefTarget]]'i empty olarak ayarla.

      2. enqueueCleanup, gerçekleştirim tanımlı bir true veya false seçimi olsun.

      3. Eğer enqueueCleanup true ise, HostEnqueueFinalizationRegistryCleanupJob(fg) işlemini gerçekleştir.

    3. map.[[WeakMapData]]'sı, entry.[[Key]]'i value olan bir Record entry içeren her WeakMap map için,

      1. entry.[[Key]]'i empty olarak ayarla.

      2. entry.[[Value]]empty olarak ayarla.

    4. set.[[WeakSetData]]'sı value içeren her WeakSet set için,

      1. set.[[WeakSetData]]'sının değeri value olan öğesini, değeri empty olan bir öğe ile değiştir.

9.9.4 Konak Kancaları

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

Konak tanımlı soyut işlem HostEnqueueFinalizationRegistryCleanupJob, finalizationRegistry (bir FinalizationRegistry) argümanını alır ve unused döndürür.

cleanupJob, finalizationRegistry'yi yakalayan ve çağrıldığında aşağıdaki adımları gerçekleştiren, parametresiz yeni bir İş Abstract Closure olsun:

  1. cleanupResult = Completion(CleanupFinalizationRegistry(finalizationRegistry)) olsun.

  2. Eğer cleanupResult bir ani tamamlanma ise, hatayı raporlamak için herhangi bir konak tanımlı adımı gerçekleştir.

  3. unused döndür.

HostEnqueueFinalizationRegistryCleanupJob'ın bir gerçekleştirimi, mümkünse cleanupJob'u gelecekteki bir zamanda gerçekleştirilmek üzere zamanlar. Ayrıca 9.5'teki gerekliliklere de uymak zorundadır.

9.10 ClearKeptObjects ( )

Soyut işlem ClearKeptObjects hiçbir argüman almaz ve unused döndürür. ECMAScript gerçekleştirimlerinin, eşzamanlı bir ECMAScript yürütme dizisi tamamlandığında ClearKeptObjects'ı çağırması beklenir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen etmenin Agent Record'u olsun.

  2. agentRecord.[[KeptAlive]]'ı yeni bir boş Liste olarak ayarla.

  3. unused döndür.

9.11 AddToKeptObjects ( value )

Soyut işlem AddToKeptObjects, value (bir Object veya bir Symbol) argümanını alır ve unused döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. agentRecord, çevreleyen etmenin Agent Record'u olsun.

  2. value'yu agentRecord.[[KeptAlive]]'a ekle.

  3. unused döndür.

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

Soyut işlem CleanupFinalizationRegistry, finalizationRegistry (bir FinalizationRegistry) argümanını alır ve ya unused içeren normal tamamlanma ya da bir fırlatma tamamlanması döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Assert: finalizationRegistry, [[Cells]] ve [[CleanupCallback]] iç yuvalarına sahiptir.

  2. callback = finalizationRegistry.[[CleanupCallback]] olsun.

  3. finalizationRegistry.[[Cells]], cell.[[WeakRefTarget]]'i empty olan bir Record cell içerdiği sürece, bir gerçekleştirim aşağıdaki adımları gerçekleştirebilir:

    1. Böyle herhangi bir cell seç.

    2. cell'i finalizationRegistry.[[Cells]]'ten kaldır.

    3. ? HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] ») işlemini gerçekleştir.

  4. unused döndür.

9.13 CanBeHeldWeakly ( arg )

Soyut işlem CanBeHeldWeakly, arg (bir ECMAScript dil değeri) argümanını alır ve bir Boolean döndürür. arg'ın zayıf bir başvuru olarak kullanılmaya uygun olması durumunda true döndürür. Yalnızca zayıf bir başvuru olarak kullanılmaya uygun değerler, bir WeakMap'in anahtarı, bir WeakSet'in öğesi, bir WeakRef'in hedefi veya bir FinalizationRegistry'nin hedeflerinden biri olabilir. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. Eğer arg bir Object ise, true döndür.

  2. Eğer arg bir Symbol ise ve KeyForSymbol(arg) undefined ise, true döndür.

  3. false döndür.