JavaScript

Vikipedi, özgür ansiklopedi
JavaScript
Unofficial JavaScript logo 2.svg
JavaScript Logosu
JavaScript screenshot.png
JavaScript kaynak kodu ekran görüntüsü
Paradigması Çoklu paradigma: Olaya dayalı programlama, Fonksiyonel programlama, Zorunlu programlama, Nesne yönelimli programlama
İlk çıkışı 4 Aralık 1995 (26 yıl önce) (1995-12-04)[1]
Tasarımcı Başlangıçta Netscape'ten Brendan Eich; diğerleri de ECMAScript standardına katkıda bulunmuştur.
Kararlı sürüm

ECMAScript 2021[2] Edit this on Wikidata

(Haziran 2021 (11 ay önce) (Haziran 2021))
Önizleme sürümü

ECMAScript 2022[3] Edit this on Wikidata

(22 Temmuz 2021 (10 ay önce) (22 Temmuz 2021))
Tip sistemi Dinamik, zayıf, ördek
Önemli uygulamaları V8, JavaScriptCore, SpiderMonkey, Chakra
Etkilendikleri Java,[4][5] Scheme,[5] Self,[6] AWK,[7] HyperTalk[8]
Etkiledikleri ActionScript, AssemblyScript, CoffeeScript, Dart, Haxe, JS++, Objective-J, Opa, TypeScript
Olağan dosya uzantıları
  • .js
  • .cjs
  • .mjs[9]
Web sitesi ecma-international.org/publications-and-standards/standards/ecma-262/

JavaScript [10] (genellikle JS olarak kısaltılır), HTML ve CSS ile birlikte World Wide Web'in temel teknolojilerinden biri olan programlama dilidir . [11] Web sitelerinin %97'sinden fazlası, web sayfası hareketleri için istemci tarafında JavaScript kullanırlar [12] ve kullanılan kodlar genellikle üçüncü taraf kitaplıkları içerir. [13] Tüm büyük web tarayıcılarında, kaynak kodunu kullanıcıların cihazlarında yürütebilmek için özel bir JavaScript motoru bulunur.

JavaScript, ECMAScript standardına uyan, genellikle eş zamanlı olarak derlenmiş, üst düzey bir dildir. [14] Dinamik yazma, prototip tabanlı obje yönelimi ve birinci sınıf işlevlere sahiptir. Olay odaklı, işlevsel ve zorunlu programlama stillerini destekleyen çoklu paradigmadır . Metin, tarihler, düzenli ifadeler, standart veri yapıları ve Belge Obje Modeli (DOM) ile çalışmak için uygulama programlama arayüzlerine (API'ler) sahiptir.

ECMAScript standardı, ağ oluşturma, depolama veya grafik olanakları gibi herhangi bir giriş/çıkış (I/O) içermez. Pratikte, web tarayıcısı veya diğer çalıştırma ortamları, I/O için JavaScript API'leri sağlarlar.

JavaScript motorları başlangıçta yalnızca web tarayıcılarında kullanılıyordu, ancak günümüzde bazı sunucuların ve çeşitli uygulamaların da temel bileşenleridir. Bu kullanım için en popüler çalışma zamanı sistemi Node.js'dir .

Java ve JavaScript'in ad, sözdizimi ve ilgili standart kitaplıklar açısından benzerlikleri olsa da, iki dil birbirinden farklıdır ve tasarım açısından da büyük farklılıklar gösterir.

Tarihçe[değiştir | kaynağı değiştir]

Netscape'te Oluşturma[değiştir | kaynağı değiştir]

Grafik kullanıcı arayüzüne sahip ilk web tarayıcısı Mosaic, 1993 yılında piyasaya sürüldü. Teknik bilgisi olmayan kişilerin erişebildiği, yeni ortaya çıkan World Wide Web'in hızlı büyümesinde önemli bir rol oynamıştır. [15] Mosaic'in önde gelen geliştiricileri daha sonra 1994'te daha parlak bir geleceği olduğu düşünülen Netscape Navigator tarayıcısını piyasaya süren Netscape şirketini kurdular. Netscape Navigator hızla en çok kullanılan tarayıcı haline geldi. [16] [17]

Web'in yeni şekillenmeye başladığı bu yıllarda, web sayfaları yalnızca statik olabilirdi ve sayfa tarayıcıya yüklendikten sonra dinamik davranış yeteneğinden de yoksundu. Gelişen web geliştirme sahnesinde, programlamacıların bu sınırlamanın kaldırılmasına yönelik istekleri vardı, bu nedenle 1995'te Netscape, Navigator'a bir komut dosyası dili eklemeye karar verdi. Bunu başarmak için iki yol izlediler: Java programlama dilini yerleştirmek için Sun Microsystems ile iş birliği yaparken, aynı zamanda Scheme dilini yerleştirmek için de Brendan Eich'i işe aldılar. [5]

Netscape yönetimi kısa süre sonra Eich için en iyi seçeneğin Java'ya benzer ve daha az Scheme veya diğer mevcut komut dosyası dillerine benzeyen yeni bir dil tasarlamak olduğuna karar verdi. [5] Eylül 1995'te Navigator beta'nın bir parçası olarak ilk sunulduğunda, eklenen yeni dil ve yorumlayıcı uygulaması LiveScript olarak adlandırılsa da, Aralık ayında resmi sürüm için adı JavaScript olarak değiştirildi. [5] [18]

JavaScript adının seçimi, doğrudan Java ile ilgili olduğu imâ edilerek kafa karışıklığına neden oldu. O zamanlar dot-com balonu patlamıştı ve Java henüz yeni bir programlama dili idi, bu nedenle Eich, JavaScript adını Netscape'in bir pazarlama taktiği olarak gördü. [19]

Microsoft tarafından benimsenmesi[değiştir | kaynağı değiştir]

Microsoft, 1995 yılında Internet Explorer'ı piyasaya sürerek Netscape ile bir tarayıcı savaşına yol açtı. JavaScript cephesinde, Microsoft, JScript adlı kendi yorumlayıcısını oluşturmak için Navigator yorumlayıcısında tersine mühendislik yaptı. [20]

JScript ilk olarak 1996'da, CSS için ilk ve HTML uzantıları ile birlikte piyasaya sürüldü. Bu uygulamaların her biri, Navigator'daki benzerlerinden belirgin şekilde farklıydı. [21] [22] Bu farklılıklar, geliştiricilerin web sitelerinin her iki tarayıcıda da sağlıklı şekilde çalışmasını zorlaştırdı ve birkaç yıl boyunca "En iyi Netscape'te görüntülenir" ve "En iyi Internet Explorer'da görüntülenir" şeklinde logoların yaygın olarak kullanılmasına yol açtı. [21] [23]

JScript'in yükselişi[değiştir | kaynağı değiştir]

Kasım 1996'da Netscape, JavaScript'i Ecma International'a tüm tarayıcı satıcılarının uyabileceği standart bir belirtimin başlangıç noktası olarak sundu. Bu, Haziran 1997'de ilk ECMAScript dil spesifikasyonunun resmî olarak yayınlanmasına yol açtı.

Standartlar süreci, ECMAScript 2'nin Haziran 1998'de ve ECMAScript 3'ün Aralık 1999'da piyasaya sürülmesiyle birkaç yıl boyunca devam etti. ECMAScript 4 üzerindeki çalışmalar ise 2000 yılında başladı. [20]

Bu arada Microsoft, tarayıcı pazarında giderek daha baskın bir konuma geldi. 2000'lerin başında, Internet Explorer'ın pazar payı %95'e ulaştı. [24] Bu durum, JScript'in Web'de istemci tarafı komut dosyası oluşturmak için gerçek bir standart haline geldiği anlamını taşıyordu.

Microsoft başlangıçta standartlar sürecine katıldı ve bazı önerileri kendi JScript dilinde uyguladı, ancak sonunda Ecma çalışması üzerinde iş birliğini durdurdu. Böylece ECMAScript 4 yenilmiş oldu.

Büyüme ve standardizasyon[değiştir | kaynağı değiştir]

2000'lerin başında Internet Explorer'ın hakimiyeti döneminde, istemci tarafı komut dosyası oluşturma yöntemi oldukça durgundu. Bu, Netscape'in halefi Mozilla'nın Firefox tarayıcısını piyasaya sürdüğü 2004 yılında değişmeye başladı. Firefox birçok kişi tarafından iyi bir şekilde karşılandı ve Internet Explorer'dan önemli bir pazar payını kendisine aldı. [25]

2005 yılında Mozilla, ECMA International'a katıldı ve ECMAScript for XML (E4X) standardı üzerinde çalışmaya başladı. Bu, Mozilla'nın bir ECMAScript 4 taslağına dayanan ActionScript 3 dilinde E4X'i uygulayan Macromedia (daha sonra Adobe Systems tarafından satın alındı) ile ortak olarak çalışmasına yol açtı. Hedef, ActionScript 3'ü yeni ECMAScript 4 olarak standart hale getirmekti. Bu amaçla Adobe Systems, Tamarin uygulamasını açık kaynaklı bir proje olarak yayınladı. Ancak, Tamarin ve ActionScript 3, yerleşik istemci tarafı komut dosyası oluşturmaktan çok farklıydı ve Microsoft'un iş birliği olmadan, ECMAScript 4 hiçbir zaman istenen sonuçları vermedi.

Bu arada, ECMA çalışmasına bağlı olmayan açık kaynak topluluklarında çok önemli gelişmeler yaşanıyordu. 2005'te Jesse James Garrett, Ajax terimini türettiği ve verilerin arka planda yüklenebileceği web uygulamaları oluşturmak için JavaScript'in omurgası olduğu bir dizi teknolojiyi tanımladığı ve tam sayfa gereksinimini ortadan kaldırdığı bir WhiteBook yayınladı. Bu, açık kaynak kitaplıkların ve onların etrafında oluşan toplulukların öncülük ettiği bir JavaScript rönesans dönemini ateşledi. jQuery, Prototype, Dojo Toolkit ve MooTools dâhil olmak üzere birçok yeni kitaplık oluşturuldu.

Google, Chrome tarayıcısını 2008'de rakiplerinden daha hızlı olan V8 JavaScript motoruyla piyasaya sürdü. [26] [27] En önemli yenilik tam zamanında derlemeydi (JIT), [28] bu nedenle diğer tarayıcı satıcılarının motorlarını JIT için elden geçirmeleri gerekiyordu. [29]

Temmuz 2008'de, bu farklı taraflar Oslo'da bir konferans için bir araya geldi. Bu birleşme, konuyla ilgili tüm çalışmaları birleştirmek ve dili ileriye taşımak için 2009 başlarında nihai anlaşmaya yol açtı. Sonucu ise Aralık 2009'da yayınlanan ECMAScript 5 standardıydı.

Olgunluğa ulaşması[değiştir | kaynağı değiştir]

Dil üzerinde iddialı çalışmalar birkaç yıl boyunca devam etti ve 2015 yılında ECMAScript 6'nın yayınlanmasıyla resmîleştirilen kapsamlı bir ekleme ve iyileştirme koleksiyonuyla sonuçlandı. [30]

Node.js'nin 2009 yılında Ryan Dahl tarafından oluşturulması, JavaScript'in web tarayıcıları dışında kullanımında önemli bir artışa yol açtı. Node, V8 motorunu, bir olay döngüsünü ve I/O API'lerini birleştirerek bağımsız bir JavaScript çalışma zamanı sistemi sağlamaktaydı. 2018 itibarıyla, Node milyonlarca geliştirici tarafından kullanılıyordu [31] ve npm dünyadaki herhangi bir paket yöneticisinden çok daha fazla modüle sahipti. [32]

ECMAScript taslak belirtimi şu anda GitHub'da herkese açık bir şekilde korunmaktadır ve sürümler düzenli şekilde yıllık anlık görüntüler aracılığıyla üretilmektedir. [33] Dildeki olası revizyonlar, kapsamlı bir teklif süreciyle incelenir. [34] [35] Artık, sürüm numaraları yerine geliştiriciler, gelecek özelliklerin durumunu tek tek kontrol etmektedirler. [33]

Mevcut JavaScript ekosisteminde bulunan birçok kitaplık ve çerçevenin, bazıları yerleşik programlama uygulamaları ve web tarayıcılarının dışında JavaScript'in farklı kullanım alanları için oluşturulmuştur. Ayrıca, tek sayfalık uygulamaların ve diğer JavaScript ağırlıklı web sitelerinin artmasıyla birlikte, geliştirme sürecine yardımcı olmak için birkaç aktarıcı da oluşturulmuştur. [36]

Ticari Marka[değiştir | kaynağı değiştir]

"JavaScript" adı, Oracle Corporation'ın Amerika Birleşik Devletleri'ndeki ticari markasıdır . [37] [38]

Web sitesi istemci tarafı kullanımı[değiştir | kaynağı değiştir]

JavaScript, web sitelerinin % 97'sinin bu amaçla kullandığı, Web'in baskın istemci tarafı komut dosyası dilidir. [12] Komut dosyaları HTML belgelerine gömülür veya bunlar da dâhil edilmiş olur. Böylelikle kodlar DOM ile etkileşime girer. Tüm büyük web tarayıcılarında, kodu kullanıcının cihazında yürüten yerleşik bir JavaScript motoru bulunur.

Komut dosyasıyla yazılmış davranış örnekleri[değiştir | kaynağı değiştir]

Kitaplıklar ve çerçeveler[değiştir | kaynağı değiştir]

Web sitelerinin %80'inden fazlası, istemci tarafı komut dosyası oluşturma için bir üçüncü taraf JavaScript kitaplığı veya web çerçevesi kullanırlar. [13]

jQuery, web sitelerinin %75'inden fazlası tarafından kullanılan açık ara en popüler kitaplıktır. [13] Facebook, web sitesi için React kitaplığını oluşturdu ve daha sonra bunu açık kaynak olarak yayınladı; Twitter dâhil diğer pek çok site günümüzde bunu kullanmaktadır. Aynı şekilde Google'ın YouTube ve Gmail'i de dâhil olmak üzere web siteleri için oluşturduğu Angular çerçevesi artık başkaları tarafından kullanılabilen açık kaynaklı bir projedir. [13]

Buna karşılık, "Vanilla JS" terimi, herhangi bir kitaplık veya çerçeve kullanmayan, bunun yerine tamamen standart JavaScript işlevselliğine dayanan web siteleri için oluşturulmuştur. [39]

Diğer kullanımları[değiştir | kaynağı değiştir]

JavaScript kullanımı, web tarayıcısı köklerinin ötesine geçmiştir. JavaScript motorları artık hem sunucu tarafı web sitesi dağıtımları hem de tarayıcı dışı uygulamalar için çeşitli diğer yazılım sistemlerine yerleştirilmiştir.

Sunucu tarafı JavaScript kullanımını teşvik etmeye yönelik ilk girişimler, Netscape Enterprise Server ve Microsoft'un Internet Information Services [40] [41] idi, ancak bunlar küçük özelliklerdi. [42] Sunucu tarafı kullanımı, 2000'lerin sonlarında Node.js ve diğer yaklaşımların oluşturulmasıyla birlikte büyümeye başladı. [42]

Electron, Cordova, React Native ve diğer uygulama çerçeveleri, JavaScript'te uygulanan davranışla birçok uygulama oluşturmak için kullanılmıştır. Tarayıcı olmayan diğer uygulamalar, PDF belgelerini komut dosyası yazmak için Adobe Acrobat desteği [43] ve JavaScript ile yazılmış GNOME Shell uzantılarını içerir. [44]

JavaScript, son zamanlarda bazı gömülü sistemlerde, genellikle Node.js'den yararlanılarak görünmeye başladı. [45] [46] [47]

Özellikler[değiştir | kaynağı değiştir]

Aşağıdaki özellikler, aksi açıkça belirtilmediği sürece, uyumlu tüm ECMAScript uygulamaları için ortaktır.

Zorunlu ve yapılandırılmış[değiştir | kaynağı değiştir]

JavaScript, C'nin yapılandırılmış programlama sözdiziminin çoğunu destekler (örneğin, if ifadeleri, while döngüleri, switch ifadeleri, do while döngüleri vb. ). Kısmi bir istisna kapsam belirlemedir : başlangıçta JavaScript yalnızca var ile işlev kapsamına sahipti; daha sonra ECMAScript 2015'te let ve const anahtar sözcükleriyle blok kapsamı eklendi. C gibi, JavaScript de expressionslar ve statementslar arasında bir ayrım yapar. C'den bir sözdizimsel farkı da, noktalı virgüllerin (deyimleri sonlandıran) atlanmasına izin veren otomatik noktalı virgül eklemedir. [48]

Zayıf yazılmış[değiştir | kaynağı değiştir]

JavaScript zayıf yazılmıştır, bu kullanılan işleme bağlı olarak belirli türlerin dolaylı olarak yayınlandığı anlamına gelir. [49]

  • İkili + operatörü, her iki işlenen de sayı olmadığı sürece her iki işleneni de bir dizeye atar. Bunun nedeni, toplama operatörünün bir birleştirme operatörü olarak da kullanılmasından dolayıdır.
  • İkili - işleci her zaman her iki işleneni de bir sayıya atar
  • Her iki birli operatör ( +, - ) işleneni her zaman bir sayıya çevirir.

Değerler aşağıdaki gibi dizgelere dönüştürülür: [49]

  • Dizeler olduğu gibi bırakılır
  • Sayılar dize temsillerine dönüştürülür
  • Dizilerin öğeleri dizelere dönüştürülür ve ardından virgül ( , ) ile birleştirilirler.
  • Diğer objeler [object Object] dizesine dönüştürülür; burada Object, objenin yapıcısının adıdır

Değerler, dizelere dönüştürülerek ve ardından dizeler de sayılara dönüştürülerek, sayılara dönüştürülür. Bu süreçler, sırasıyla dize ve sayı dökümü için prototip üzerinde toString ve valueOf işlevleri tanımlanarak değiştirilebilir.

JavaScript, kuralların karmaşıklığı tutarsızlıkla karıştırılabileceğinden, bu dönüşümleri uygulama şekli nedeniyle eleştiriler almıştır. [50] [49] Örneğin, bir dizeye sayı eklerken, sayı birleştirme yapılmadan önce bir dizeye dönüştürülür, ancak bir dizeden bir sayı çıkarılırken, çıkarma işlemi yapılmadan önce dize bir sayıya dönüştürülür.

JavaScript türü dönüşümleri
Sol İşleyici Operatör Sağ İşleyici Sonuç
[] (boş dizi) + [] (boş dizi) "" (boş dize)
[] (boş dizi) + {} (boş obje) "[object Object]" (dize)
false (boole) + [] (boş dizi) "false" (dize)
"123" (dize) + 1 (sayı) "1231" (dize)
"123" (dize) - 1 (sayı) 122 (sayı)
"123" (dize) - "abc" (dize) NaN (sayı)

Genellikle, {} + [] ile sonuçlanan 0 (sayı) da belirtilir. Bu yanıltıcıdır: {} boş bir obje yerine boş bir kod bloğu olarak yorumlanır ve boş dizi kalan unary + operatörü tarafından bir sayıya dönüştürülür. İfadeyi parantez içine alırsanız ({} + []) küme parantezleri boş bir obje olarak yorumlanır ve ifadenin sonucu beklendiği gibi "[object Object]" olur. [49]

Dinamik[değiştir | kaynağı değiştir]

Yazım
JavaScript, diğer çoğu betik dili gibi dinamik olarak yazılır . Bir tür, bir ifade yerine bir değerle ilişkilendirilir. Örneğin, başlangıçta bir sayıya bağlı olan bir değişken, bir dizgeye yeniden atanabilir. [51] JavaScript, ördek yazımı dâhil, objelerin türünü test etmenin çeşitli yollarını destekler. [52]
Çalışma zamanı değerlendirmesi
JavaScript, çalışma zamanında dizeler olarak sağlanan ifadeler eval bir değerlendirme işlevi içerir.

Nesne (Obje) yönelimi (prototip tabanlı)[değiştir | kaynağı değiştir]

JavaScript'teki prototip kalıtım, Douglas Crockford tarafından şu şekilde tanımlanır: EKSİK ALAN JavaScript'te bir obje, bir prototiple büyütülmüş bir ilişkisel dizidir (aşağıya bakın); her anahtar bir objenin özelliği için ad sağlar ve böyle bir adı belirtmenin iki sözdizimsel yolu vardır: nokta notasyonu ( obj.x = 10 ) ve parantez gösterimi ( obj['x'] = 10 ). Bir özellik, çalışma zamanında eklenebilir, geri tepebilir veya silinebilir. Bir objenin çoğu özelliği (ve bir objenin prototip miras zincirine ait olan herhangi bir özellik), bir for...in döngüsü kullanılarak numaralandırılabilir.

Prototipler
JavaScript, diğer birçok nesne yönelimli dilin kalıtım için sınıfları kullandığı prototipleri kullanır. [53] JavaScript'te prototiplerle birçok sınıf tabanlı özelliği simüle etmek mümkündür. [54]
Obje oluşturucu olarak fonksiyonlar
Fonksiyonlar, tipik rolleriyle birlikte obje oluşturucular olarak ikiye ayrılır. Bir fonksiyon çağrısına new ile önek eklemek, yapıcıdan özellikleri ve yöntemleri ( Object prototipinden özellikler dâhil) devralan bir prototip örneği oluşturur. [55] ECMAScript 5, Object prototipinden otomatik olarak miras alınmadan bir örneğin açık bir şekilde oluşturulmasına izin veren Object.create yöntemini sunar (eski ortamlar prototipi null öğesine atayabilir). [56] prototype özelliği, yeni objenin dâhili prototipi için kullanılan objeyi belirler. Yapıcı olarak kullanılan fonksiyonun prototipi değiştirilerek yeni yöntemler eklenebilir. JavaScript'in Array veya Object gibi yerleşik oluşturucuları da değiştirilebilen prototiplere sahiptir. Object prototipini değiştirmek mümkün olsa da, JavaScript'teki çoğu obje, Object prototipinden yöntemleri ve özellikleri devralacağından ve prototipin değiştirilmesini beklemeyebileceğinden, genellikle kötü uygulama olarak kabul edilirler. [57]
Metod olarak fonksiyonlar
Birçok nesne yönelimli dilden farklı olarak, işlev tanımı ile metot tanımı arasında bir ayrım yoktur. Bunun yerine, fonksiyon çağrısı sırasında ayrım oluşur; Bir fonksiyon, bir objenin metodu olarak çağrıldığında, fonksiyonun yerel this anahtar sözcüğü, o çağrı için o objeye bağlanır.

Fonksiyonel[değiştir | kaynağı değiştir]

Bir fonksiyon birinci sınıftır ; bir fonksiyon bir obje olarak kabul edilir. [58] Bu nedenle, bir fonksiyonun .call() ve .bind() gibi özellikleri ve metodlarıı olabilir. [59] İç içe fonksiyon, başka bir fonksiyon içinde tanımlanan bir fonksiyondur. Dış fonksiyon her çağrıldığında oluşturulur. Ek olarak, iç içe geçmiş her işlev sözcüksel bir kapanış oluşturur: dış işlevin sözcüksel kapsamı (herhangi bir sabit, yerel değişken veya bağımsız değişken değeri dâhil), dış işlevin yürütülmesi sona erdikten sonra bile, her bir iç fonksiyon objesinin iç durumunun bir parçası haline gelir. . [52] JavaScript ayrıca anonim işlevleri de destekler.

Yetkilendirme[değiştir | kaynağı değiştir]

JavaScript, örtük ve açık yetkilendirmeyi destekler.

Rol olarak fonksiyonlar [Özellikler (Traits) ve Karışımlar (Mixins)]
JavaScript, Traits [60] ve Mixins gibi Rol modellerinin çeşitli fonksiyon tabanlı uygulamalarını da yerel olarak destekler. Böyle bir fonksiyon, function gövdesi içinde this anahtar sözcüğüne bağlı en az bir yöntemle ek davranışı tanımlar. Daha sonra bir Rol, call yoluyla açıkça devredilmeli veya prototip zinciri aracılığıyla paylaşılmayan ek davranışlara sahip olması gereken objelere apply (uygulama) edilmelidir.
Obje kompozisyonu ve kalıtım
Açık fonksiyon tabanlı yetkilendirme JavaScript'te kompozisyonu kapsarken, örtük yetkilendirme, örneğin, bir objeyle ilgili olabilecek ancak doğrudan bir objeye ait olmayan bir metot bulmak için prototip zinciri her yürüdüğünde zaten gerçekleşir. Metot bulunduğunda, bu objenin bağlamında çağrılır. Bu nedenle JavaScript'teki kalıtım, yapıcı fonksiyonların prototip özelliğine bağlı bir yetkilendirme otomatizmi tarafından kapsanır.

Çeşitli[değiştir | kaynağı değiştir]

JS sıfır indeksli bir dildir.

Çalışma zamanı ortamı
JavaScript, komut dosyalarının ortamla etkileşime girebileceği objeler ve metotlar (örneğin, bir web sayfası DOM u) sağlamak için tipik olarak bir çalışma zamanı ortamına (örneğin bir web tarayıcısı ) dayanır. Bu ortamlar tek iş parçacıklıdır . JavaScript ayrıca, komut dosyalarını (örneğin, HTML <script> öğeleri) dahil etme/içe aktarma yeteneği sağlamak için çalışma zamanı ortamına da güvenir. Bu, başlı başına bir dil özelliği değildir, ancak çoğu JavaScript uygulamasında yaygındır. JavaScript, bir kuyruktan gelen mesajları birer birer işler. JavaScript, her yeni mesajla ilişkili bir fonksiyonu çağırır ve fonksiyonun bağımsız değişkenleri ve yerel değişkenlerle bir çağrı yığını (call stack) çerçevesi oluşturur. Çağrı yığını, fonksiyonun ihtiyaçlarına göre küçülür veya büyür. Fonksiyon tamamlandıktan sonra çağrı yığını boş olduğunda, JavaScript sıradaki bir sonraki mesaja ilerler. Buna olay döngüsü (event loop) denir ve "tamamlanmak için çalıştır" olarak tanımlanır, çünkü her mesaj bir sonraki mesaj dikkate alınmadan önce tamamen işlenir. Ancak, dilin eşzamanlılık modeli, olay döngüsünü engellemeyen olarak tanımlar: program girişi/çıkışı, olaylar ve geri arama işlevleri (callback fonksiyon) kullanılarak gerçekleştirilir. Bu, JavaScript'in bir veritabanı sorgusunun bilgi döndürmesini beklerken bir fare tıklamasını işleyebileceği anlamına gelir. [61]
Değişken (Varyadik) fonksiyonlar
Bir fonksiyona sınırsız sayıda parametre iletilebilir. Fonksiyon bunlara biçimsel parametreler aracılığıyla ve ayrıca yerel arguments objesi aracılığıyla erişebilir. bind yöntemi kullanılarak değişken fonksiyonlar da oluşturulabilir.
Dizi ve obje değişmezleri (literal)
Birçok komut dosyası dili gibi, diziler ve objeler (diğer dillerdeki ilişkisel diziler ) kısa bir kısayol sözdizimi ile oluşturulabilir. Aslında, bu değişmez değerler JSON veri formatının temelini oluşturur.
Düzenli ifadeler (Regular expressions)
JavaScript ayrıca, yerleşik dize işlevlerinden daha karmaşık olan metin işleme için özlü ve güçlü bir sözdizimi sağlayan Perl'e benzer şekilde düzenli ifadeleri de destekler. [62]
Sözler (Promise) ve zaman uyumsuz/bekleme (Async/await)
JavaScript, zaman uyumsuz işlemleri işlemek için promise ları ve Async/await destekler. Yerleşik bir Promise objesi, vaatleri işlemek ve işleyicileri eşzamansız bir eylemin nihai sonucuyla ilişkilendirmek için işlevsellik sağlar. Son zamanlarda, geliştiricilerin birden çok JavaScript promise ını birleştirmesine ve farklı senaryolara dayalı işlemler yapmasına olanak tanıyan JavaScript belirtiminde birleştirici yöntemler tanıtıldı. Tanıtılan yöntemler şunlardır: Promise.race, Promise.all, Promise.allSettled ve Promise.any. Zaman uyumsuz/bekleme, eşzamansız, engellemesiz bir işlevin sıradan bir eşzamanlı işleve benzer bir şekilde yapılandırılmasına izin verir. Asenkron, bloke edici olmayan kod, minimum ek yük ile geleneksel senkronize, bloke edici koda benzer şekilde yapılandırılabilir.

Standart olmayan özellikler[değiştir | kaynağı değiştir]

Tarihsel olarak, bazı JavaScript motorları bu standart olmayan özellikleri destekledi:

  • koşullu catch cümleleri (Java gibi)
  • Dizi kavrayışları (array comprehensions) ve üreteç ifadeleri (Python gibi)
  • kısa fonksiyon ifadeleri ( function(args) expr ; bu deneysel sözdizimi ok işlevlerinden önce gelir)
  • ECMAScript for XML (E4X), ECMAScript'e yerel XML desteği ekleyen bir uzantı (sürüm 21 [63] den beri Firefox'ta desteklenmemektedir)

Sözdizimi[değiştir | kaynağı değiştir]

Basit örnekler[değiştir | kaynağı değiştir]

JavaScript'teki değişkenler, var, [64] let [65] veya const [66] anahtar kelimeleri kullanılarak tanımlanabilir.

// 'x' adında bir fonksiyon kapsamlı (scoped) değişken bildirir ve buna üstü kapalı şekilde 
// 'undefined' özel değerini atar. Değeri olmayan değişkenler otomatik undefined olarak ayarlanır.

var x;

// Değişkenler, bunun gibi elle 'tanımsız' olarak ayarlanabilir 
var x2 = undefined;

// "y" adında blok kapsamlı bir değişken bildirir ve onu dolaylı olarak "tanımsız" olarak ayarlar. "let" anahtar sözcüğü ECMAScript 2015'te tanıtıldı. 
// Declares a block-scoped variable named `y`, and implicitly sets it to
// `undefined`. The `let` keyword was introduced in ECMAScript 2015.
let y;

// Declares a block-scoped, un-reassignable variable named `z`, and sets it to
// a string literal. The `const` keyword was also introduced in ECMAScript 2015,
// and must be explicitly assigned to.

// The keyword `const` means constant, hence the variable cannot be reassigned
// as the value is `constant`.
const z = "this value cannot be reassigned!";

// Declares a variable named `myNumber`, and assigns a number literal (the value
// `2`) to it.
let myNumber = 2;

// Reassigns `myNumber`, setting it to a string literal (the value `"foo"`).
// JavaScript is a dynamically-typed language, so this is legal.
myNumber = "foo";

Yukarıdaki örnekte, hepsinin önünde iki eğik çizgi bulunan yorumlara dikkat edin. JavaScript'te yerleşik Giriş/Çıkış (I/O) işlevi yoktur; çalışma zamanı ortamı bunu sağlar. Sürüm 5.1'deki ECMAScript belirtimi şunları belirtir: [67]

aslında, bu spesifikasyonda harici veri girişi veya hesaplanan sonuçların çıkışı için herhangi bir şart yoktur.

Ancak, çoğu çalışma zamanı ortamında çıktı yazdırmak için kullanılabilecek bir console objesi [68] bulunur. İşte JavaScript'te minimalist bir Hello World programı :

console.log("Hello, World!");

HTML belgelerinde bir çıktı için bu program gereklidir:

// Text nodes can be made using the "write" method
document.write('foo');

// Elements can be made too. First, they have to be created in the DOM
const myElem = document.createElement('span');

// Attributes like classes and the id can be set as well
myElem.classList.add('foo');
myElem.id = 'bar';

// For here, the attribute will look like this: <span data-attr="baz"></span>
myElem.setAttribute('data-atrr', 'baz');

// Finally append it as a child element to the <body> in the HTML
document.body.appendChild(myElem);

// Elements can be imperitavely grabbed with querySelector for one element, or querySelectorAll for multiple elements that can be loopped with forEach
document.querySelector('.class');
document.querySelector('#id');
document.querySelector('[data-other]');
document.querySelectorAll('.multiple');

Basit bir özyinelemeli (recursive) fonksiyon:

function factorial(n) {
  if (n === 0)
    return 1; // 0! = 1

  return n * factorial(n - 1);
}

factorial(3); // returns 6

Anonim bir fonksiyon (veya lambda):

let counter = function() {
  let count = 0;
  return ++count;
};

let x = counter();
x() // returns 1
x() // returns 2
x() // returns 3

Bu örnek, JavaScript'te fonksiyon kapanışlarının yerel olmayan değişkenlerini başvuru yoluyla yakaladığını gösterir.

Ok işlevleri ilk olarak 6. Baskı - ECMAScript 2015'te tanıtıldı. JavaScript'te işlev yazmak için sözdizimini kısaltırlar. Ok işlevleri anonimdir, bu nedenle oluşturulduktan sonra onları çağırmak için bunlara başvurmak için bir değişken gerekir.

Ok işlevi (arrow fonksiyon) örneği:

// Arrow functions let us omit the `function` keyword.
// Here `long_example` points to an anonymous function value.
const long_example = (input1, input2) => {
  console.log("Hello, World!");
  const output = input1 + input2;

  return output;
};

// If there are no braces, the arrow function simply returns the expression
// So here it's (input1 + input2)
const short_example = (input1, input2) => input1 + input2;

long_example(2, 3); // Prints "Hello, World!" and returns 5
short_example(2, 5); // Returns 7

// If an arrow function only has one parameter, the parentheses can be removed.
const no_parentheses = input => input + 2;

no_parentheses(3); // Returns 5

JavaScript'te objeler, fonskiyonlarla aynı şekilde oluşturulur; bu nedenle ojbeler bir fonksiyon objesi olarak bilinirler. Obje örneği:

function Ball(r) {
  this.radius = r; // the "r" argument is local to the ball object
  this.area = Math.PI * (r ** 2); // parentheses don't do anything but clarify

  // objects can contain functions ("method")
  this.show = function() {
    drawCircle(this.radius); // references another function (that draws a circle)
  };
}

let myBall = new Ball(5); // creates a new instance of the ball object with radius 5
myBall.radius++; // object properties can usually be modified from the outside
myBall.show(); // using the inherited "show" function

Değişken fonksiyon gösterimi ( arguments özel bir değişkendir ): [69]

function sum() {
  let x = 0;

  for (let i = 0; i < arguments.length; ++i)
    x += arguments[i];

  return x;
}

sum(1, 2); // returns 3
sum(1, 2, 3); // returns 6

Anında çağrılan fonksiyon ifadeleri genellikle kapanışları (closures) oluşturmak için kullanılır. Kapanışlar, özelliklerin (properties) ve metotların bir ad alanında (namespace) toplanmasına ve bazılarının özel hale getirilmesine izin verir:

let counter = (function() {
  let i = 0; // private property

  return {  // public methods
    get: function() {
      alert(i);
    },
    set: function(value) {
      i = value;
    },
    increment: function() {
      alert(++i);
    }
  };
})(); // module

counter.get();   // shows 0
counter.set(6);
counter.increment(); // shows 7
counter.increment(); // shows 8

JavaScript'te modülleri dışa ve içe aktarma [70] Export örneği:

/* mymodule.js */
// This function remains private, as it is not exported
let sum = (a, b) => {
  return a + b;
}

// Export variables
export let name = 'Alice';
export let age = 23;

// Export named functions
export function add(num1, num2) {
  return num1 + num2;
}

// Export class
export class Multiplication {
  constructor(num1, num2) {
    this.num1 = num1;
    this.num2 = num2;
  }

  add() {
    return sum(this.num1, this.num2);
  }
}

İmport örneği:

Daha gelişmiş örnek[değiştir | kaynağı değiştir]

/* Finds the lowest common multiple (LCM) of two numbers */
function LCMCalculator(x, y) { // constructor function
    const checkInt = function(x) { // inner function
        if (x % 1 !== 0)
            throw new TypeError(x + "is not an integer"); // var a =  mouseX

        return x;
    };

    this.a = checkInt(x)
    //   semicolons   ^^^^  are optional, a newline is enough
    this.b = checkInt(y);
}
// The prototype of object instances created by a constructor is
// that constructor's "prototype" property.
LCMCalculator.prototype = { // object literal
    constructor: LCMCalculator, // when reassigning a prototype, set the constructor property appropriately
    gcd: function() { // method that calculates the greatest common divisor
        // Euclidean algorithm:
        let a = Math.abs(this.a), b = Math.abs(this.b), t;

        if (a < b) {
            // swap variables
            // t = b; b = a; a = t;
            [a, b] = [b, a]; // swap using destructuring assignment (ES6)
        }

        while (b !== 0) {
            t = b;
            b = a % b;
            a = t;
        }

        // Only need to calculate GCD once, so "redefine" this method.
        // (Actually not redefinition—it's defined on the instance itself,
        // so that this.gcd refers to this "redefinition" instead of LCMCalculator.prototype.gcd.
        // Note that this leads to a wrong result if the LCMCalculator object members "a" and/or "b" are altered afterwards.)
        // Also, 'gcd' === "gcd", this['gcd'] === this.gcd
        this['gcd'] = function() {
            return a;
        };

        return a;
    },

    // Object property names can be specified by strings delimited by double (") or single (') quotes.
    "lcm": function() {
        // Variable names do not collide with object properties, e.g., |lcm| is not |this.lcm|.
        // not using |this.a*this.b| to avoid FP precision issues
        let lcm = this.a / this.gcd() * this.b;

        // Only need to calculate lcm once, so "redefine" this method.
        this.lcm = function() {
            return lcm;
        };

        return lcm;
    },

    // Methods can also be declared using es6 syntax
    toString() {
        // Using both es6 template literals and the (+) operator to concatenate values
        return `LCMCalculator: a = ${this.a}, b = ` + this.b;
    }
};

// Define generic output function; this implementation only works for Web browsers
function output(x) {
    document.body.appendChild(document.createTextNode(x));
    document.body.appendChild(document.createElement('br'));
}

// Note: Array's map() and forEach() are defined in JavaScript 1.6.
// They are used here to demonstrate JavaScript's inherent functional nature.
[
    [25, 55],
    [21, 56],
    [22, 58],
    [28, 56]
].map(function(pair) { // array literal + mapping function
    return new LCMCalculator(pair[0], pair[1]);
}).sort((a, b) => a.lcm() - b.lcm()) // sort with this comparative function; => is a shorthand form of a function, called "arrow function"
    .forEach(printResult);

function printResult(obj) {
    output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());
}

Tarayıcı penceresinde aşağıdaki çıktı görüntülenmelidir.

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56
LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168
LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275
LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

Güvenlik[değiştir | kaynağı değiştir]

JavaScript ve DOM, kötü niyetli yazarlara Web aracılığıyla bir istemci bilgisayarda çalıştırılacak komut dosyaları sunma potansiyeli sağlar. Tarayıcı yazarları, iki kısıtlama kullanarak bu riski en aza indirir. İlk olarak, komut dosyaları, dosya oluşturma gibi genel amaçlı programlama görevlerini değil, yalnızca Web ile ilgili eylemleri gerçekleştirebilecekleri bir sanal alanda çalışır. İkinci olarak, komut dosyaları aynı kaynak ilkesiyle sınırlandırılmıştır: bir Web sitesindeki komut dosyaları, başka bir siteye gönderilen kullanıcı adları, parolalar veya tanımlama bilgileri gibi bilgilere erişemez. JavaScript ile ilgili güvenlik hatalarının çoğu, aynı kaynak politikasının veya sanal alanın ihlali ile gerçekleşmektedir.

Genel JavaScript'in alt kümeleri (ADsafe, Secure ECMAScript (SES)), özellikle üçüncü taraflarca oluşturulan kodlarda (reklamlar gibi) daha yüksek düzeyde güvenlik sağlar. [71] [72] Closure Toolkit, üçüncü taraf JavaScript ve HTML'nin güvenli bir şekilde yerleştirilmesi ve yalıtılması için başka bir projedir. [73]

İçerik Güvenliği Politikası, bir Web sayfasında yalnızca güvenilir kodun yürütülmesini sağlamanın ana yöntemi ve amacıdır.

Siteler arası güvenlik açıkları[değiştir | kaynağı değiştir]

JavaScript ile ilgili yaygın bir güvenlik sorunu, aynı kaynak ilkesinin ihlali olan siteler arası komut dosyası çalıştırmadır (XSS). XSS güvenlik açıkları, bir saldırgan çevrimiçi bankacılık web sitesi gibi hedeflenen bir Web sitesinin kurbana sunulan web sayfasına kötü amaçlı bir komut dosyası eklemesine neden olduğunda ortaya çıkar. Bu örnekteki komut dosyası daha sonra kurbanın ayrıcalıklarıyla bankacılık uygulamasına erişebilir, potansiyel olarak gizli bilgileri ifşa edebilir veya kurbanın izni olmadan para transfer edebilir. XSS güvenlik açıklarına bir çözüm, güvenilmeyen verileri görüntülerken HTML çıkışını kullanmaktır.

Bazı tarayıcılar, saldırganın kötü amaçlı komut dosyası içeren bir URL sağladığında yansıyan XSS saldırılarına karşı kısmi koruma içerir. Ancak, bu tarayıcıların kullanıcıları bile, kötü amaçlı kodun bir veritabanında depolandığı saldırılar gibi diğer XSS saldırılarına karşı savunmasızdır. Yalnızca sunucu tarafında Web uygulamalarının doğru tasarımı XSS'yi tamamen önleyebilir.

Tarayıcı yazarlarının uygulama hataları nedeniyle de XSS güvenlik açıkları oluşabilir. [74]

Bir başka siteler arası güvenlik açığı, siteler arası istek sahteciliğidir (CSRF). CSRF'de, bir saldırganın sitesindeki kod, kurbanın tarayıcısını, kullanıcının hedef sitede amaçlamadığı eylemleri gerçekleştirmesi için kandırır (bir bankada para transferi gibi). Hedef siteler, istek doğrulaması için yalnızca tanımlama bilgilerine güvendiğinde, saldırganın sitesindeki koddan kaynaklanan istekler, başlatan kullanıcının aynı geçerli oturum açma bilgilerini taşıyabilir. Genel olarak, CSRF'nin çözümü, kalıcı etkileri olabilecek herhangi bir isteğin kimliğini doğrulamak için yalnızca çerezlerde değil, gizli bir form alanında bir kimlik doğrulama değeri talep etmektir. HTTP Yönlendiren başlığını kontrol etmek de yardımcı olabilir.

"JavaScript ele geçirme", bir saldırganın sitesindeki <script> etiketinin, kurbanın sitesinde JSON veya JavaScript gibi özel bilgiler döndüren bir sayfadan yararlandığı bir CSRF saldırısı türüdür. Olası çözümler şunları içerir:

  • özel bilgi döndüren herhangi bir yanıt için POST ve GET parametrelerinde bir kimlik doğrulama belirteci eklemek.

Müşteriye duyulan yanlış güven[değiştir | kaynağı değiştir]

İstemci-sunucu uygulamalarının geliştiricileri, güvenilmeyen istemcilerin saldırganların denetimi altında olabileceğini bilmelidir. Uygulama yazarı, JavaScript kodunun amaçlandığı gibi (veya hiç) çalışacağını varsayamaz çünkü koda gömülü herhangi bir sır, belirli bir düşman tarafından ayıklanabilir. Bazı çıkarımlar şunlardır:

  • Web sitesi yazarları, ham kaynak kodunun istemciye gönderilmesi gerektiğinden JavaScript'lerinin nasıl çalıştığını tam olarak gizleyemezler. Kod gizlenebilir, ancak şaşırtma tersine mühendislikle yapılabilir.
  • JavaScript form doğrulaması güvenlik değil, yalnızca kullanıcılar için kolaylık sağlar. Bir site, kullanıcının hizmet şartlarını kabul ettiğini doğrularsa veya yalnızca sayı içermesi gereken alanlardan geçersiz karakterleri filtrelerse, bunu yalnızca istemcide değil sunucuda yapmalıdır.
  • Komut dosyaları seçici olarak devre dışı bırakılabilir, bu nedenle bir görüntüyü kaydetmek için sağ tıklamak gibi işlemleri önlemek için JavaScript'e güvenilemez. [75]
  • Bir saldırgan tarafından ayıklanabileceğinden, şifreler gibi hassas bilgileri JavaScript'e gömmek çok kötü bir uygulama olarak kabul edilir. [76]

Geliştiricilere yuaulan ynlış güven[değiştir | kaynağı değiştir]

Npm ve Bower gibi paket yönetim sistemleri, JavaScript geliştiricileri arasında popülerdir. Bu tür sistemler, bir geliştiricinin, programlarının diğer geliştiricilerin program kitaplıklarına olan bağımlılıklarını kolayca yönetmesine izin verir. Geliştiriciler, kitaplıkların koruyucularının onları güvenli ve güncel tutacağına güvenirler, ancak bu her zaman böyle değildir. Bu kör güven nedeniyle bir güvenlik açığı ortaya çıktı. Güvenilir kitaplıklar, kitaplıklara dayanan tüm programlarda hataların veya güvenlik açıklarının ortaya çıkmasına neden olan yeni sürümlere sahip olabilir. Yani bir kitaplık vahşi doğada bilinen güvenlik açıklarıyla yamasız kalabilir. 133 bin web sitesi örneği incelenmiş bir çalışmada, araştırmacılar web sitelerinin %37'sinin bilinen en az bir güvenlik açığına sahip bir kitaplık içerdiğini buldu. [77] "Her web sitesinde kullanılan en eski kütüphane sürümü ile bu kütüphanenin mevcut en yeni sürümü arasındaki ortalama gecikme, ALEXA'da 1.177 gündür ve halen aktif olarak kullanılan bazı kütüphanelerin geliştirilmesi yıllar önce durduruldu." [77] Başka bir olasılık, bir kütüphanenin yöneticisinin kütüphaneyi tamamen kaldırabilmesidir. Bu, Mart 2016'da Azer Koçulu'nun deposunu npm'den kaldırmasıyla meydana geldi. Bu, kütüphanelerine bağlı on binlerce programın ve web sitesinin bozulmasına neden oldu. [78]

Tarayıcı ve eklenti kodlama hataları[değiştir | kaynağı değiştir]

JavaScript, bazıları arabellek taşmaları gibi kusurlara sahip olabilen çok çeşitli tarayıcı yetenekleri için bir arabirim sağlar. Bu kusurlar, saldırganların kullanıcının sisteminde istedikleri herhangi bir kodu çalıştıracak komut dosyaları yazmasına izin verebilir. Bu kod hiçbir şekilde başka bir JavaScript uygulamasıyla sınırlı değildir. Örneğin, arabellek taşması istismarı, bir saldırganın süper kullanıcı ayrıcalıklarıyla işletim sisteminin API'sine erişmesine izin verebilir.

Bu kusurlar Firefox, Internet Explorer, [79] ve Safari gibi büyük tarayıcıları etkilemiştir.

Video oynatıcılar, Adobe Flash ve Microsoft Internet Explorer'da varsayılan olarak etkinleştirilen çok çeşitli ActiveX denetimleri gibi eklentiler, JavaScript aracılığıyla yararlanılabilen kusurlara da sahip olabilir (bu tür kusurlardan geçmişte yararlanılmıştır).

Windows Vista'da Microsoft, Internet Explorer işlemini sınırlı ayrıcalıklarla çalıştırarak arabellek taşmaları gibi hata risklerini kontrol altına almaya çalışmıştır. [80] Google Chrome benzer şekilde sayfa oluşturucularını kendi " sandbox "larıyla sınırlar.

Korumalı alan uygulama hataları[değiştir | kaynağı değiştir]

Web tarayıcıları, örneğin dosya oluşturmak veya silmek için gerekli ayrıcalıklarla birlikte JavaScript'i sanal alanın dışında çalıştırabilir. Bu tür ayrıcalıkların Web'den koda verilmesi amaçlanmamıştır.

Web'den JavaScript'e yanlış ayrıcalıklar verilmesi, hem Internet Explorer hem de Firefox'taki güvenlik açıklarında rol oynamıştır. Windows XP Service Pack 2'de Microsoft, Internet Explorer'da JScript'in ayrıcalıklarını düşürmüştür. [81]

Microsoft Windows, bir bilgisayarın sabit sürücüsündeki JavaScript kaynak dosyalarının genel amaçlı, korumalı alanda olmayan programlar olarak başlatılmasına izin verir (bkz: Windows Komut Dosyası Ana Bilgisayarı ). Bu, JavaScript'i ( VBScript gibi) bir Truva atı için teorik olarak uygun bir vektör yapar, ancak JavaScript Truva atları pratikte nadirdir. [82] 

Donanım açıkları[değiştir | kaynağı değiştir]

2015 yılında, güvenlik araştırmacıları tarafından bir makalede, bir Rowhammer saldırısının JavaScript tabanlı bir kavram kanıtı uygulaması açıklanmıştır. [83] [84] [85]

2017 yılında, tarayıcı üzerinden JavaScript tabanlı bir saldırının ASLR'yi atlayabileceği gösterildi. Buna "ASLR⊕Cache" veya AnC denir.

2018'de Intel ve diğer işlemcilerde Spekülatif Yürütmeye karşı Spectre saldırılarını açıklayan makale bir JavaScript uygulamasını içeriyordu.

Geliştirme araçları[değiştir | kaynağı değiştir]

Önemli araçlar dil ile birlikte gelişmiştir.

İlgili teknolojiler[değiştir | kaynağı değiştir]

Java[değiştir | kaynağı değiştir]

Yaygın bir yanılgı, JavaScript'in Java ile aynı olduğuna yöneliktir. Her ikisinin de gerçekten de C-benzeri bir sözdizimi vardır (C dili onların en yakın ortak ata dilidir). Ayrıca, genellikle korumalı alana alınırlar (bir tarayıcı içinde kullanıldığında) ve JavaScript, Java'nın sözdizimi ve standart kitaplığı göz önünde bulundurularak tasarlanmıştır. Özellikle, tüm Java anahtar sözcükleri orijinal JavaScript'te ayrılmıştır, JavaScript'in standart kitaplığı Java'nın adlandırma kurallarını takip eder ve JavaScript'in ​Math​ ve ​Date​ objeleri Java 1.0'dan alınan sınıflara dayanır. [88]

Java ve JavaScript ilk olarak 1995'te ortaya çıktı, ancak Java Sun Microsystems'den James Gosling ve JavaScript ise Netscape Communications'dan Brendan Eich tarafından geliştirildi.

İki dil arasındaki farklılıklar benzerliklerinden daha belirgindir. Java'nın statik yazımı vardır, JavaScript'in yazımı ise dinamiktir . Java, derlenmiş bayt kodundan yüklenirken JavaScript, insan tarafından okunabilir kaynak kodu olarak yüklenir. Java'nın objeleri sınıf tabanlıdır, JavaScript'ler ise prototip tabanlıdır . Son olarak, Java, Java 8'e kadar işlevsel programlamayı desteklemezken, JavaScript, Scheme'den etkilenerek bunu başından beri yapmıştır.

JSON[değiştir | kaynağı değiştir]

JSON veya JavaScript Object Notation, JavaScript'in obje değişmez sözdiziminin bir alt kümesi olarak tanımlanan genel amaçlı bir veri değişim biçimidir.

WebAssembly[değiştir | kaynağı değiştir]

2017'den beri web tarayıcıları, bir JavaScript motorunun web sayfası komut dosyalarının performans açısından kritik bölümlerini yerel hıza yakın yürütmesini sağlayan ikili bir biçim olan WebAssembly'yi desteklemektedir. [89] WebAssembly kodu, normal JavaScript koduyla aynı sanal alanda çalışır.

asm.js, WebAssembly'nin öncüsü olarak hizmet veren bir JavaScript alt kümesidir. [90]

Aktarıcılar (Transpilers)[değiştir | kaynağı değiştir]

JavaScript, Web'in baskın istemci tarafı dilidir ve birçok web sitesi komut dosyası ağırlıklıdır. Bu nedenle, geliştirme sürecine yardımcı olabilecek diğer dillerde yazılmış kodu dönüştürmek için aktarıcılar oluşturulmuştur. [36]

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
  2. ^ "ECMAScript® 2021 language specification". Haziran 2021. Erişim tarihi: 27 Temmuz 2021. 
  3. ^ https://tc39.es/ecma262/; erişim tarihi: 27 Temmuz 2021; isim ya da eserin dili: İngilizce; yayın tarihi: 22 Temmuz 2021.
  4. ^ Seibel, Peter (16 Eylül 2009). Coders at Work: Reflections on the Craft of Programming. ISBN 9781430219484. 24 Aralık 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 25 Aralık 2018. Eich: The immediate concern at Netscape was it must look like Java. 
  5. ^ a b c d e "Chapter 4. How JavaScript Was Created". speakingjs.com. 27 Şubat 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Kasım 2017. 
  6. ^ "Popularity – Brendan Eich". 3 Temmuz 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Mart 2022. 
  7. ^ "Brendan Eich: An Introduction to JavaScript, JSConf 2010". YouTube. s. 22m. 29 Ağustos 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 25 Kasım 2019. Eich: "function", eight letters, I was influenced by AWK. 
  8. ^ Eich, Brendan (1998). "Foreword". Goodman, Danny (Ed.). JavaScript Bible (3rd bas.). John Wiley & Sons. ISBN 0-7645-3188-3. LCCN 97078208. OCLC 38888873. OL 712205M. 
  9. ^ "nodejs/node-eps". GitHub. 29 Ağustos 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Temmuz 2018. 
  10. ^ "JavaScript". Dictionary.com. 9 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Ağustos 2021. 
  11. ^ JavaScript: the definitive guide (İngilizce). Beijing; Farnham: O'Reilly. 18 Nisan 2011. s. 1. ISBN 978-1-4493-9385-4. OCLC 686709345. 14 Şubat 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Mart 2022. JavaScript is part of the triad of technologies that all Web developers must learn: HTML to specify the content of web pages, CSS to specify the presentation of web pages, and JavaScript to specify the behavior of web pages. 
  12. ^ a b "Usage statistics of JavaScript as client-side programming language on websites". w3techs.com. 13 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Nisan 2021. 
  13. ^ a b c d "Usage statistics of JavaScript libraries for websites". w3techs.com. 23 Eylül 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Nisan 2021. 
  14. ^ "ECMAScript® 2020 Language Specification". 8 Mayıs 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2020. 
  15. ^ "Bloomberg Game Changers: Marc Andreessen". Bloomberg. 17 Mart 2011. 16 Mayıs 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Aralık 2011. 
  16. ^ "The Evolution of the Web Browsers". Monmouth Web Developers. 31 Ağustos 2018. 31 Ağustos 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 31 Ağustos 2018. 
  17. ^ "Learn the History of Web Browsers". washingtonindependent.com. 31 Ağustos 2018. 3 Aralık 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 31 Ağustos 2018. 
  18. ^ "TechVision: Innovators of the Net: Brendan Eich and JavaScript". 8 Şubat 2008 tarihinde kaynağından arşivlendi. 
  19. ^ Brendan Eich – CEO of Brave, 17 Haziran 2016, 10 Şubat 2019 tarihinde kaynağından arşivlendi, erişim tarihi: 7 Şubat 2018 
  20. ^ a b "Chapter 5. Standardization: ECMAScript". speakingjs.com. 1 Kasım 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 Kasım 2021. 
  21. ^ a b "JavaScript, How Did We Get Here?". oreilly.com. 6 Nisan 2001. 19 Temmuz 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Temmuz 2016. 
  22. ^ "Microsoft Internet Explorer 3.0 Beta Now Available". microsoft.com. Microsoft. 29 Mayıs 1996. 24 Kasım 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Temmuz 2016. 
  23. ^ "The Unwelcome Return of "Best Viewed with Internet Explorer"". technologizer.com. 16 Eylül 2010. 23 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Temmuz 2016. 
  24. ^ Baker (24 Kasım 2004). "Mozilla Firefox Internet Browser Market Share Gains to 7.4%". Search Engine Journal. 7 Mayıs 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  25. ^ Weber (9 Mayıs 2005). "The assault on software giant Microsoft". BBC News. 25 Eylül 2017 tarihinde kaynağından arşivlendi. 
  26. ^ "Big browser comparison test: Internet Explorer vs. Firefox, Opera, Safari and Chrome". PC Games Hardware. Computec Media AG. 3 Temmuz 2009. 1 Mayıs 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Haziran 2010. 
  27. ^ "Lifehacker Speed Tests: Safari 4, Chrome 2". Lifehacker. 11 Haziran 2009. 14 Nisan 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  28. ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog". 4 Aralık 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Temmuz 2020. 
  29. ^ "Mozilla asks, 'Are we fast yet?'". Wired. 22 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Ocak 2019. 
  30. ^ "ECMAScript 6: New Features: Overview and Comparison". es6-features.org. 18 Mart 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Mart 2018. 
  31. ^ "The secret history behind the success of npm and Node". TheServerSide. 19 Temmuz 2018. 2 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 Ağustos 2021. 
  32. ^ "State of the Union: npm". Linux.com. 13 Ocak 2017. 2 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 Ağustos 2021. 
  33. ^ a b "JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16". The New Stack. 4 Mayıs 2016. 16 Ocak 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Ocak 2021. 
  34. ^ "The TC39 Process". tc39.es. Ecma International. 7 Şubat 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Ocak 2021. 
  35. ^ "ECMAScript proposals". TC39. 4 Aralık 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 15 Ocak 2021. 
  36. ^ a b "List of languages that compile to JS". GitHub. 31 Ocak 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Şubat 2020. 
  37. ^ "U.S. Trademark Serial No. 75026640". United States Patent and Trademark Office. 13 Temmuz 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  38. ^ "Legal Notices". Oracle Corporation. 5 Haziran 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  39. ^ "Vanilla JS". vanilla-js.com. 16 Haziran 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Haziran 2020. 
  40. ^ "Server-Side JavaScript Guide". Oracle Corporation. 11 Aralık 1998. 11 Mart 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  41. ^ "Introducing JScript .NET". Microsoft Developer Network. Microsoft. 14 Temmuz 2000. 10 Kasım 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 10 Nisan 2018. [S]ince the 1996 introduction of JScript version 1.0 ... we've been seeing a steady increase in the usage of JScript on the server—particularly in Active Server Pages (ASP) 
  42. ^ a b "Server-Side JavaScript, Back with a Vengeance". readwrite.com. 17 Aralık 2009. 17 Haziran 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Temmuz 2016. 
  43. ^ "JavaScript for Acrobat". 7 Ağustos 2009 tarihinde kaynağından arşivlendi. Erişim tarihi: 18 Ağustos 2009. 
  44. ^ "Answering the question: "How do I develop an app for GNOME?"". 11 Şubat 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Şubat 2013. 
  45. ^ "Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel". 26 Mayıs 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  46. ^ "Node.js Raspberry Pi GPIO Introduction". 13 Ağustos 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Mayıs 2020. 
  47. ^ "Espruino – JavaScript for Microcontrollers". 1 Mayıs 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Mayıs 2020. 
  48. ^ JavaScript: The Definitive Guide: The Definitive Guide. "O'Reilly Media, Inc.". 17 Ağustos 2006. s. 16. ISBN 978-0-596-55447-7. 1 Ağustos 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mart 2019. 
  49. ^ a b c d "JavaScript quirks in one image from the Internet". The DEV Community (İngilizce). 28 Ekim 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Ekim 2019. 
  50. ^ "Wat". www.destroyallsoftware.com. 28 Ekim 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Ekim 2019. 
  51. ^ "JavaScript data types and data structures – JavaScript | MDN". Developer.mozilla.org. 16 Şubat 2017. 14 Mart 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2017. 
  52. ^ a b Flanagan 2006.
  53. ^ "Inheritance and the prototype chain". Mozilla Developer Network. Mozilla. 25 Nisan 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Nisan 2013. 
  54. ^ Effective JavaScript. Addison-Wesley. 2013. s. 83. ISBN 978-0-321-81218-6. 
  55. ^ Eloquent JavaScript. No Starch Press. 2011. ss. 95-97. ISBN 978-1-59327-282-1. 
  56. ^ "Understanding "Prototypes" in JavaScript". 12 Ağustos 2011. 5 Nisan 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Nisan 2013. 
  57. ^ Effective JavaScript. Addison-Wesley. 2013. ss. 125-127. ISBN 978-0-321-81218-6. 
  58. ^ "Function – JavaScript". MDN Web Docs (İngilizce). 30 Ekim 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ekim 2021. 
  59. ^ "Properties of the Function Object". Es5.github.com. 28 Ocak 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 26 Mayıs 2013. 
  60. ^ "Home | CocktailJS". Cocktailjs.github.io. 4 Şubat 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2017. 
  61. ^ "Concurrency model and Event Loop". Mozilla Developer Network. 5 Eylül 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Ağustos 2015. 
  62. ^ Eloquent JavaScript. No Starch Press. 2011. ss. 139-149. ISBN 978-1-59327-282-1. 
  63. ^ "E4X – Archive of obsolete content | MDN". Mozilla Developer Network. Mozilla Foundation. 14 Şubat 2014. 24 Temmuz 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Temmuz 2014. 
  64. ^ "var – JavaScript – MDN". The Mozilla Developer Network. 23 Aralık 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Aralık 2012. 
  65. ^ "let". MDN web docs. Mozilla. 28 Mayıs 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 27 Haziran 2018. 
  66. ^ "const". MDN web docs. Mozilla. 28 Haziran 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 27 Haziran 2018. 
  67. ^ "ECMAScript Language Specification – ECMA-262 Edition 5.1". Ecma International. 26 Kasım 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Aralık 2012. 
  68. ^ "console". Mozilla Developer Network. Mozilla. 28 Şubat 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Nisan 2013. 
  69. ^ "arguments". Mozilla Developer Network. Mozilla. 13 Nisan 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Nisan 2013. 
  70. ^ "Import & Export Modules in javascript". Learnersbucket.com. 23 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 23 Nisan 2019. 
  71. ^ "Making JavaScript Safe for Advertising". ADsafe. 6 Temmuz 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mayıs 2021. 
  72. ^ "Secure ECMA Script (SES)". 15 Mayıs 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: 26 Mayıs 2013. 
  73. ^ "Google Caja Project". Google. 22 Ocak 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Temmuz 2021. 
  74. ^ "Mozilla Cross-Site Scripting Vulnerability Reported and Fixed – MozillaZine Talkback". Mozillazine.org. 22 Ağustos 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2017. 
  75. ^ "Right-click "protection"? Forget about it". 17 Haziran 2008. ISSN 1797-1993. 9 Ağustos 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: 17 Haziran 2008. 
  76. ^ "Why You Should Never Put Sensitive Data in Your JavaScript". ServiceObjects Blog. ServiceObjects. 3 Haziran 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Haziran 2019. 
  77. ^ a b "Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web" (PDF). Proceedings 2017 Network and Distributed System Security Symposium. 21 Aralık 2016. doi:10.14722/ndss.2017.23414. ISBN 978-1-891562-46-4. 29 Mart 2017 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 22 Şubat 2017. 
  78. ^ Collins (27 Mart 2016). "How one programmer broke the internet by deleting a tiny piece of code". Quartz. 22 Şubat 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: 22 Şubat 2017. 
  79. ^ "Buffer-overflow bug in IE". CNET. 19 Ağustos 1998. 25 Aralık 2002 tarihinde kaynağından arşivlendi. 
  80. ^ "Protected Mode in Vista IE7 – IEBlog". Blogs.msdn.com. 9 Şubat 2006. 23 Ocak 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: 24 Şubat 2017. 
  81. ^ "Part 5: Enhanced Browsing Security". Microsoft Docs. Changes to Functionality in Windows XP Service Pack 2. 9 Ağustos 2004. 20 Ekim 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Ekim 2021. 
  82. ^ For one example of a rare JavaScript Trojan Horse, see Symantec Corporation, JS. 22 Ağustos 2011 tarihinde WebCite sitesinde arşivlendi
  83. ^ Jean-Pharuns (30 Temmuz 2015). "Rowhammer.js Is the Most Ingenious Hack I've Ever Seen". Motherboard. Vice. 27 Ocak 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 26 Ocak 2018. 
  84. ^ "DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript". Ars Technica. 4 Ağustos 2015. 27 Ocak 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 26 Ocak 2018. 
  85. ^ "Rowhammer security exploit: Why a new security attack is truly terrifying". slate.com. 28 Temmuz 2015. 30 Temmuz 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Temmuz 2015. 
  86. ^ "Benchmark.js". benchmarkjs.com. 19 Aralık 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Kasım 2016. 
  87. ^ "JSBEN.CH Performance Benchmarking Playground for JavaScript". jsben.ch. 27 Şubat 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Ağustos 2021. 
  88. ^ "Popularity". 3 Nisan 2008. 3 Temmuz 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Ocak 2012. 
  89. ^ "Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine". Visual Studio Magazine. 10 Şubat 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 9 Şubat 2018. 
  90. ^ "frequently asked questions". asm.js. 4 Haziran 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 13 Nisan 2014. 

Dış bağlantılar[değiştir | kaynağı değiştir]