Genel Bakış
Bu bölüm, ECMAScript diline ilişkin normatif olmayan bir genel bakış içermektedir.
ECMAScript, bir konak ortamı içerisinde hesaplamalar gerçekleştirmek ve hesaplama nesnelerini işlemek için kullanılan nesne yönelimli bir programlama dilidir. Burada tanımlandığı biçimiyle ECMAScript'in hesaplama açısından kendi kendine yeterli olması amaçlanmamıştır; gerçekten de, bu belirtimde dış veri girişi veya hesaplanan sonuçların çıkışı için hiçbir hüküm bulunmamaktadır. Bunun yerine, bir ECMAScript programının hesaplama ortamının, yalnızca bu belirtimde açıklanan nesneleri ve diğer olanakları değil, aynı zamanda belirli ortama özgü nesneleri de sağlaması beklenir; bu nesnelerin açıklaması ve davranışı, bir ECMAScript programından erişilebilecek belirli özellikleri ve çağrılabilecek belirli işlevleri sağlayabileceklerini belirtmek dışında, bu belirtimin kapsamı dışındadır.
ECMAScript başlangıçta bir betik dili olarak kullanılmak üzere tasarlanmış, ancak genel amaçlı bir programlama dili olarak yaygın biçimde kullanılır hale gelmiştir. Bir betik dili, mevcut bir sistemin olanaklarını işlemek, özelleştirmek ve otomatikleştirmek için kullanılan bir programlama dilidir. Bu tür sistemlerde, yararlı işlevsellik bir kullanıcı arayüzü aracılığıyla zaten mevcuttur ve betik dili, bu işlevselliği program denetimine açmak için bir mekanizmadır. Bu biçimde, mevcut sistemin, betik dilinin yeteneklerini tamamlayan bir nesneler ve olanaklar konak ortamı sağladığı söylenir. Bir betik dili, hem profesyonel hem de profesyonel olmayan programcılar tarafından kullanılmak üzere tasarlanmıştır.
ECMAScript başlangıçta, tarayıcılardaki Web sayfalarını canlandırmak ve Web tabanlı istemci-sunucu mimarisinin bir parçası olarak sunucu hesaplaması gerçekleştirmek için bir mekanizma sağlayan bir Web betik dili olarak tasarlanmıştır. ECMAScript artık çeşitli konak ortamları için çekirdek betikleme yetenekleri sağlamak üzere kullanılmaktadır. Bu nedenle çekirdek dil, herhangi bir belirli konak ortamından ayrı olarak bu belgede belirtilmiştir.
ECMAScript kullanımı basit betiklemenin ötesine geçmiş olup, günümüzde birçok farklı ortam ve ölçekte tüm programlama görevleri yelpazesi için kullanılmaktadır. ECMAScript'in kullanımı genişledikçe, sağladığı özellikler ve olanaklar da genişlemiştir. ECMAScript artık tam özellikli, genel amaçlı bir programlama dilidir.
4.1 Web Betikleme
Bir web tarayıcısı, örneğin pencereleri, menüleri, açılır pencereleri, iletişim kutularını, metin alanlarını, çapaları, çerçeveleri, geçmişi, çerezleri ve girdi/çıktıyı temsil eden nesneler dahil olmak üzere, istemci tarafı hesaplama için bir ECMAScript konak ortamı sağlar. Ayrıca, konak ortamı, odak değişimi, sayfa ve resim yükleme, boşaltma, hata ve iptal, seçim, form gönderme ve fare eylemleri gibi olaylara betik kodu bağlama aracı sağlar. Betik kodu HTML içerisinde yer alır ve görüntülenen sayfa, kullanıcı arayüz öğeleri ile sabit ve hesaplanan metin ve resimlerin bir birleşimidir. Betik kodu kullanıcı etkileşimine tepkilidir ve bir ana programa gerek yoktur.
Bir web sunucusu, istekleri, istemcileri ve dosyaları temsil eden nesneler ile verileri kilitleme ve paylaşma mekanizmalarını içeren, sunucu tarafı hesaplama için farklı bir konak ortamı sağlar. Tarayıcı tarafı ve sunucu tarafı betiklemeyi birlikte kullanarak, Web tabanlı bir uygulama için özelleştirilmiş bir kullanıcı arayüzü sağlarken, hesaplamayı istemci ve sunucu arasında dağıtmak mümkündür.
ECMAScript'i destekleyen her Web tarayıcısı ve sunucusu, ECMAScript yürütme ortamını tamamlayan kendi konak ortamını sağlar.
4.2 Konaklar ve Gerçekleştirimler
ECMAScript'in konak ortamlarına entegrasyonuna yardımcı olmak için, bu belirtim, belirli olanakların (örneğin, soyut işlemler) tanımını, bütünüyle veya kısmen, bu belirtimin dışındaki bir kaynağa erteler. Yazımsal olarak, bu belirtim aşağıdaki erteleme türlerini ayırt eder.
Bir gerçekleştirim, Ek D'de sıralanan veya gerçekleştirim tanımlı ya da gerçekleştirim yaklaşık olarak işaretlenen olanakları daha ayrıntılı tanımlayan dış bir kaynaktır. Gayriresmî kullanımda, bir gerçekleştirim, belirli bir web tarayıcısı gibi somut bir ürünü ifade eder.
Gerçekleştirim tanımlı bir olanak, tanımını ek bir niteleme olmaksızın dış bir kaynağa erteleyen olanaktır. Bu belirtim, belirli davranışlar için herhangi bir tavsiyede bulunmaz ve uygun gerçekleştirimler, bu belirtimin ortaya koyduğu kısıtlamalar dahilinde herhangi bir davranışı seçmekte serbesttir.
Gerçekleştirim yaklaşık bir olanak, ideal bir davranış tavsiye ederken tanımını dış bir kaynağa erteleyen olanaktır. Uygun gerçekleştirimler, bu belirtimin ortaya koyduğu kısıtlamalar dahilinde herhangi bir davranışı seçmekte serbest olsalar da, ideale yaklaşmaya gayret etmeleri teşvik edilir. Math.exp gibi bazı matematiksel işlemler gerçekleştirim yaklaşık niteliktedir.
Bir konak, Ek D'de listelenen olanakları daha ayrıntılı tanımlayan, ancak diğer gerçekleştirim tanımlı veya gerçekleştirim yaklaşık olanakları daha ayrıntılı tanımlamayan dış bir kaynaktır. Gayriresmî kullanımda, bir konak, bu belirtimle Ek D aracılığıyla aynı biçimde arayüz oluşturan tüm gerçekleştirimlerin kümesini, örneğin tüm web tarayıcılarının kümesini ifade eder. Bir konak genellikle WHATWG HTML (https://html.spec.whatwg.org/) gibi harici bir belirtimdir. Başka bir deyişle, konak tanımlı olanaklar genellikle harici belirtimlerde daha ayrıntılı olarak tanımlanır.
Bir konak kancası, bütünüyle veya kısmen dış bir kaynak tarafından tanımlanan soyut bir işlemdir. Tüm konak kancaları Ek D'de listelenmelidir. Bir konak kancası en azından aşağıdaki gerekliliklere uymak zorundadır:
- Ya bir normal tamamlanma ya da bir fırlatma tamamlanması döndürmelidir.
Konak tanımlı bir olanak, tanımını ek bir niteleme olmaksızın dış bir kaynağa erteleyen ve Ek D'de listelenen olanaktır. Konak olmayan gerçekleştirimler de konak tanımlı olanaklar için tanımlar sağlayabilir.
Bir konak ortamı, tüm konak tanımlı olanaklar için yapılan belirli bir tanım seçimidir. Bir konak ortamı tipik olarak, küresel nesnenin konak tanımlı özellikleri olarak girdi almayı ve çıktı sağlamayı mümkün kılan nesneleri veya işlevleri içerir.
Bu belirtim, her zaman en özgül terimi kullanma yazımsal kuralını izler. Örneğin, bir olanak konak tanımlı ise, ona gerçekleştirim tanımlı olarak atıfta bulunulmamalıdır.
Hem konaklar hem de gerçekleştirimler, burada tanımlanan dil türleri, belirtim türleri, soyut işlemler, dilbilgisi üretimleri, içkin nesneler ve içkin semboller aracılığıyla bu belirtimle arayüz oluşturabilir.
4.3 ECMAScript Genel Bakışı
Aşağıda, ECMAScript'in gayriresmî bir genel bakışı yer almaktadır—dilin tüm bölümleri açıklanmamaktadır. Bu genel bakış, asıl standardın bir parçası değildir.
ECMAScript nesne tabanlıdır: temel dil ve konak olanakları nesneler tarafından sağlanır ve bir ECMAScript programı, iletişim kuran nesnelerin bir kümesidir. ECMAScript'te bir nesne, her biri, her bir özelliğin nasıl kullanılabileceğini belirleyen nitelikler taşıyan sıfır veya daha fazla özellik topluluğudur—örneğin, bir özelliğin Yazılabilir niteliği false olarak ayarlandığında, çalıştırılan ECMAScript kodunun özelliğe farklı bir değer atamaya yönelik herhangi bir girişimi başarısız olur. Özellikler, diğer nesneleri, ilkel değerleri veya işlevleri tutan kaplardır. Bir ilkel değer, şu yerleşik türlerden birinin üyesidir: Undefined, Null, Boolean, Number, BigInt, String ve Symbol; bir nesne, Object yerleşik türünün üyesidir; ve bir işlev, çağrılabilir bir nesnedir. Bir nesne ile bir özellik aracılığıyla ilişkilendirilmiş işleve yöntem denir.
ECMAScript, ECMAScript varlıklarının tanımını tamamlayan bir yerleşik nesneler topluluğu tanımlar. Bu yerleşik nesneler arasında küresel nesne; Object, Function, Boolean, Symbol ve çeşitli Error nesneleri dahil olmak üzere dilin çalışma zamanı anlambilimi için temel teşkil eden nesneler; Math, Number ve Date dahil olmak üzere sayısal değerleri temsil eden ve işleyen nesneler; metin işleme nesneleri String ve RegExp; öğelerinin tümü belirli bir sayısal veri temsiline sahip olan Array ve dokuz farklı Tipli Dizi türü dahil olmak üzere, değerlerin indisli koleksiyonları olan nesneler; Map ve Set nesneleri dahil olmak üzere anahtarlı koleksiyonlar; JSON nesnesi, ArrayBuffer, SharedArrayBuffer ve DataView dahil olmak üzere yapılandırılmış verileri destekleyen nesneler; üreteç işlevleri ve Promise nesneleri dahil olmak üzere denetim soyutlamalarını destekleyen nesneler; ve Proxy ile Reflect dahil olmak üzere yansıma nesneleri bulunur.
ECMAScript ayrıca bir dizi yerleşik işleç tanımlar. ECMAScript işleçleri arasında çeşitli tek terimli işlemler, çarpımsal işleçler, toplamsal işleçler, bitsel kaydırma işleçleri, ilişkisel işleçler, eşitlik işleçleri, ikili bitsel işleçler, ikili mantıksal işleçler, atama işleçleri ve virgül işleci bulunur.
Büyük ECMAScript programları, bir programın birden çok deyim ve bildirim dizisine bölünmesine olanak tanıyan modüller tarafından desteklenir. Her modül, diğer modüller tarafından sağlanması gereken, kullandığı bildirimleri ve kendi bildirimlerinden hangilerinin diğer modüller tarafından kullanıma açık olduğunu açıkça tanımlar.
ECMAScript sözdizimi bilinçli olarak Java sözdizimine benzer. ECMAScript sözdizimi, kullanımı kolay bir betik dili olarak hizmet etmesini sağlamak için gevşetilmiştir. Örneğin, bir değişkenin türünün bildirilmesi gerekmez, türler özelliklerle ilişkilendirilmez ve tanımlanan işlevlerin bildirimlerinin, onlara yapılan çağrılardan metinsel olarak önce görünmesi gerekmez.
4.3.1 Nesneler
ECMAScript sınıf tanımları için sözdizimi içermesine karşın, ECMAScript nesneleri temel olarak C++, Smalltalk veya Java'dakiler gibi sınıf tabanlı değildir. Bunun yerine nesneler, değişmez gösterim yoluyla veya nesneleri oluşturan ve ardından başlangıç değerlerini özelliklerine atayarak onların tamamını veya bir kısmını ilklendiren kodu çalıştıran oluşturucular aracılığıyla olmak üzere çeşitli yollarla oluşturulabilir. Her oluşturucu, prototip tabanlı kalıtımı ve paylaşımlı özellikleri gerçekleştirmek için kullanılan "prototype" adlı bir özelliğe sahip olan bir işlevdir. Nesneler new ifadelerinde oluşturucular kullanılarak oluşturulur; örneğin, new Date(2009, 11) yeni bir Date nesnesi oluşturur. Bir oluşturucuyu new kullanmadan çağırmanın, oluşturucuya bağlı sonuçları olur. Örneğin, Date() bir nesne yerine geçerli tarih ve saatin bir dizgi temsilini üretir.
Bir oluşturucu tarafından oluşturulan her nesne, oluşturucusunun "prototype" özelliğinin değerine örtük bir başvuru (nesnenin prototipi olarak adlandırılır) taşır. Dahası, bir prototip kendi prototipine null olmayan bir örtük başvuru taşıyabilir ve bu böyle devam eder; buna prototip zinciri denir. Bir nesnede bir özelliğe başvuru yapıldığında, bu başvuru, prototip zincirinde o ada sahip bir özelliği içeren ilk nesnedeki o isimli özelliğe yapılır. Başka bir deyişle, önce doğrudan belirtilen nesne böyle bir özellik için incelenir; eğer o nesne adlandırılmış özelliği içeriyorsa, başvurunun işaret ettiği özellik budur; eğer o nesne adlandırılmış özelliği içermiyorsa, o nesnenin prototipi incelenir; ve bu böyle devam eder.
Şekil 1: Nesne/Prototip İlişkileri
Sınıf tabanlı nesne yönelimli bir dilde, genel olarak, durum örnekler tarafından taşınır, yöntemler sınıflar tarafından taşınır ve kalıtım yalnızca yapı ve davranışa ilişkindir. ECMAScript'te ise durum ve yöntemler nesneler tarafından taşınırken; yapı, davranış ve durumun tümü kalıtılır.
Prototiplerinin içerdiği belirli bir özelliği doğrudan içermeyen tüm nesneler, o özelliği ve değerini paylaşır. Şekil 1 bunu göstermektedir:
CF bir oluşturucudur (ve aynı zamanda bir nesnedir). new ifadeleri kullanılarak beş nesne oluşturulmuştur: cf1, cf2, cf3, cf4 ve cf5. Bu nesnelerin her biri "q1" ve "q2" adlı özellikler içerir. Kesikli çizgiler örtük prototip ilişkisini temsil eder; yani, örneğin, cf3'ün prototipi CFp'dir. Oluşturucu CF, "P1" ve "P2" adlı, CFp, cf1, cf2, cf3, cf4 veya cf5 tarafından görülemeyen iki özelliğe sahiptir. CFp içindeki "CFP1" adlı özellik, CFp'nin örtük prototip zincirinde bulunan ve "q1", "q2" veya "CFP1" adlandırılmamış diğer özellikler gibi, cf1, cf2, cf3, cf4 ve cf5 tarafından paylaşılır (ancak CF tarafından paylaşılmaz). CF ile CFp arasında hiçbir örtük prototip bağlantısı olmadığına dikkat edin.
Çoğu sınıf tabanlı nesne dilinin aksine, özellikler nesnelere değerler atanarak dinamik olarak eklenebilir. Yani, oluşturucuların oluşturulan nesnenin özelliklerinin tümünü veya herhangi birini adlandırması veya onlara değer ataması gerekmez. Yukarıdaki diyagramda, CFp içindeki özelliğe yeni bir değer atayarak cf1, cf2, cf3, cf4 ve cf5 için yeni bir paylaşımlı özellik eklenebilir.
ECMAScript nesneleri doğası gereği sınıf tabanlı olmasa da, oluşturucu işlevleri, prototip nesneleri ve yöntemlerden oluşan ortak bir desene dayalı sınıf benzeri soyutlamalar tanımlamak çoğu zaman uygundur. ECMAScript yerleşik nesnelerinin kendileri de böyle bir sınıf benzeri deseni izler. ECMAScript 2015'ten itibaren, ECMAScript dili, programcıların yerleşik nesneler tarafından kullanılan aynı sınıf benzeri soyutlama desenine uyan nesneleri öz bir biçimde tanımlamalarına olanak tanıyan sözdizimsel sınıf tanımları içerir.
4.3.2 ECMAScript'in Katı Türü
ECMAScript Dili, dilin bazı kullanıcılarının dilde mevcut olan bazı özelliklerin kullanımını kısıtlamak isteyebilecekleri olasılığını tanır. Bunu güvenlik amacıyla, hataya açık olduğunu düşündükleri özelliklerden kaçınmak, gelişmiş hata denetimi elde etmek veya kendi seçtikleri diğer nedenlerle yapabilirler. Bu olasılığı desteklemek üzere, ECMAScript dilin katı bir türünü tanımlar. Dilin katı türü, normal ECMAScript dilinin bazı belirli sözdizimsel ve anlambilimsel özelliklerini dışlar ve bazı özelliklerin ayrıntılı anlambilimini değiştirir. Katı tür ayrıca, dilin katı olmayan biçiminde hata olarak belirtilmeyen durumlarda hata kuraldışı durumları fırlatarak raporlanması gereken ek hata koşullarını belirtir.
ECMAScript'in katı türü yaygın olarak dilin katı kipi olarak anılır. Katı kip seçimi ve ECMAScript'in katı kip sözdizimi ve anlambiliminin kullanımı, 11.2.2'de açıklandığı gibi, bireysel ECMAScript kaynak metin birimleri düzeyinde açıkça yapılır. Katı kip, sözdizimsel bir kaynak metin birimi düzeyinde seçildiğinden, katı kip yalnızca böyle bir kaynak metin birimi içerisinde yerel etkiye sahip kısıtlamalar getirir. Katı kip, ECMAScript anlambiliminin birden çok kaynak metin birimi arasında tutarlı biçimde çalışması gereken herhangi bir yönünü kısıtlamaz veya değiştirmez. Tam bir ECMAScript programı, hem katı kip hem de katı olmayan kip ECMAScript kaynak metin birimlerinden oluşabilir. Bu durumda, katı kip yalnızca katı kip kaynak metin birimi içerisinde tanımlanmış kod fiilen yürütülürken uygulanır.
Bu belirtime uymak için, bir ECMAScript gerçekleştirimi, hem tam kısıtlamasız ECMAScript dilini hem de bu belirtim ile tanımlanan ECMAScript dilinin katı türünü gerçekleştirmelidir. Ek olarak, bir gerçekleştirim, kısıtlamasız ve katı kip kaynak metin birimlerinin tek bir bileşik programda birleştirilmesini desteklemelidir.
4.4 Terimler ve Tanımlar
Bu belgenin amaçları bakımından, aşağıdaki terimler ve tanımlar geçerlidir.
4.4.1 gerçekleştirim yaklaşık
bir gerçekleştirim yaklaşık olanak, bütünüyle veya kısmen dış bir kaynak tarafından tanımlanır ancak bu belirtimde tavsiye edilen, ideal bir davranışa sahiptir
4.4.2 gerçekleştirim tanımlı
bir gerçekleştirim tanımlı olanak, bütünüyle veya kısmen bu belirtimin dışındaki bir kaynak tarafından tanımlanır
4.4.3 konak tanımlı
gerçekleştirim tanımlı ile aynıdır