JavaScript: Revizyonlar arasındaki fark

Vikipedi, özgür ansiklopedi
[kontrol edilmiş revizyon][kontrol edilmiş revizyon]
İçerik silindi İçerik eklendi
düz. Python
Sadece örneklerin içlerinin Türkçeleştirilmesi kalmış. Taşımak için sorun değil.
Etiketler: Ücretsiz blog veya wiki bağlantısı içeren madde Anlam ayrımı bağlantıları nowiki içeriyor
1. satır: 1. satır:
{{farklı anlam|ECMAScript ve betik dili|Java programlama dili|Java (programlama dili)}}
{{Karıştırma|Java (programlama dili)|Javanese script|ECMAScript}}
{{Yönlendirme|.js|Internet Explorer'da kullanılan Microsoft diyalekti|JScript}}
{{Selfref|JavaScript'in Wikipedia'daki kullanımları için bkz. [[Vikipedi:Kullanıcı betikleri|Vikipedi:JavaScript]]}}
{{Programlama dili bilgi kutusu
{{Programlama dili bilgi kutusu
| ad = JavaScript
| ad = JavaScript
| logo = [[Dosya:Unofficial JavaScript logo 2.svg|70px]]
| logo = [[Dosya:Unofficial JavaScript logo 2.svg|225px]] <br>JavaScript Logosu<br>[[Dosya:JavaScript screenshot.png|225px]]
| altyazı =
| altyazı = JavaScript kaynak kodu ekran görüntüsü
| paradigması = çok paradigmalı: [[betik dili|betik]], [[prototip tabanlı programlama|prototip tabanlı]], [[zorunlu programlama|zorunlu]], [[fonksiyonel programlama|fonksiyonel]]
| paradigması = [[Programlama paradigması|Çoklu paradigma]]: [[Olaya dayalı programlama]], [[Fonksiyonel programlama]], [[Zorunlu programlama]], [[Nesne yönelimli programlama]]
| çıkış_tarihi = {{start date and age|1995|12|4}}<ref name="press_release">[https://web.archive.org/web/20070916144913/https://wp.netscape.com/newsref/pr/newsrelease67.html Press release announcing JavaScript], "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995</ref>
| çıkış_tarihi = {{Açılış tarihi ve yaşı|1995|5}}
| tasarımcısı = [[Brendan Eich]]
| tasarımcısı = Başlangıçta [[Netscape]]'ten [[Brendan Eich]]; diğerleri de [[ECMAScript]] standardına katkıda bulunmuştur.
| geliştiricisi = [[Netscape|Netscape Communications Corporation]], [[Mozilla Foundation]]
| geliştiricisi =
| en_son_sürüm = {{wikidata|property|edit|reference|P548=Q2804309|P348}}
| en_son_sürüm = ECMAScript 6<ref>{{Web kaynağı | url = http://www.ecma-international.org/publications/standards/Ecma-262.htm | başlık = Standard ECMA-262 | yayıncı = Ecma International | tarih = 17 Haziran 2015 | arşivurl = https://web.archive.org/web/20151230125157/http://www.ecma-international.org/publications/standards/Ecma-262.htm | arşivtarihi = 30 Aralık 2015 | erişimtarihi = 28 Haziran 2015 | ölüurl = hayır }}</ref>
| en_son_sürüm_tarihi = {{Açılış tarihi ve yaşı|2015|6|17}}
| en_son_sürüm_tarihi = {{start date and age|{{wikidata|qualifier|single|P548=Q2804309|P348|P577}}}}
| en_son_önizleme_sürümü =
| en_son_önizleme_sürümü = {{wikidata|property|edit|reference|P548=Q51930650|P348}}
| en_son_önizleme_sürümü_tarihi =
| en_son_önizleme_sürümü_tarihi = {{start date and age|{{wikidata|qualifier|single|P548=Q51930650|P348|P577}}}}
| en_son_test_sürümü =
| en_son_test_sürümü =
| en_son_test_sürümü_tarihi =
| en_son_test_sürümü_tarihi =
| tip_sistemi = [[dinamik tipleme|dinamik]], [[zayıf tipleme|zayıf]], [[ördek tipleme|ördek]]
| tip_sistemi = [[Tip sistemi|Dinamik]], [[Güçlü ve zayıf yazım|zayıf]], [[Duck Typing|ördek]]
| uygulamaları = [[KJS (KDE)|KJS]], [[Rhino (JavaScript motoru)|Rhino]], [[SpiderMonkey]], [[V8]], [[WebKit]]
| uygulamaları = [[V8]], [[WebKit|JavaScriptCore]], [[SpiderMonkey]], [[Chakra (JScript motoru)|Chakra]]
| lehçeleri =
| lehçeleri =
| etkilendikleri = [[Java (programming language)|Java]],<ref name="looklikejava">{{cite book|title=Coders at Work: Reflections on the Craft of Programming|isbn=9781430219484|quote="Eich: The immediate concern at Netscape was it must look like Java."|url=https://books.google.com/books?id=nneBa6-mWfgC&q=The+immediate+concern+at+Netscape+was+it+must+look+like+Java.&pg=PA141|access-date=December 25, 2018|last1=Seibel|first1=Peter|date=September 16, 2009|archive-date=December 24, 2020|archive-url=https://web.archive.org/web/20201224233514/https://books.google.com/books?id=nneBa6-mWfgC&q=The+immediate+concern+at+Netscape+was+it+must+look+like+Java.&pg=PA141|url-status=live}}</ref><ref name="origin"/> [[Scheme (programming language)|Scheme]],<ref name="origin"/> [[Self (programming language)|Self]],<ref>{{Cite web|url=https://brendaneich.com/2008/04/popularity/|title = Popularity – Brendan Eich}}</ref> [[AWK]],<ref>{{cite web|title=Brendan Eich: An Introduction to JavaScript, JSConf 2010|website=[[YouTube]]|quote="Eich: "function", eight letters, I was influenced by AWK."|url=https://www.youtube.com/watch?v=1EyRscXrehw|access-date=November 25, 2019|page=22m|archive-date=August 29, 2020|archive-url=https://web.archive.org/web/20200829024704/https://www.youtube.com/watch?v=1EyRscXrehw|url-status=live}}</ref> [[HyperTalk]]<ref>{{cite book |last=Eich |first=Brendan |authorlink1=Brendan Eich |chapter=Foreword |editor1-last=Goodman |editor1-first=Danny |editor1-link=Danny Goodman |year=1998 |title=JavaScript Bible |edition=3rd |publisher=[[John Wiley & Sons]] |isbn=0-7645-3188-3 |lccn=97078208 |oclc=38888873 |ol=712205M |url-access=registration |url=https://archive.org/details/javascriptbible000good}}</ref>
| etkilendikleri = [[C (programlama dili)|C]], [[Scheme]], [[Java (programlama dili)|Java]], [[Perl]], [[Python]], [[Self]]
| etkiledikleri = [[JScript]], [[JScript .NET]], [[Objective-J]], TIScript
| etkiledikleri = [[ActionScript]], [[AssemblyScript]], [[CoffeeScript]], [[Dart (programming language)|Dart]], [[Haxe]], [[JS++]], [[Objective-J]], [[Opa (programming language)|Opa]], [[TypeScript]]
| programlama_dili =
| programlama_dili =
| platformu =
| platformu =
| işletim_sistemi =
| işletim_sistemi =
| lisansı =
| lisansı =
| dosya_uzantısı = .js
| dosya_uzantısı = {{flatlist|
* <code>.js</code>
| websitesi =
* <code>.cjs</code>
* <code>.mjs</code><ref name="node.js ECMAScript Modules Specification">{{cite web|url=https://github.com/nodejs/node-eps/blob/master/002-es-modules.md|title=nodejs/node-eps|website=GitHub|access-date=2018-07-05|archive-date=2020-08-29|archive-url=https://web.archive.org/web/20200829024713/https://github.com/nodejs/node-eps/blob/master/002-es-modules.md|url-status=live}}</ref>
}}
| websitesi = {{URL|www.ecma-international.org/publications-and-standards/standards/ecma-262/}}
| ailesi =
| ailesi =
}}
}}
'''JavaScript''', yaygın olarak [[Web tarayıcısı|web tarayıcılarında]] kullanılmakta olan dinamik bir programlama dilidir. JavaScript ile yazılan [[istemci tarafı betik]]ler sayesinde tarayıcının kullanıcıyla etkileşimde bulunması, tarayıcının kontrol edilmesi, asenkron bir şekilde sunucu ile iletişime geçilmesi ve web sayfası içeriğinin değiştirilmesi gibi işlevler sağlanır. JavaScript, Node.js gibi platformlar sayesinde sunucu tarafında da yaygın olarak kullanılmaktadır.


'''JavaScript''' <ref>{{Web kaynağı|url=https://www.dictionary.com/browse/javascript|başlık=JavaScript|erişimtarihi=August 9, 2021|arşivtarihi=August 9, 2021|arşivurl=https://web.archive.org/web/20210809164119/https://www.dictionary.com/browse/javascript|çalışma=Dictionary.com}}</ref> (genellikle '''JS''' olarak kısaltılır), [[HTML]] ve [[CSS]] ile birlikte [[World Wide Web|World Wide Web'in]] temel teknolojilerinden biri olan [[Programlama dili|programlama dilidir]] . <ref>{{Kitap kaynağı|url=https://www.worldcat.org/title/javascript-the-definitive-guide/oclc/686709345?referer=br&ht=edition|başlık=JavaScript: the definitive guide|tarih=18 April 2011|dil=English|sayfa=1|yer=Beijing; Farnham|yayıncı=O'Reilly|alıntı=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.|isbn=978-1-4493-9385-4|oclc=686709345}}</ref> [[İnternet sitesi|Web sitelerinin]] %97'sinden fazlası, [[web sayfası]] hareketleri için [[istemci]] tarafında JavaScript kullanırlar <ref name="deployedstats">{{Web kaynağı|url=https://w3techs.com/technologies/details/cp-javascript/|başlık=Usage statistics of JavaScript as client-side programming language on websites|erişimtarihi=2021-04-09|arşivtarihi=2021-08-13|arşivurl=https://web.archive.org/web/20210813192940/https://w3techs.com/technologies/details/cp-javascript/|çalışma=w3techs.com}}</ref> ve kullanılan kodlar genellikle üçüncü taraf [[Kütüphane (bilgisayar bilimi)|kitaplıkları]] içerir. <ref name="lib_usage">{{Web kaynağı|url=https://w3techs.com/technologies/overview/javascript_library|başlık=Usage statistics of JavaScript libraries for websites|erişimtarihi=2021-04-09|arşivtarihi=2018-09-23|arşivurl=https://web.archive.org/web/20180923232220/https://w3techs.com/technologies/overview/javascript_library/all|çalışma=w3techs.com}}</ref> Tüm büyük [[Web tarayıcısı|web tarayıcılarında]], [[Kaynak kodu|kaynak kodunu]] [[Kullanıcı|kullanıcıların]] cihazlarında yürütebilmek için özel bir [[JavaScript motoru]] bulunur.
JavaScript [[Prototip tabanlı programlama|prototip-tabanlı]], [[tür sistemi|dinamik türlere]] ve [[birinci sınıf fonksiyon|birinci-sınıf fonksiyonlara]] sahip bir [[betik dil]]idir. [[Nesne yönelimli]], [[imperatif (programlama)|imperatif]] ve [[Fonksiyonel programlama|fonksiyonel]] programlama prensiplerine sahiptir.


JavaScript, [[ECMAScript]] standardına uyan, genellikle [[JIT|eş zamanlı olarak derlenmiş]], [[Üst düzey programlama dili|üst düzey]] bir dildir. <ref name="tc39">{{Web kaynağı|url=https://tc39.es/ecma262/#sec-overview|başlık=ECMAScript® 2020 Language Specification|erişimtarihi=2020-05-08|arşivtarihi=2020-05-08|arşivurl=https://web.archive.org/web/20200508053013/https://tc39.es/ecma262/#sec-overview}}</ref> [[Dinamik yazma]], [[Prototip tabanlı programlama|prototip tabanlı]] [[Nesne yönelimli programlama|obje yönelimi]] ve [[Birinci sınıf işlev|birinci sınıf işlevlere]] sahiptir. [[Olaya dayalı programlama|Olay odaklı]], [[Fonksiyonel programlama|işlevsel]] ve [[zorunlu programlama|zorunlu]] [[Programlama paradigması|programlama stillerini]] destekleyen [[Programlama paradigması|çoklu paradigmadır]] . Metin, tarihler, [[Düzenli ifade|düzenli ifadeler]], standart [[Veri yapısı|veri yapıları]] ve [[Document Object Model|Belge Obje Modeli]] (DOM) ile çalışmak için [[Uygulama programlama arayüzü|uygulama programlama arayüzlerine]] (API'ler) sahiptir.
JavaScript ve Java arasında; isimleri, yazım şekli ve standart kütüphanelerindeki benzerlikler dışında bir bağlantı yoktur ve iki dilin semantikleri çok farklıdır. JavaScript'in yazım şekli C programlama dilinden türetilmiş, semantiği ve tasarımı ise [[Self]] ve [[Scheme]] programlama dillerinden esinlenmiştir.


ECMAScript standardı, [[Bilgisayar ağı|ağ oluşturma]], [[Veri kayıt ortamı|depolama]] veya [[Bilgisayar grafikleri|grafik]] olanakları gibi herhangi bir [[giriş/çıkış]] (I/O) içermez. Pratikte, web tarayıcısı veya diğer [[Çalıştırma ortamı|çalıştırma ortamları]], I/O için JavaScript API'leri sağlarlar.
JavaScript, [[ECMAScript]] belirtimleri ile standartlaştırılmıştır.


JavaScript motorları başlangıçta yalnızca web tarayıcılarında kullanılıyordu, ancak günümüzde bazı [[Sunucu (bilişim)|sunucuların]] ve çeşitli [[Uygulama yazılımı|uygulamaların]] da temel bileşenleridir. Bu kullanım için en popüler çalışma zamanı sistemi [[Node.js|Node.js'dir]] .
== Tarihçesi ==
İlk olarak [[Brendan Eich]] tarafından geliştirilmiş olup, ilk defa Aralık 1995 tarihinde [[Netscape Navigator]] 2.0 ile birlikte piyasaya sürüldü. Geliştirme aşamasında adı Mocha olarak geçmesine rağmen Eylül 1995 tarihine kadar resmi olarak ''LiveScript'' olarak isimlendiriliyordu. Netscape 2.0 Beta3 ile birlikte ismi JavaScript olarak değiştirildi.


[[Java (programlama dili)|Java]] ve JavaScript'in ad, [[syntax|sözdizimi]] ve ilgili [[Standart kitaplık|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.
JavaScript'in isim değişikliği ile Netscape'in Java teknolojilerine (Java Applet) destek vermesi yaklaşık olarak aynı tarihlere denk gelir. [[Microsoft]] ile Netscape'in web teknolojileri ve platformları alanında yarıştığı bir dönemde, Netscape [[Sun Microsystems]]'ın geliştirdiği [[Java (programlama dili)|Java]] platformuna destek vererek dağıtık bir işletim sistemi yaratmayı öngörüyordu. JavaScript ise, [[Visual Basic]]'in yaptığı gibi, profesyonel olmayan programcıları hedefleyen daha basit bir betik dili olarak düşünülmekteydi.<ref>Severance, Charles (February 2012). "[http://www.computer.org/csdl/mags/co/2012/02/mco2012020007-abs.html JavaScript: Designing a Language in 10 Days]".''Computer'' (IEEE Computer Society) '''45''' (2): 7–8. doi:[[doi:10.1109/MC.2012.57|10.1109/MC.2012.57]].</ref>


== Tarihçe ==
=== Microsoft'un uygulaması ===
Microsoft, 1996 yılında [[JScript]] ve [[VBScript]] betik dillerini yayınladı. JScript Netscape'in JavaScript'ine benzerken VBScript Visual Basic temelliydi ve var olan Visual Basic programcılarının kolay bir geçiş yapmasını hedefliyordu. Aynı dönemde Microsoft ilk defa [[CSS]] desteği de sağladı ancak hem CSS hem de JScript desteği Netscape'in o zamana kadar sağladıkları ile tutarlı çalışmıyordu. Bu durum web tasarımcıları ve geliştiricileri arasında bir kargaşa yaratmış ve [[tarayıcı savaşları]]nın ilk yıllarında sitelerin altında tipik olarak görülen ''"En iyi Internet Explorer ile izlenir"'' ya da ''"En iyi Netscape ile izlenir"'' gibi logoların ortaya çıkmasına neden olmuştur<ref>[https://en.wikipedia.org/wiki/Browser_wars#First_browser_war]</ref>.


=== Standartlaşma ===
=== Netscape'te Oluşturma ===
[[Grafiksel kullanıcı arayüzü|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|World Wide Web'in]] hızlı büyümesinde önemli bir rol oynamıştır. <ref>{{Haber kaynağı|url=https://www.bloomberg.com/video/67758394|başlık=Bloomberg Game Changers: Marc Andreessen|erişimtarihi=December 7, 2011|arşivtarihi=May 16, 2012|arşivurl=https://web.archive.org/web/20120516093712/https://www.bloomberg.com/video/67758394/|tarih=March 17, 2011|yayıncı=Bloomberg}}</ref> Mosaic'in önde gelen geliştiricileri daha sonra 1994'te daha parlak bir geleceği olduğu düşünülen [[Netscape Gezgini|Netscape Navigator tarayıcısını]] piyasaya süren [[Netscape]] şirketini kurdular. Netscape Navigator hızla en çok kullanılan tarayıcı haline geldi. <ref>{{Web kaynağı|url=https://www.mwdwebsites.com/nj-web-design-web-browsers.html|başlık=The Evolution of the Web Browsers|erişimtarihi=August 31, 2018|arşivtarihi=August 31, 2018|arşivurl=https://web.archive.org/web/20180831174847/https://www.mwdwebsites.com/nj-web-design-web-browsers.html|tarih=August 31, 2018|çalışma=Monmouth Web Developers}}</ref> <ref>{{Web kaynağı|url=https://washingtonindependent.com/learn-the-history-of-web-browsers/|başlık=Learn the History of Web Browsers|erişimtarihi=August 31, 2018|tarih=August 31, 2018|çalışma=washingtonindependent.com}}</ref>
1996 yılının kasım ayında Netscape firması JavaScript'in endüstri standardı olarak belirlenmesi amacıyla [[Ecma International]] firmasına başvuruda bulunduğunu ilan etti. Bunun sonucunda standardize edilen sürüm [[ECMAScript]] olarak isimlendirildi ve 1997 yılının haziran ayında Ecma International, ECMA-262 belirtiminin ilk sürümünü yayımladı. Haziran 1998'de ISO/IEC-16262 standardına uyumlu hale getirilecek değişiklikler yapılarak ikinci sürüm, Aralık 1999'da ise üçüncü sürüm yayımlandı.


Web'in yeni şekillenmeye başladığı bu yıllarda, [[Web sayfası|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 [[Betik dili|komut dosyası dili]] eklemeye karar verdi. Bunu başarmak için iki yol izlediler: [[Java (programlama dili)|Java]] [[Programlama dili|programlama dilini]] yerleştirmek için [[Sun Microsystems]] ile iş birliği yaparken, aynı zamanda [[Scheme]] dilini yerleştirmek için de [[Brendan Eich|Brendan Eich'i]] işe aldılar. <ref name="origin">{{Web kaynağı|url=https://speakingjs.com/es5/ch04.html|başlık=Chapter 4. How JavaScript Was Created|erişimtarihi=2017-11-21|arşivtarihi=2020-02-27|arşivurl=https://web.archive.org/web/20200227184037/https://speakingjs.com/es5/ch04.html|çalışma=speakingjs.com}}</ref>
ECMAScript'in dördüncü sürümü üzerinde ciddi bir çalışma yapılmasına rağmen asla tamamlanamadı, ancak beşinci sürüm için önemli bir ilham kaynağı oldu<ref>{{Web kaynağı |url=http://www.ecmascript.org/docs.php |başlık=EcmaScript Belgelendirmesi |erişimtarihi=10 Nisan 2015 |arşivurl=https://web.archive.org/web/20110426141932/http://www.ecmascript.org/docs.php |arşivtarihi=26 Nisan 2011 |ölüurl=evet }}</ref>. Beşinci sürüm 2009 yılının aralık ayında yayımlandı. ECMAScript'in şu an geçerli olan son standart belirtimi, Haziran 2011 tarihinde yayımlanan 5.1 sürümüdür ve Javascript 1.8.5 tarafından desteklenmektedir<ref>[https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_5_support_in_Mozilla ECMAScript 5 support in Mozilla]</ref>.


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. <ref name="origin">{{Web kaynağı|url=https://speakingjs.com/es5/ch04.html|başlık=Chapter 4. How JavaScript Was Created|erişimtarihi=2017-11-21|arşivtarihi=2020-02-27|arşivurl=https://web.archive.org/web/20200227184037/https://speakingjs.com/es5/ch04.html|çalışma=speakingjs.com}}</ref> Eylül 1995'te Navigator [[Yazılım yaşam döngüsü|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. <ref name="origin" /> <ref name="techvision">{{Web kaynağı|url=https://wp.netscape.com/comprod/columns/techvision/innovators_be.html|başlık=TechVision: Innovators of the Net: Brendan Eich and JavaScript|arşivtarihi=February 8, 2008|arşivurl=https://web.archive.org/web/20080208124612/https://wp.netscape.com/comprod/columns/techvision/innovators_be.html}}</ref>
== NodeJS ==
{{Ana|Node.js}}
[[Node.js]] hızlı, [[Ölçeklenebilirlik|ölçeklenebilir]] ağ uygulamaları oluşturmak için [[Google Chrome|Chrome]]'un JavaScript Runtime teknolojisi üzerine kurulu bir platformdur. Node.js, dağıtık sistem olarak çalışabilen [[gerçek zamanlı]] uygulamalar için hafif ve verimli hale getiren olay odaklı, [[bloke etmeyen G/Ç]] (non-blocking I/O) modeli kullanır.


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ü. <ref>{{Kaynak|url=https://www.youtube.com/watch?v=XOmhtfTrRxc&t=2m5s|başlık=Brendan Eich&nbsp;– CEO of Brave|erişimtarihi=February 7, 2018|arşivtarihi=February 10, 2019|arşivurl=https://web.archive.org/web/20190210054957/https://www.youtube.com/watch?v=XOmhtfTrRxc&t=2m5s|tarih=June 17, 2016}}</ref>
== Değişkenler ==

JavaScript’te değişkenler '''var''', '''let''' ve '''const''' anahtar kelimeleri ile tanımlanabilir.
=== Microsoft tarafından benimsenmesi ===
[[Microsoft]], 1995 yılında [[Internet Explorer|Internet Explorer'ı]] piyasaya sürerek Netscape ile bir [[Tarayıcı savaşları|tarayıcı savaşına]] yol açtı. JavaScript cephesinde, Microsoft, [[JScript]] adlı kendi yorumlayıcısını oluşturmak için Navigator [[Yorumlayıcı|yorumlayıcısında]] [[tersine mühendislik]] yaptı. <ref name="sjsch5">{{Web kaynağı|url=https://speakingjs.com/es5/ch05.html|başlık=Chapter 5. Standardization: ECMAScript|erişimtarihi=1 November 2021|arşivtarihi=1 November 2021|arşivurl=https://web.archive.org/web/20211101184346/http://speakingjs.com/es5/ch05.html|çalışma=speakingjs.com}}</ref>

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ı. <ref name="O'Reilly-2001">{{Web kaynağı|url=https://archive.oreilly.com/pub/a/javascript/2001/04/06/js_history.html|başlık=JavaScript, How Did We Get Here?|erişimtarihi=July 16, 2016|arşivtarihi=July 19, 2016|arşivurl=https://web.archive.org/web/20160719020828/https://archive.oreilly.com/pub/a/javascript/2001/04/06/js_history.html|tarih=April 6, 2001|çalışma=oreilly.com}}</ref> <ref>{{Web kaynağı|url=https://news.microsoft.com/1996/05/29/microsoft-internet-explorer-3-0-beta-now-available/|başlık=Microsoft Internet Explorer 3.0 Beta Now Available|erişimtarihi=July 16, 2016|arşivtarihi=November 24, 2020|arşivurl=https://web.archive.org/web/20201124154053/https://news.microsoft.com/1996/05/29/microsoft-internet-explorer-3-0-beta-now-available/|tarih=May 29, 1996|çalışma=microsoft.com|yayıncı=Microsoft}}</ref> 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ı. <ref name="O'Reilly-2001" /> <ref>{{Web kaynağı|url=https://www.technologizer.com/2010/09/16/the-unwelcome-return-of-best-viewed-with-internet-explorer/|başlık=The Unwelcome Return of "Best Viewed with Internet Explorer"|erişimtarihi=July 16, 2016|arşivtarihi=June 23, 2018|arşivurl=https://web.archive.org/web/20180623192402/https://www.technologizer.com/2010/09/16/the-unwelcome-return-of-best-viewed-with-internet-explorer/|tarih=September 16, 2010|çalışma=technologizer.com}}</ref>

=== JScript'in yükselişi ===
Kasım 1996'da [[Netscape]], JavaScript'i [[ECMA Standartlar Birliğ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ı. <ref name="sjsch5">{{Web kaynağı|url=https://speakingjs.com/es5/ch05.html|başlık=Chapter 5. Standardization: ECMAScript|erişimtarihi=1 November 2021|arşivtarihi=1 November 2021|arşivurl=https://web.archive.org/web/20211101184346/http://speakingjs.com/es5/ch05.html|çalışma=speakingjs.com}}</ref>

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ı. <ref name="searchenginejournal.com">{{Haber kaynağı|url=https://www.searchenginejournal.com/mozilla-firefox-internet-browser-market-share-gains-to-74/1082/|başlık=Mozilla Firefox Internet Browser Market Share Gains to 7.4%|erişimtarihi=May 8, 2021|arşivtarihi=May 7, 2021|arşivurl=https://web.archive.org/web/20210507013607/https://www.searchenginejournal.com/mozilla-firefox-internet-browser-market-share-gains-to-74/1082/|yazarlar=Baker|tarih=November 24, 2004|çalışma=[[Search Engine Journal]]}}</ref> Bu durum, [[JScript|JScript'in]] Web'de [[İstemci tarafı komut dosyası oluşturma|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 ===
2000'lerin başında [[Internet Explorer|Internet Explorer'ın]] hakimiyeti döneminde, istemci tarafı komut dosyası oluşturma yöntemi oldukça durgundu. Bu, Netscape'in halefi [[Mozilla|Mozilla'nın]] [[Mozilla Firefox|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ı. <ref>{{Haber kaynağı|url=https://news.bbc.co.uk/2/hi/business/4508897.stm|başlık=The assault on software giant Microsoft|arşivtarihi=September 25, 2017|arşivurl=https://web.archive.org/web/20170925233936/https://news.bbc.co.uk/2/hi/business/4508897.stm|yazarlar=Weber|tarih=May 9, 2005|çalışma=[[BBC News]]}}</ref>

2005 yılında Mozilla, ECMA International'a katıldı ve [[XML için ECMAScript|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|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 (yazılım)|Tamarin]] uygulamasını [[Açık kaynak modeli|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|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 (programlama)|Ajax]] terimini türettiği ve verilerin arka planda yüklenebileceği [[Web uygulaması|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]], [[Prototip JavaScript Çerçevesi|Prototype]], [[Dojo Araç Seti|Dojo Toolkit]] ve [[MooTools]] dâhil olmak üzere birçok yeni kitaplık oluşturuldu.

[[Google]], [[Google Chrome|Chrome]] tarayıcısını 2008'de rakiplerinden daha hızlı olan [[V8]] JavaScript motoruyla piyasaya sürdü. <ref>{{Web kaynağı|url=https://www.pcgameshardware.com/aid,687738/Big-browser-comparison-test-Internet-Explorer-vs-Firefox-Opera-Safari-and-Chrome-Update-Firefox-35-Final/Practice/|başlık=Big browser comparison test: Internet Explorer vs. Firefox, Opera, Safari and Chrome|erişimtarihi=June 28, 2010|arşivtarihi=May 1, 2012|arşivurl=https://www.webcitation.org/67KMIRyMC?url=https://www.pcgameshardware.com/aid,687738/Big-browser-comparison-test-Internet-Explorer-vs-Firefox-Opera-Safari-and-Chrome-Update-Firefox-35-Final/Practice/|tarih=3 July 2009|çalışma=PC Games Hardware|yayıncı=Computec Media AG}}</ref> <ref>{{Web kaynağı|url=https://lifehacker.com/lifehacker-speed-tests-safari-4-chrome-2-and-more-5286869|başlık=Lifehacker Speed Tests: Safari 4, Chrome 2|erişimtarihi=May 8, 2021|arşivtarihi=April 14, 2021|arşivurl=https://web.archive.org/web/20210414095403/https://lifehacker.com/lifehacker-speed-tests-safari-4-chrome-2-and-more-5286869|tarih=June 11, 2009|çalışma=[[Lifehacker]]}}</ref> En önemli yenilik tam [[JIT|zamanında derlemeydi]] (JIT), <ref>{{Web kaynağı|url=https://brendaneich.com/2008/08/tracemonkey-javascript-lightspeed/|başlık=TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog|erişimtarihi=July 22, 2020|arşivtarihi=December 4, 2015|arşivurl=https://web.archive.org/web/20151204091540/https://brendaneich.com/2008/08/tracemonkey-javascript-lightspeed/}}</ref> bu nedenle diğer tarayıcı satıcılarının motorlarını JIT için elden geçirmeleri gerekiyordu. <ref>{{Dergi kaynağı|url=https://www.wired.com/2010/09/mozilla-asks-are-we-fast-yet/|başlık=Mozilla asks, 'Are we fast yet?'|erişimtarihi=January 18, 2019|arşivtarihi=June 22, 2018|arşivurl=https://web.archive.org/web/20180622213244/https://www.wired.com/2010/09/mozilla-asks-are-we-fast-yet/|çalışma=Wired}}</ref>

Temmuz 2008'de, bu farklı taraflar [[Oslo|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ı ===
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ı. <ref>{{Web kaynağı|url=https://es6-features.org/|başlık=ECMAScript 6: New Features: Overview and Comparison|erişimtarihi=March 19, 2018|arşivtarihi=March 18, 2018|arşivurl=https://web.archive.org/web/20180318064130/https://es6-features.org/|çalışma=es6-features.org}}</ref>

[[Node.js|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ü|olay döngüsünü]] ve [[Giriş/çıkış|I/O]] [[Uygulama programlama arayüzü|API'lerini]] birleştirerek bağımsız bir JavaScript çalışma zamanı sistemi sağlamaktaydı. 2018 itibariyle, Node milyonlarca geliştirici tarafından kullanılıyordu <ref>{{Web kaynağı|url=https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/The-secret-history-behind-the-success-of-npm-and-Node|başlık=The secret history behind the success of npm and Node|erişimtarihi=2 August 2021|arşivtarihi=2 August 2021|arşivurl=https://web.archive.org/web/20210802165613/https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/The-secret-history-behind-the-success-of-npm-and-Node|tarih=19 July 2018|çalışma=TheServerSide}}</ref> ve [[npm]] dünyadaki herhangi bir [[Paket yönetim sistemi|paket yöneticisinden]] çok daha fazla modüle sahipti. <ref>{{Web kaynağı|url=https://www.linux.com/news/state-union-npm/|başlık=State of the Union: npm|erişimtarihi=2 August 2021|arşivtarihi=2 August 2021|arşivurl=https://web.archive.org/web/20210802165614/https://www.linux.com/news/state-union-npm/|tarih=13 January 2017|çalışma=Linux.com}}</ref>

ECMAScript taslak belirtimi şu anda [[GitHub|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. <ref name="branscombe">{{Web kaynağı|url=https://thenewstack.io/whats-new-es2016/|başlık=JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16|erişimtarihi=2021-01-15|arşivtarihi=2021-01-16|arşivurl=https://web.archive.org/web/20210116181757/https://thenewstack.io/whats-new-es2016/|tarih=2016-05-04|çalışma=The New Stack}}</ref> Dildeki olası revizyonlar, kapsamlı bir teklif süreciyle incelenir. <ref>{{Web kaynağı|url=https://tc39.es/process-document/|başlık=The TC39 Process|erişimtarihi=2021-01-15|arşivtarihi=2021-02-07|arşivurl=https://web.archive.org/web/20210207105535/https://tc39.es/process-document/|çalışma=tc39.es|yayıncı=Ecma International}}</ref> <ref>{{Web kaynağı|url=https://github.com/tc39/proposals/blob/master/README.md|başlık=ECMAScript proposals|erişimtarihi=2021-01-15|arşivtarihi=2020-12-04|arşivurl=https://web.archive.org/web/20201204221147/https://github.com/tc39/proposals/blob/master/README.md|yayıncı=TC39}}</ref> Artık, sürüm numaraları yerine geliştiriciler, gelecek özelliklerin durumunu tek tek kontrol etmektedirler. <ref name="branscombe" />

Mevcut JavaScript ekosisteminde bulunan birçok [[Javascript kütüphaneleri listesi|kitaplık]] ve [[Web uygulama iskeleti|ç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 sayfa uygulaması|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ç [[Kaynaktan kaynağa derleyici|aktarıcı]] da oluşturulmuştur. <ref name="transpilers">{{Web kaynağı|url=https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS|başlık=List of languages that compile to JS|erişimtarihi=February 6, 2020|arşivtarihi=January 31, 2020|arşivurl=https://web.archive.org/web/20200131233044/https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS|çalışma=[[GitHub]]}}</ref>

== Ticari Marka ==
"JavaScript" adı, [[Oracle|Oracle Corporation'ın]] Amerika Birleşik Devletleri'ndeki [[Tescilli marka|ticari markasıdır]] . <ref>{{Web kaynağı|url=https://tsdr.uspto.gov/#caseNumber=75026640&caseType=SERIAL_NO&searchType=statusSearch|başlık=U.S. Trademark Serial No. 75026640|erişimtarihi=2021-05-08|arşivtarihi=2021-07-13|arşivurl=https://web.archive.org/web/20210713022850/https://tsdr.uspto.gov/#caseNumber=75026640&caseType=SERIAL_NO&searchType=statusSearch|yayıncı=[[United States Patent and Trademark Office]]}}</ref> <ref>{{Web kaynağı|url=https://www.oracle.com/legal/trademarks.html|başlık=Legal Notices|erişimtarihi=2021-05-08|arşivtarihi=2021-06-05|arşivurl=https://web.archive.org/web/20210605142505/https://www.oracle.com/legal/trademarks.html|yayıncı=[[Oracle Corporation]]}}</ref>

== Web sitesi istemci tarafı kullanımı ==
JavaScript, [[İnternet sitesi|web sitelerinin]] % 97'sinin bu amaçla kullandığı, Web'in baskın [[istemci tarafı]] komut dosyası dilidir. <ref name="deployedstats">{{Web kaynağı|url=https://w3techs.com/technologies/details/cp-javascript/|başlık=Usage statistics of JavaScript as client-side programming language on websites|erişimtarihi=2021-04-09|arşivtarihi=2021-08-13|arşivurl=https://web.archive.org/web/20210813192940/https://w3techs.com/technologies/details/cp-javascript/|çalışma=w3techs.com}}</ref> Komut dosyaları [[HTML]] belgelerine gömülür veya bunlar da dâhil edilmiş olur. Böylelikle kodlar [[Document Object Model|DOM]] ile etkileşime girer. Tüm büyük [[Web tarayıcısı|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 ===

* [[AJAX (programlama)|Ajax]] veya [[WebSocket]] aracılığıyla sayfayı yeniden yüklemeden yeni [[web sayfası]] içeriği yükleme. Örneğin, [[sosyal medya]] [[Kullanıcı|kullanıcıları]] mevcut sayfadan ayrılmadan mesaj gönderip alabilir.
* Nesneleri soldurma, yeniden boyutlandırma ve taşıma gibi web sayfası animasyonları.
* [[Tarayıcı oyunu|Tarayıcı oyunları]] oynama.
* [[Gerçek zamanlı veri akışı|Akış ortamının]] oynatılmasını kontrol etme.
* [[Açılır reklam|Açılan (pop-up) reklamlar]] oluşturma.
* Veriler bir [[Web sunucusu|web sunucusuna]] gönderilmeden önce bir [[Form (HTML)|web formunun]] giriş değerlerinin [[Veri doğrulama|doğrulanması]] .
* Kullanıcının davranışıyla ilgili verilerin günlüğe kaydedilmesi ve ardından bir sunucuya gönderilmesi. Web sitesi sahibi bu verileri [[Web Analitik|analiz]], [[reklam izleme|reklam takibi]] ve [[kişiselleştirme]] için kullanabilir.
* Bir kullanıcıyı başka bir sayfaya yönlendirme.

=== Kitaplıklar ve çerçeveler ===
Web sitelerinin %80'inden fazlası, istemci tarafı komut dosyası oluşturma için bir üçüncü taraf JavaScript [[Kütüphane (bilgisayar bilimi)|kitaplığı]] veya [[Web uygulama iskeleti|web çerçevesi]] kullanırlar. <ref name="lib_usage">{{Web kaynağı|url=https://w3techs.com/technologies/overview/javascript_library|başlık=Usage statistics of JavaScript libraries for websites|erişimtarihi=2021-04-09|arşivtarihi=2018-09-23|arşivurl=https://web.archive.org/web/20180923232220/https://w3techs.com/technologies/overview/javascript_library/all|çalışma=w3techs.com}}</ref>

[[jQuery]], web sitelerinin %75'inden fazlası tarafından kullanılan açık ara en popüler kitaplıktır. <ref name="lib_usage">{{Web kaynağı|url=https://w3techs.com/technologies/overview/javascript_library|başlık=Usage statistics of JavaScript libraries for websites|erişimtarihi=2021-04-09|arşivtarihi=2018-09-23|arşivurl=https://web.archive.org/web/20180923232220/https://w3techs.com/technologies/overview/javascript_library/all|çalışma=w3techs.com}}</ref> [[Facebook]], web sitesi için [[React]] kitaplığını oluşturdu ve daha sonra bunu [[Açık kaynak kodlu yazılım|açık kaynak]] olarak yayınladı; [[Twitter]] dâhil diğer pek çok site günümüzde bunu kullanmaktadır. Aynı şekilde [[Google|Google'ın]] [[YouTube]] ve [[Gmail]]'i de dâhil olmak üzere web siteleri için oluşturduğu [[Angular (Framework)|Angular]] çerçevesi artık başkaları tarafından kullanılabilen açık kaynaklı bir projedir. <ref name="lib_usage" />

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. <ref>{{Web kaynağı|url=https://vanilla-js.com/|başlık=Vanilla JS|erişimtarihi=June 17, 2020|arşivtarihi=June 16, 2020|arşivurl=https://web.archive.org/web/20200616052335/https://vanilla-js.com/|çalışma=vanilla-js.com}}</ref>

== Diğer kullanımları ==
JavaScript kullanımı, [[web tarayıcısı]] köklerinin ötesine geçmiştir. [[JavaScript motoru|JavaScript motorları]] artık hem [[sunucu tarafı]] web sitesi dağıtımları hem de tarayıcı dışı [[Uygulama yazılımı|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 Kurumsal Sunucu|Netscape Enterprise Server]] ve [[Microsoft|Microsoft'un]] [[Internet Information Services]] <ref>{{Web kaynağı|url=https://docs.oracle.com/cd/E19957-01/816-6411-10/contents.htm|başlık=Server-Side JavaScript Guide|erişimtarihi=May 8, 2021|arşivtarihi=March 11, 2021|arşivurl=https://web.archive.org/web/20210311173120/https://docs.oracle.com/cd/E19957-01/816-6411-10/contents.htm|tarih=December 11, 1998|yayıncı=[[Oracle Corporation]]}}</ref> <ref>{{Web kaynağı|url=https://msdn.microsoft.com/en-us/library/ms974588.aspx|başlık=Introducing JScript .NET|erişimtarihi=April 10, 2018|arşivtarihi=November 10, 2017|arşivurl=https://web.archive.org/web/20171110201649/https://msdn.microsoft.com/en-us/library/ms974588.aspx|tarih=July 14, 2000|çalışma=Microsoft Developer Network|yayıncı=Microsoft|alıntı=[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)}}</ref> idi, ancak bunlar küçük özelliklerdi. <ref name="2009server" /> Sunucu tarafı kullanımı, 2000'lerin sonlarında [[Node.js]] ve [[Sunucu tarafı JavaScript uygulamalarının listesi|diğer yaklaşımların]] oluşturulmasıyla birlikte büyümeye başladı. <ref name="2009server">{{Web kaynağı|url=https://readwrite.com/2009/12/17/server-side_javascript_back_with_a_vengeance/|başlık=Server-Side JavaScript, Back with a Vengeance|erişimtarihi=July 16, 2016|arşivtarihi=June 17, 2016|arşivurl=https://web.archive.org/web/20160617030219/https://readwrite.com/2009/12/17/server-side_javascript_back_with_a_vengeance/|tarih=December 17, 2009|çalışma=readwrite.com}}</ref>

[[Elektron (yazılım çerçevesi)|Electron]], [[Apache Cordova|Cordova]], [[Yerel Tepki Ver|React Native]] ve diğer [[uygulama çerçevesi|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 <ref>{{Web kaynağı|url=https://www.adobe.com/devnet/acrobat/javascript.html|başlık=JavaScript for Acrobat|erişimtarihi=August 18, 2009|arşivtarihi=August 7, 2009|arşivurl=https://web.archive.org/web/20090807065130/https://www.adobe.com/devnet/acrobat/javascript.html}}</ref> ve JavaScript ile yazılmış [[GNOME Shell]] uzantılarını içerir. <ref>{{Web kaynağı|url=https://treitter.livejournal.com/14871.html|başlık=Answering the question: "How do I develop an app for GNOME?"|erişimtarihi=2013-02-07|arşivtarihi=2013-02-11|arşivurl=https://web.archive.org/web/20130211032900/https://treitter.livejournal.com/14871.html}}</ref>

JavaScript, son zamanlarda bazı [[Gömülü sistem|gömülü sistemlerde]], genellikle Node.js'den yararlanılarak görünmeye başladı. <ref>{{Web kaynağı|url=https://tessel.io/|başlık=Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel.|erişimtarihi=2021-05-08|arşivtarihi=2021-05-26|arşivurl=https://web.archive.org/web/20210526212559/https://tessel.io/}}</ref> <ref>{{Web kaynağı|url=https://www.w3schools.com/nodejs/nodejs_raspberrypi_gpio_intro.asp|başlık=Node.js Raspberry Pi GPIO Introduction|erişimtarihi=2020-05-03|arşivtarihi=2021-08-13|arşivurl=https://web.archive.org/web/20210813192938/https://www.w3schools.com/nodejs/nodejs_raspberrypi_gpio_intro.asp}}</ref> <ref>{{Web kaynağı|url=https://www.espruino.com/|başlık=Espruino&nbsp;– JavaScript for Microcontrollers|erişimtarihi=2020-05-03|arşivtarihi=2020-05-01|arşivurl=https://web.archive.org/web/20200501010722/https://www.espruino.com/}}</ref>

== Özellikler ==
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ış ===
JavaScript, [[C (programlama dili)|C'nin]] [[Yapısal programlama|yapılandırılmış programlama]] sözdiziminin çoğunu destekler (örneğin, <code>if</code> ifadeleri, <code>while</code> döngüleri, <code>switch</code> ifadeleri, <code>do while</code> döngüleri vb. ). Kısmi bir istisna [[Kapsam (bilgisayar bilimi)|kapsam belirlemedir]] : başlangıçta JavaScript yalnızca <code>var</code> ile [[fonksiyon kapsamı|işlev kapsamına]] sahipti; daha sonra ECMAScript 2015'te <code>let</code> ve <code>[[Const (bilgisayar programlama)|const]]</code> anahtar sözcükleriyle blok kapsamı eklendi. C gibi, JavaScript de [[İfade (bilgisayar bilimi)|expressionslar]] ve [[Açıklama (bilgisayar bilimi)|statementslar]] arasında bir ayrım yapar. C'den bir sözdizimsel farkı da, noktalı virgüllerin (deyimleri sonlandıran) atlanmasına izin veren [[JavaScript/Kelime yapısı|otomatik noktalı virgül]] eklemedir. <ref name="Flanagan2006">{{Kitap kaynağı|url=https://books.google.com/books?id=2weL0iAfrEMC|başlık=JavaScript: The Definitive Guide: The Definitive Guide|erişimtarihi=March 29, 2019|arşivtarihi=August 1, 2020|arşivurl=https://web.archive.org/web/20200801065235/https://books.google.com/books?id=2weL0iAfrEMC|tarih=August 17, 2006|sayfa=16|yayıncı="O'Reilly Media, Inc."|isbn=978-0-596-55447-7}}</ref>

=== Zzayıf yazılmış ===
JavaScript [[Güçlü ve zayıf yazma|zayıf yazılmıştır]], bu kullanılan işleme bağlı olarak belirli türlerin dolaylı olarak yayınlandığı anlamına gelir. <ref name="casting_rules">{{Web kaynağı|url=https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|başlık=JavaScript quirks in one image from the Internet|erişimtarihi=28 Ekim 2019|arşivtarihi=28 Ekim 2019|arşivurl=https://web.archive.org/web/20191028204723/https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|dil=en|çalışma=The DEV Community}}</ref>

* İkili <code>+</code> 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 <code>-</code> işleci her zaman her iki işleneni de bir sayıya atar
* Her iki birli operatör ( <code>+</code>, <code>-</code> ) işleneni her zaman bir sayıya çevirir.

Değerler aşağıdaki gibi dizgelere dönüştürülür: <ref name="casting_rules">{{Web kaynağı|url=https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|başlık=JavaScript quirks in one image from the Internet|erişimtarihi=October 28, 2019|arşivtarihi=October 28, 2019|arşivurl=https://web.archive.org/web/20191028204723/https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|dil=en|çalışma=The DEV Community}}</ref>

* 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 ( <code>,</code> ) ile birleştirilirler.
* Diğer objeler <code>[object Object]</code> dizesine dönüştürülür; burada <code>Object</code>, 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 [[JavaScript|prototip]] üzerinde <code>toString</code> ve <code>valueOf</code> 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. <ref>{{Web kaynağı|url=https://www.destroyallsoftware.com/talks/wat|başlık=Wat|erişimtarihi=October 28, 2019|arşivtarihi=October 28, 2019|arşivurl=https://web.archive.org/web/20191028204723/https://www.destroyallsoftware.com/talks/wat|çalışma=www.destroyallsoftware.com}}</ref> <ref name="casting_rules">{{Web kaynağı|url=https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|başlık=JavaScript quirks in one image from the Internet|erişimtarihi=October 28, 2019|arşivtarihi=October 28, 2019|arşivurl=https://web.archive.org/web/20191028204723/https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|dil=en|çalışma=The DEV Community}}</ref> Ö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.
{| class="wikitable"
|+JavaScript türü dönüşümleri
! Sol İşleyici
! Operatör
! Sağ İşleyici
! Sonuç
|-
| <code>[]</code> (boş dizi)
| <code>+</code>
| <code>[]</code> (boş dizi)
| <code>""</code> (boş dize)
|-
| <code>[]</code> (boş dizi)
| <code>+</code>
| <code>{}</code> (boş obje)
| <code>"[object Object]"</code> (dize)
|-
| <code>false</code> (boole)
| <code>+</code>
| <code>[]</code> (boş dizi)
| <code>"false"</code> (dize)
|-
| <code>"123"</code> (dize)
| <code>+</code>
| <code>1</code> (sayı)
| <code>"1231"</code> (dize)
|-
| <code>"123"</code> (dize)
| <code>-</code>
| <code>1</code> (sayı)
| <code>122</code> (sayı)
|-
| <code>"123"</code> (dize)
| <code>-</code>
| <code>"abc"</code> (dize)
| <code>[[Sayı değil|NaN]]</code> (sayı)
|}
Genellikle, <code>{} + []</code> ile sonuçlanan <code>0</code> (sayı) da belirtilir. Bu yanıltıcıdır: <code>{}</code> boş bir obje yerine boş bir kod bloğu olarak yorumlanır ve boş dizi kalan unary <code>+</code> operatörü tarafından bir sayıya dönüştürülür. İfadeyi parantez içine alırsanız <code>({} + [])</code> küme parantezleri boş bir obje olarak yorumlanır ve ifadenin sonucu beklendiği gibi <code>"[object Object]"</code> olur. <ref name="casting_rules">{{Web kaynağı|url=https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|başlık=JavaScript quirks in one image from the Internet|erişimtarihi=October 28, 2019|arşivtarihi=October 28, 2019|arşivurl=https://web.archive.org/web/20191028204723/https://dev.to/mkrl/javascript-quirks-in-one-image-from-the-internet-52m7|dil=en|çalışma=The DEV Community}}</ref>

=== Dinamik ===


; Yazım
: JavaScript, diğer çoğu [[betik dili]] gibi [[Dinamik yazma|dinamik olarak yazılır]] . Bir [[Tip sistemi|tür]], bir ifade yerine bir [[Değer (bilgisayar bilimi)|değerle]] ilişkilendirilir. Örneğin, başlangıçta bir sayıya bağlı olan bir [[Değişken (bilgisayar bilimi)|değişken]], bir [[Dize (bilgisayar bilimi)|dizgeye]] yeniden atanabilir. <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures|başlık=JavaScript data types and data structures&nbsp;– JavaScript &#124; MDN|erişimtarihi=February 24, 2017|arşivtarihi=March 14, 2017|arşivurl=https://web.archive.org/web/20170314230542/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures|tarih=February 16, 2017|çalışma=Developer.mozilla.org}}</ref> JavaScript, [[Duck Typing|ördek yazımı]] dâhil, objelerin türünü test etmenin çeşitli yollarını destekler. {{Kdn|Flanagan|2006}}
; Çalışma zamanı değerlendirmesi
: JavaScript, çalışma zamanında dizeler olarak sağlanan ifadeler <code>[[değerlendir|eval]]</code> bir değerlendirme işlevi içerir.

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

;
; Prototipler
: JavaScript, diğer birçok nesne yönelimli dilin [[Kalıtım (programlama)|kalıtım]] için [[Sınıf (programlama)|sınıfları]] kullandığı [[Prototip tabanlı programlama|prototipleri]] kullanır. <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain|başlık=Inheritance and the prototype chain|erişimtarihi=April 6, 2013|arşivtarihi=April 25, 2013|arşivurl=https://web.archive.org/web/20130425144207/https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain|çalışma=Mozilla Developer Network|yayıncı=[[Mozilla]]}}</ref> JavaScript'te prototiplerle birçok sınıf tabanlı özelliği simüle etmek mümkündür. <ref>{{Kitap kaynağı|başlık=Effective JavaScript|sayfa=83|yayıncı=Addison-Wesley|yıl=2013|isbn=978-0-321-81218-6}}</ref>
; 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 ( <code>Object</code> prototipinden özellikler dâhil) devralan bir prototip örneği oluşturur. <ref>{{Kitap kaynağı|başlık=Eloquent JavaScript|sayfalar=95–97|yayıncı=No Starch Press|yıl=2011|isbn=978-1-59327-282-1}}</ref> ECMAScript 5, <code>Object</code> prototipinden otomatik olarak miras alınmadan bir örneğin açık bir şekilde oluşturulmasına izin veren <code>Object.create</code> yöntemini sunar (eski ortamlar prototipi <code>null</code> öğesine atayabilir). <ref>{{Web kaynağı|url=https://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/|başlık=Understanding "Prototypes" in JavaScript|erişimtarihi=April 6, 2013|arşivtarihi=5 April 2013|arşivurl=https://web.archive.org/web/20130405154842/https://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/|tarih=12 August 2011}}</ref> <code>prototype</code> ö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 <code>Array</code> veya <code>Object</code> gibi yerleşik oluşturucuları da değiştirilebilen prototiplere sahiptir. <code>Object</code> prototipini değiştirmek mümkün olsa da, JavaScript'teki çoğu obje, <code>Object</code> prototipinden yöntemleri ve özellikleri devralacağından ve prototipin değiştirilmesini beklemeyebileceğinden, genellikle kötü uygulama olarak kabul edilirler. <ref>{{Kitap kaynağı|başlık=Effective JavaScript|sayfalar=125–127|yayıncı=Addison-Wesley|yıl=2013|isbn=978-0-321-81218-6}}</ref>
; Metod olarak fonksiyonlar
: Birçok nesne yönelimli dilden farklı olarak, işlev tanımı ile [[Yöntem (bilgisayar bilimi)|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 ===
Bir [[Altyordam|işlev]] [[Birinci sınıf işlev|birinci sınıftır]] ; bir fonksiyon bir obje olarak kabul edilir. <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function|başlık=Function&nbsp;– JavaScript|erişimtarihi=2021-10-30|dil=en-US|çalışma=[[MDN Web Docs]]}}</ref> Bu nedenle, bir fonksiyonun <code>.call()</code> ve <code>.bind()</code> gibi özellikleri ve metodlarıı olabilir. <ref>{{Web kaynağı|url=https://es5.github.com/#x15.3.4-toc|başlık=Properties of the Function Object|erişimtarihi=May 26, 2013|arşivtarihi=January 28, 2013|arşivurl=https://web.archive.org/web/20130128185825/https://es5.github.com/#x15.3.4-toc|yayıncı=Es5.github.com}}</ref> ''İç 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 [[Kapatma (bilgisayar programlama)|sözcüksel bir kapanış]] oluşturur: dış işlevin [[Kapsam (programlama)|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. . {{Kdn|Flanagan|2006}} JavaScript ayrıca [[anonim işlev|anonim işlevleri]] de destekler.

=== Yetkilendirme ===
JavaScript, örtük ve açık [[Delegasyon (nesne yönelimli programlama)|yetkilendirmeyi]] destekler.

; Rol olarak fonksiyonlar [Özellikler (Traits) ve Karışımlar (Mixins)]
: JavaScript, [[Özellikler (bilgisayar bilimi)|Traits]] <ref>{{Web kaynağı|url=https://cocktailjs.github.io/|başlık=Home &#124; CocktailJS|erişimtarihi=February 24, 2017|arşivtarihi=February 4, 2017|arşivurl=https://web.archive.org/web/20170204083608/https://cocktailjs.github.io/|çalışma=Cocktailjs.github.io}}</ref> ve [[karıştırmak|Mixins]] gibi [[Rol odaklı programlama|Rol]] modellerinin çeşitli fonksiyon tabanlı uygulamalarını da yerel olarak destekler. Böyle bir fonksiyon, <code>function</code> gövdesi içinde <code>this</code> anahtar sözcüğüne bağlı en az bir yöntemle ek davranışı tanımlar. Daha sonra bir Rol, <code>call</code> yoluyla açıkça devredilmeli veya prototip zinciri aracılığıyla paylaşılmayan ek davranışlara sahip olması gereken objelere <code>apply</code> (uygulama) edilmelidir.
; Obje kompozisyonu ve kalıtım
: Açık fonksiyon tabanlı yetkilendirme JavaScript'te [[nesne kompozisyonu|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 (programlama)|kalıtım]], yapıcı fonksiyonların prototip özelliğine bağlı bir yetkilendirme otomatizmi tarafından kapsanır.

=== Çeşitli ===
JS [[Sıfır tabanlı numaralandırma|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ı [[Document Object Model|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 [[İş parçacığı|iş parçacıklıdır]] . JavaScript ayrıca, komut dosyalarını (örneğin, [[HTML]] <code><nowiki><script></nowiki></code> öğ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 [[Kuyruk (veri yapısı)|kuyruktan]] gelen [[Mesaj (bilgisayar bilimi)|mesajları]] birer birer işler. JavaScript, her yeni mesajla ilişkili bir [[Altyordam|fonksiyonu]] çağırır ve fonksiyonun [[Parametre (bilgisayar programlama)|bağımsız değişkenleri]] ve [[Yerel değişken|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 [[Paralel zamanlılık|eşzamanlılık modeli]], olay döngüsünü [[Asenkron G/Ç|engellemeyen]] olarak tanımlar: program [[Giriş/çıkış|girişi/çıkışı]], [[Olay (bilgi işlem)|olaylar]] ve [[Geri arama (bilgisayar programlama)|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. <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop|başlık=Concurrency model and Event Loop|erişimtarihi=August 28, 2015|arşivtarihi=September 5, 2015|arşivurl=https://web.archive.org/web/20150905045241/https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop|çalışma=Mozilla Developer Network}}</ref>

; Değişken (Varyadik) fonksiyonlar
: Bir fonksiyona sınırsız sayıda parametre iletilebilir. Fonksiyon bunlara [[resmi parametre|biçimsel parametreler]] aracılığıyla ve ayrıca yerel <code>arguments</code> objesi aracılığıyla erişebilir. <code>[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind bind]</code> yöntemi kullanılarak [[değişken fonksiyonlar|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 [[Nesne değişmezi|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|Perl'e]] benzer şekilde [[Düzenli ifade|düzenli ifadeleri]] de destekler. <ref>{{Kitap kaynağı|başlık=Eloquent JavaScript|sayfalar=139–149|yayıncı=No Starch Press|yıl=2011|isbn=978-1-59327-282-1}}</ref>

; Sözler (Promise) ve zaman uyumsuz/bekleme (Async/await)
: JavaScript, zaman uyumsuz işlemleri işlemek için [[Gelecekler ve vaatler|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.

=== Satıcıya özel uzantılar ===
Tarihsel olarak, bazı [[JavaScript motoru|JavaScript motorları]] bu standart olmayan özellikleri destekledi:

* koşullu <code>catch</code> cümleleri (Java gibi)
* [[Dizi kavrayışları]] (array comprehensions) ve üreteç ifadeleri (Python gibi)
* kısa fonksiyon ifadeleri ( <code>function(args) expr</code> ; bu deneysel sözdizimi ok işlevlerinden önce gelir)
* [[XML için ECMAScript|ECMAScript for XML]] (E4X), ECMAScript'e yerel XML desteği ekleyen bir uzantı (sürüm 21 <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Archive/Web/E4X|başlık=E4X – Archive of obsolete content &#124; MDN|erişimtarihi=July 13, 2014|arşivtarihi=July 24, 2014|arşivurl=https://web.archive.org/web/20140724100129/https://developer.mozilla.org/en-US/docs/Archive/Web/E4X|tarih=February 14, 2014|çalışma=Mozilla Developer Network|yayıncı=Mozilla Foundation}}</ref> den beri Firefox'ta desteklenmemektedir)

== Sözdizimi ==
{{Ayrıca bakınız|Tarayıcı güvenliği}}

=== Basit örnekler ===
JavaScript'teki [[Değişken (bilgisayar bilimi)|değişkenler]], <code>var</code>, <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var|başlık=var – JavaScript – MDN|erişimtarihi=December 22, 2012|arşivtarihi=December 23, 2012|arşivurl=https://web.archive.org/web/20121223162713/https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var|yayıncı=The [[Mozilla Developer Network]]}}</ref> <code>let</code> <ref name="moz_let">{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let|başlık=let|erişimtarihi=June 27, 2018|arşivtarihi=May 28, 2019|arşivurl=https://web.archive.org/web/20190528140803/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let|çalışma=MDN web docs|yayıncı=Mozilla|kaynak=moz_let}}</ref> veya <code>const</code> <ref name="moz_const">{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const|başlık=const|erişimtarihi=June 27, 2018|arşivtarihi=June 28, 2018|arşivurl=https://web.archive.org/web/20180628044054/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const|çalışma=MDN web docs|yayıncı=Mozilla|kaynak=moz_const}}</ref> anahtar kelimeleri kullanılarak tanımlanabilir.

<syntaxhighlight lang="javascript" start="1">
// '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.


<syntaxhighlight lang="javascript">
/* aşağıdaki cümle x değişkeninin varlığını ilan eder
* ve undefined özel değerini x değişkenine atar. */
var x;
var x;


// Değişkenler, bunun gibi elle 'tanımsız' olarak ayarlanabilir
/* aşağıdaki cümle y değişkeninin varlığını ilan eder
var x2 = undefined;
* ve 2 değerini y değişkenine atar. */
var y = 2;
</syntaxhighlight>


// "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ı.
== Fonksiyonlar ==
// Declares a block-scoped variable named `y`, and implicitly sets it to
Fonksiyon tanımlamak için aşağıdaki gibi '''function''' anahtar kelimesini kullanabiliriz.
// `undefined`. The `let` keyword was introduced in ECMAScript 2015.
let y;


// Declares a block-scoped, un-reassignable variable named `z`, and sets it to
<syntaxhighlight lang="javascript">
// a string literal. The `const` keyword was also introduced in ECMAScript 2015,
function faktoriyel(sayi) {
// and must be explicitly assigned to.
if (sayi == 0) {

return 1;
// 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";
</syntaxhighlight>Yukarıdaki örnekte, hepsinin önünde iki [[eğik çizgi]] bulunan [[Yorum satırı|yorumlara]] dikkat edin.

JavaScript'te yerleşik [[Giriş/çıkış|Giriş/Çıkış]] (I/O) işlevi yoktur; çalışma zamanı ortamı bunu sağlar. Sürüm 5.1'deki ECMAScript belirtimi şunları belirtir: <ref>{{Web kaynağı|url=https://www.ecma-international.org/ecma-262/5.1/#sec-4|başlık=ECMAScript Language Specification – ECMA-262 Edition 5.1|erişimtarihi=December 22, 2012|arşivtarihi=November 26, 2012|arşivurl=https://web.archive.org/web/20121126044218/https://ecma-international.org/ecma-262/5.1/#sec-4|yayıncı=[[Ecma International]]}}</ref> <blockquote>aslında, bu spesifikasyonda harici veri girişi veya hesaplanan sonuçların çıkışı için herhangi bir şart yoktur.</blockquote>Ancak, çoğu çalışma zamanı ortamında çıktı yazdırmak için kullanılabilecek bir <code>console</code> objesi <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/DOM/console|başlık=console|erişimtarihi=April 6, 2013|arşivtarihi=February 28, 2013|arşivurl=https://web.archive.org/web/20130228112150/https://developer.mozilla.org/en-US/docs/DOM/console|çalışma=Mozilla Developer Network|yayıncı=[[Mozilla]]}}</ref> bulunur. İşte JavaScript'te minimalist bir [[Merhaba dünya programı|Hello World programı]] :<syntaxhighlight lang="javascript">
console.log("Hello, World!");
</syntaxhighlight>HTML belgelerinde bir çıktı için bu program gereklidir:<syntaxhighlight lang="javascript">
// 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');
</syntaxhighlight>Basit bir [[Özyineleme (bilgisayar bilimi)|özyinelemeli]] (recursive) fonksiyon:<syntaxhighlight lang="javascript">
function factorial(n) {
if (n === 0)
return 1; // 0! = 1

return n * factorial(n - 1);
}

factorial(3); // returns 6
</syntaxhighlight>[[anonim fonksiyon|Anonim bir fonksiyon]] (veya lambda):<syntaxhighlight lang="javascript">
let counter = function() {
let count = 0;
return ++count;
};

let x = counter();
x() // returns 1
x() // returns 2
x() // returns 3
</syntaxhighlight>Bu örnek, JavaScript'te [[Kapatma (bilgisayar programlama)|fonksiyon kapanışlarının]] yerel olmayan değişkenlerini başvuru yoluyla yakaladığını gösterir.

Ok işlevleri ilk olarak [[ECMAScript|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:<syntaxhighlight lang="javascript">
// 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
</syntaxhighlight>JavaScript'te [[Nesne (programlama)|objeler]], fonskiyonlarla aynı şekilde oluşturulur; bu nedenle ojbeler bir [[fonksiyon nesnesi|fonksiyon objesi]] olarak bilinirler.

Obje örneği:<syntaxhighlight lang="javascript">
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
</syntaxhighlight>[[değişken fonksiyon|Değişken fonksiyon]] gösterimi ( <code>arguments</code> özel bir [[Değişken (bilgisayar bilimi)|değişkendir]] ): <ref>{{Web kaynağı|url=https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments|başlık=arguments|erişimtarihi=April 6, 2013|arşivtarihi=April 13, 2013|arşivurl=https://web.archive.org/web/20130413230225/https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments|çalışma=Mozilla Developer Network|yayıncı=[[Mozilla]]}}</ref><syntaxhighlight lang="javascript">
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
</syntaxhighlight>[[Hemen çağrılan işlev ifadesi|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:<syntaxhighlight lang="javascript">
let counter = (function() {
let i = 0; // private property

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

counter.get(); // shows 0
counter.set(6);
counter.increment(); // shows 7
counter.increment(); // shows 8
</syntaxhighlight>JavaScript'te modülleri dışa ve içe aktarma <ref>{{Web kaynağı|url=https://learnersbucket.com/tutorials/es6/es6-modules/|başlık=Import & Export Modules in javascript|erişimtarihi=April 23, 2019|arşivtarihi=April 23, 2019|arşivurl=https://web.archive.org/web/20190423075328/https://learnersbucket.com/tutorials/es6/es6-modules/|çalışma=Learnersbucket.com}}</ref>

Export örneği:<syntaxhighlight lang="javascript">
/* mymodule.js */
// This function remains private, as it is not exported
let sum = (a, b) => {
return a + b;
}
}
</syntaxhighlight>


// Export variables
Yukarıdaki [[Özyineleme|özyinemeli]] fonksiyon, girilen değerin faktoriyelini hesaplamada kullanılabilir. Eğer JavaScript yorumlayıcınız console objesini sunuyorsa, bu örneği aşağıdaki gibi deneyebilirsiniz.
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);
}
}
</syntaxhighlight>İmport örneği:<syntaxhighlight />


=== Daha gelişmiş örnek ===
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
/* Finds the lowest common multiple (LCM) of two numbers */
/* Aşağıdaki kod 6 yazdırmalıdır.
function LCMCalculator(x, y) { // constructor function
* faktoriyel(0) = 1
const checkInt = function(x) { // inner function
* faktoriyel(1) = faktoriyel(0) * 1 = 1
* faktoriyel(2) = faktoriyel(1) * 2 = 2
if (x % 1 !== 0)
throw new TypeError(x + "is not an integer"); // var a = mouseX
* faktoriyel(3) = faktoriyel(2) * 3 = 6

*/
return x;
console.log(faktoriyel(3));
};

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());
}
</syntaxhighlight>Tarayıcı penceresinde aşağıdaki çıktı görüntülenmelidir.<syntaxhighlight lang="html4strict">
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
</syntaxhighlight>
</syntaxhighlight>


== Dış bağlantılar ==
== Güvenlik ==
{{Ayrıca bakınız|ECMAScript#External_links}}
* [https://developer.mozilla.org/en/JavaScript JavaScript (mozilla.org)]
JavaScript ve [[Document Object Model|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 [[Sandbox (bilgisayar güvenliği)|sanal]] alanda çalışır. İkinci olarak, komut dosyaları [[Aynı Kök Politikası|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. <ref>{{Web kaynağı|url=https://www.adsafe.org/|başlık=Making JavaScript Safe for Advertising|erişimtarihi=2021-05-08|arşivtarihi=2021-07-06|arşivurl=https://web.archive.org/web/20210706153324/https://www.adsafe.org/|yayıncı=ADsafe}}</ref> <ref>{{Web kaynağı|url=https://code.google.com/p/es-lab/wiki/SecureEcmaScript|başlık=Secure ECMA Script (SES)|erişimtarihi=May 26, 2013|arşivtarihi=May 15, 2013|arşivurl=https://web.archive.org/web/20130515073412/https://code.google.com/p/es-lab/wiki/SecureEcmaScript}}</ref> Closure Toolkit, üçüncü taraf JavaScript ve HTML'nin güvenli bir şekilde yerleştirilmesi ve yalıtılması için başka bir projedir. <ref>{{Web kaynağı|url=https://developers.google.com/caja/|başlık=Google Caja Project|erişimtarihi=2021-07-09|arşivtarihi=2021-01-22|arşivurl=https://web.archive.org/web/20210122083321/https://developers.google.com/caja/|çalışma=[[Google]]}}</ref>

[[İç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ı ===
JavaScript ile ilgili yaygın bir güvenlik sorunu, [[Aynı Kök Politikası|aynı kaynak ilkesinin]] ihlali olan [[Siteler arası betik çalıştırma|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. <ref>{{Web kaynağı|url=https://www.mozillazine.org/talkback.html?article=4392|başlık=Mozilla Cross-Site Scripting Vulnerability Reported and Fixed&nbsp;– MozillaZine Talkback|erişimtarihi=February 24, 2017|arşivtarihi=August 22, 2011|arşivurl=https://www.webcitation.org/618Gt5sMQ?url=https://www.mozillazine.org/talkback.html?article=4392|çalışma=Mozillazine.org}}</ref>

Bir başka siteler arası güvenlik açığı, [[XSRF|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 <code><nowiki><script></nowiki></code> 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 (HTTP)|POST]] ve [[HTTP|GET]] parametrelerinde bir kimlik doğrulama belirteci eklemek.

=== Müşteriye duyulan yanlış güven ===
İ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 [[Gizlenmiş 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. <ref>{{Akademik dergi kaynağı|url=https://blog.anta.net/2008/06/17/right-click-%e2%80%9cprotection%e2%80%9d-forget-about-it/|başlık=Right-click "protection"? Forget about it|erişimtarihi=June 17, 2008|arşivtarihi=August 9, 2011|arşivurl=https://web.archive.org/web/20110809195359/https://blog.anta.net/2008/06/17/right-click-%E2%80%9Cprotection%E2%80%9D-forget-about-it/|tarih=June 17, 2008|issn=1797-1993}}</ref>
* Bir saldırgan tarafından ayıklanabileceğinden, şifreler gibi hassas bilgileri JavaScript'e gömmek çok kötü bir uygulama olarak kabul edilir. <ref>{{Web kaynağı|url=https://www.serviceobjects.com/blog/why-you-should-never-put-sensitive-data-in-your-javascript/|başlık=Why You Should Never Put Sensitive Data in Your JavaScript|erişimtarihi=June 3, 2019|arşivtarihi=June 3, 2019|arşivurl=https://web.archive.org/web/20190603142957/https://www.serviceobjects.com/blog/why-you-should-never-put-sensitive-data-in-your-javascript/|çalışma=ServiceObjects Blog|yayıncı=ServiceObjects}}</ref>

=== Geliştiricilere yuaulan ynlış güven ===
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. <ref name="jslibs">
{{Kitap kaynağı|başlık=Proceedings 2017 Network and Distributed System Security Symposium|erişimtarihi=February 22, 2017|arşivtarihi=March 29, 2017|arşivurl=https://web.archive.org/web/20170329045344/https://www.ccs.neu.edu/home/arshad/publications/ndss2017jslibs.pdf|kısım=Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web|kısım-url=https://www.ccs.neu.edu/home/arshad/publications/ndss2017jslibs.pdf|tarih=December 21, 2016|isbn=978-1-891562-46-4|doi=10.14722/ndss.2017.23414}}</ref> "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." <ref name="jslibs" /> 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. <ref>{{Haber kaynağı|url=https://qz.com/646467/how-one-programmer-broke-the-internet-by-deleting-a-tiny-piece-of-code/|başlık=How one programmer broke the internet by deleting a tiny piece of code|erişimtarihi=February 22, 2017|arşivtarihi=February 22, 2017|arşivurl=https://web.archive.org/web/20170222200836/https://qz.com/646467/how-one-programmer-broke-the-internet-by-deleting-a-tiny-piece-of-code/|yazarlar=Collins|tarih=March 27, 2016|çalışma=Quartz}}</ref>

=== Tarayıcı ve eklenti kodlama hataları ===
JavaScript, bazıları [[Arabellek aşımı|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 [[Uygulama programlama arayüzü|API'sine]] erişmesine izin verebilir.

Bu kusurlar Firefox, Internet Explorer, <ref>{{Web kaynağı|url=https://news.com.com/2100-1001-214620.html|başlık=Buffer-overflow bug in IE|arşivtarihi=December 25, 2002|arşivurl=https://web.archive.org/web/20021225190522/https://news.com.com/2100-1001-214620.html|tarih=August 19, 1998|çalışma=[[CNET]]}}</ref> 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. <ref>{{Web kaynağı|url=https://blogs.msdn.com/ie/archive/2006/02/09/528963.aspx|başlık=Protected Mode in Vista IE7 – IEBlog|erişimtarihi=February 24, 2017|arşivtarihi=January 23, 2010|arşivurl=https://web.archive.org/web/20100123103719/https://blogs.msdn.com/ie/archive/2006/02/09/528963.aspx|tarih=February 9, 2006|çalışma=Blogs.msdn.com}}</ref> [[Google Chrome]] benzer şekilde sayfa oluşturucularını kendi " [[Sandbox (bilgisayar güvenliği)|sandbox]] "larıyla sınırlar.

=== Korumalı alan uygulama hataları ===
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. <ref>{{Web kaynağı|url=https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb457150(v=technet.10)|başlık=Part 5: Enhanced Browsing Security|erişimtarihi=2021-10-20|tarih=2004-08-09|çalışma=[[Microsoft Docs]]|seri=Changes to Functionality in Windows XP Service Pack 2|başlıknotu=[[Microsoft TechNet|TechNet]]}}</ref>

[[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ı (bilgisayar)|Truva atı]] için teorik olarak uygun bir vektör yapar, ancak JavaScript Truva atları pratikte nadirdir. <ref>For one example of a rare JavaScript Trojan Horse, see Symantec Corporation, [https://www.symantec.com/security_response/writeup.jsp?docid=2003-100111-0931-99 JS.]</ref> 

=== Donanım açıkları ===
2015 yılında, güvenlik araştırmacıları tarafından bir makalede, bir [[kürek çekiç|Rowhammer]] saldırısının JavaScript tabanlı bir kavram kanıtı uygulaması açıklanmıştır. <ref>{{Haber kaynağı|url=https://motherboard.vice.com/en_us/article/9akpwz/rowhammerjs-is-the-most-ingenious-hack-ive-ever-seen|başlık=Rowhammer.js Is the Most Ingenious Hack I've Ever Seen|erişimtarihi=January 26, 2018|arşivtarihi=January 27, 2018|arşivurl=https://web.archive.org/web/20180127084042/https://motherboard.vice.com/en_us/article/9akpwz/rowhammerjs-is-the-most-ingenious-hack-ive-ever-seen|yazarlar=Jean-Pharuns|tarih=July 30, 2015|çalışma=Motherboard|yayıncı=[[Vice (magazine)|Vice]]}}</ref> <ref>{{Web kaynağı|url=https://arstechnica.com/information-technology/2015/08/dram-bitflipping-exploit-for-attacking-pcs-just-add-javascript/|başlık=DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript|erişimtarihi=January 26, 2018|arşivtarihi=January 27, 2018|arşivurl=https://web.archive.org/web/20180127143154/https://arstechnica.com/information-technology/2015/08/dram-bitflipping-exploit-for-attacking-pcs-just-add-javascript/|tarih=August 4, 2015|çalışma=[[Ars Technica]]}}</ref> <ref>{{Web kaynağı|url=https://www.slate.com/articles/technology/bitwise/2015/07/rowhammer_security_exploit_why_a_new_security_attack_is_truly_terrifying.html|başlık=Rowhammer security exploit: Why a new security attack is truly terrifying|erişimtarihi=July 29, 2015|arşivtarihi=July 30, 2015|arşivurl=https://web.archive.org/web/20150730004023/https://www.slate.com/articles/technology/bitwise/2015/07/rowhammer_security_exploit_why_a_new_security_attack_is_truly_terrifying.html|tarih=July 28, 2015|çalışma=slate.com}}</ref>

2017 yılında, tarayıcı üzerinden JavaScript tabanlı bir saldırının [[Adres alanı düzeni rastgeleleştirme|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 (Güvenlik Açığı)|Spectre]] saldırılarını açıklayan makale bir JavaScript uygulamasını içeriyordu.

== Geliştirme araçları ==
Önemli araçlar dil ile birlikte gelişmiştir.

* Her büyük web tarayıcısında, JavaScript [[hata ayıklayıcı]] dâhil olmak üzere yerleşik [[web geliştirme araçları]] bulunur.
* [[ESLint]] ve [[JSLint]] gibi [[Statik program analizi|statik program analiz]] araçları, bir dizi standart ve yönergeye uygunluk için JavaScript kodunu tarar.
* Bazı tarayıcılarda yerleşik [[Profil oluşturma (bilgisayar programlama)|profil oluşturucular bulunur]]. Benchmark.js ve jsbench gibi bağımsız profil oluşturma kitaplıkları da oluşturulmuştur. <ref>{{Web kaynağı|url=https://benchmarkjs.com/|başlık=Benchmark.js|erişimtarihi=2016-11-06|arşivtarihi=2016-12-19|arşivurl=https://web.archive.org/web/20161219182724/https://benchmarkjs.com/|çalışma=benchmarkjs.com}}</ref> <ref name="auto1">{{Web kaynağı|url=https://jsben.ch|başlık=JSBEN.CH Performance Benchmarking Playground for JavaScript|erişimtarihi=2021-08-13|arşivtarihi=2021-02-27|arşivurl=https://web.archive.org/web/20210227052409/https://jsben.ch/|çalışma=jsben.ch}}</ref>
* Birçok [[metin düzenleyici]] (IDE), JavaScript kodu için sözdizimi vurgulama desteğine sahiptir.

== İlgili teknolojiler ==

=== Java ===
Yaygın bir yanılgı, JavaScript'in [[Java (programlama dili)|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 [[Sandbox (bilgisayar güvenliği)|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 {{Kod|Math}} ve {{Kod|Date}} objeleri Java 1.0'dan alınan sınıflara dayanır. <ref name="popularity">{{Web kaynağı|url=https://brendaneich.com/2008/04/popularity/|başlık=Popularity|erişimtarihi=January 19, 2012|arşivtarihi=July 3, 2011|arşivurl=https://web.archive.org/web/20110703020955/https://brendaneich.com/2008/04/popularity/|tarih=April 3, 2008}}</ref>

[[Java (programlama dili)|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 yazma|statik yazımı]] vardır, JavaScript'in yazımı ise [[Dinamik yazma|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ı programlama|sınıf tabanlıdır]], JavaScript'ler ise [[Prototip tabanlı programlama|prototip tabanlıdır]] . Son olarak, Java, Java 8'e kadar işlevsel programlamayı desteklemezken, JavaScript, [[Scheme|Scheme'den]] etkilenerek bunu başından beri yapmıştır.

=== JSON ===
[[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 ===
2017'den beri web tarayıcıları, bir [[JavaScript motoru|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|WebAssembly'yi]] desteklemektedir. <ref>{{Web kaynağı|url=https://visualstudiomagazine.com/articles/2017/11/06/edge-webassembly.aspx|başlık=Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine|erişimtarihi=2018-02-09|arşivtarihi=2018-02-10|arşivurl=https://web.archive.org/web/20180210002432/https://visualstudiomagazine.com/articles/2017/11/06/edge-webassembly.aspx|çalışma=Visual Studio Magazine}}</ref> WebAssembly kodu, normal JavaScript koduyla aynı [[Sandbox (bilgisayar güvenliği)|sanal]] alanda çalışır.

[[asm.js]], WebAssembly'nin öncüsü olarak hizmet veren bir JavaScript alt kümesidir. <ref>{{Web kaynağı|url=https://asmjs.org/faq.html|başlık=frequently asked questions|erişimtarihi=April 13, 2014|arşivtarihi=June 4, 2014|arşivurl=https://web.archive.org/web/20140604012024/https://asmjs.org/faq.html|yayıncı=asm.js}}</ref>

=== Aktarıcılar (Transpilers) ===
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ı|aktarıcılar]] oluşturulmuştur. <ref name="transpilers">{{Web kaynağı|url=https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS|başlık=List of languages that compile to JS|erişimtarihi=February 6, 2020|arşivtarihi=January 31, 2020|arşivurl=https://web.archive.org/web/20200131233044/https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS|çalışma=[[GitHub]]}}</ref>


== Kaynakça ==
== Kaynakça ==
{{Kaynakça}}
{{Kaynakça|2}}


== Dış bağlantılar ==
{{JavaScript}}
* {{Curlie|Computers/Programming/Languages/JavaScript/}}
{{Node.js}}
* {{Web kaynağı|url=https://www.pldi21.org/prerecorded_hopl.12.html|başlık=JavaScript: The First 20 Years|erişimtarihi=2022-02-06}}
{{JavaScript}}{{Web tarayıcıları}}{{Node.js}}


{{Otorite kontrolü}}


[[Kategori:JavaScript| ]]
[[Kategori:Web programlama]]
[[Kategori:Amerika Birleşik Devletleri icatları]]
[[Kategori:Betik dilleri]]
[[Kategori:Prototip tabanlı programlama dilleri]]
[[Kategori:Fonksiyonel programlama dilleri]]
[[Kategori:Fonksiyonel programlama dilleri]]
[[Kategori:1995 tanıtımları]]
[[Kategori:Dinamik tipli programlama dilleri]]
[[Kategori:Çapraz platform yazılımları]]
[[Kategori:Çapraz platform yazılımları]]
[[Kategori:Dinamik tipli programlama dilleri]]
[[Kategori:Amerika Birleşik Devletleri icatları]]
[[Kategori:Prototip tabanlı programlama dilleri]]
[[Kategori:JavaScript]]
[[Kategori:Betik dilleri]]
[[Kategori:Web programlama dilleri]]
[[Kategori:Web programlama]]

Sayfanın 04.02, 18 Mart 2022 tarihindeki hâli

JavaScript

JavaScript Logosu
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 (28 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ümECMAScript 2023[2] Bunu Vikiveri'de düzenleyin (Haziran 2023 (11 ay önce) (Haziran 2023))
Önizleme sürümüECMAScript 2025[3] Bunu Vikiveri'de düzenleyin (27 Mart 2024 (45 gün önce) (27 Mart 2024))
Tip sistemiDinamik, zayıf, ördek
Önemli uygulamalarıV8, JavaScriptCore, SpiderMonkey, Chakra
EtkilendikleriJava,[4][5] Scheme,[5] Self,[6] AWK,[7] HyperTalk[8]
EtkiledikleriActionScript, AssemblyScript, CoffeeScript, Dart, Haxe, JS++, Objective-J, Opa, TypeScript
Olağan dosya uzantıları
  • .js
  • .cjs
  • .mjs[9]
Web sitesiecma-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

Netscape'te Oluşturma

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

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

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

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ı

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 itibariyle, 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

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

Web sitesi istemci tarafı kullanımı

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

Kitaplıklar ve çerçeveler

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ı

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

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ış

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]

Zzayıf yazılmış

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

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ı)

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

Bir işlev 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

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

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.

Satıcıya özel uzantılar

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

Basit örnekler

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

/* 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

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ı

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

İ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

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ı

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ı

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ı

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ı

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

İlgili teknolojiler

Java

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

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

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)

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

  1. ^ Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
  2. ^ "ECMAScript® 2023 Language Specification". Haziran 2023. Erişim tarihi: 2 Mart 2024. 
  3. ^ "ECMAScript® 2025 Language Specification". 27 Mart 2024. Erişim tarihi: 17 Nisan 2024. 
  4. ^ Seibel, Peter (September 16, 2009). Coders at Work: Reflections on the Craft of Programming. ISBN 9781430219484. December 24, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: December 25, 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. 2020-02-27 tarihinde kaynağından arşivlendi. Erişim tarihi: 2017-11-21. 
  6. ^ "Popularity – Brendan Eich". 
  7. ^ "Brendan Eich: An Introduction to JavaScript, JSConf 2010". YouTube. s. 22m. August 29, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: November 25, 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.  Geçersiz |url-erişimi=registration (yardım)
  9. ^ "nodejs/node-eps". GitHub. 2020-08-29 tarihinde kaynağından arşivlendi. Erişim tarihi: 2018-07-05. 
  10. ^ "JavaScript". Dictionary.com. August 9, 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: August 9, 2021. 
  11. ^ JavaScript: the definitive guide (English). Beijing; Farnham: O'Reilly. 18 April 2011. s. 1. ISBN 978-1-4493-9385-4. OCLC 686709345. 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. 2021-08-13 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-04-09. 
  13. ^ a b c d "Usage statistics of JavaScript libraries for websites". w3techs.com. 2018-09-23 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-04-09. 
  14. ^ "ECMAScript® 2020 Language Specification". 2020-05-08 tarihinde kaynağından arşivlendi. Erişim tarihi: 2020-05-08. 
  15. ^ "Bloomberg Game Changers: Marc Andreessen". Bloomberg. March 17, 2011. May 16, 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: December 7, 2011. 
  16. ^ "The Evolution of the Web Browsers". Monmouth Web Developers. August 31, 2018. August 31, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: August 31, 2018. 
  17. ^ "Learn the History of Web Browsers". washingtonindependent.com. August 31, 2018. Erişim tarihi: August 31, 2018. 
  18. ^ "TechVision: Innovators of the Net: Brendan Eich and JavaScript". February 8, 2008 tarihinde kaynağından arşivlendi. 
  19. ^ Brendan Eich – CEO of Brave, June 17, 2016, February 10, 2019 tarihinde kaynağından arşivlendi, erişim tarihi: February 7, 2018 
  20. ^ a b "Chapter 5. Standardization: ECMAScript". speakingjs.com. 1 November 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 1 November 2021. 
  21. ^ a b "JavaScript, How Did We Get Here?". oreilly.com. April 6, 2001. July 19, 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: July 16, 2016. 
  22. ^ "Microsoft Internet Explorer 3.0 Beta Now Available". microsoft.com. Microsoft. May 29, 1996. November 24, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: July 16, 2016. 
  23. ^ "The Unwelcome Return of "Best Viewed with Internet Explorer"". technologizer.com. September 16, 2010. June 23, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: July 16, 2016. 
  24. ^ Baker (November 24, 2004). "Mozilla Firefox Internet Browser Market Share Gains to 7.4%". Search Engine Journal. May 7, 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: May 8, 2021. 
  25. ^ Weber (May 9, 2005). "The assault on software giant Microsoft". BBC News. September 25, 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 July 2009. May 1, 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: June 28, 2010. 
  27. ^ "Lifehacker Speed Tests: Safari 4, Chrome 2". Lifehacker. June 11, 2009. April 14, 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: May 8, 2021. 
  28. ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog". December 4, 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: July 22, 2020. 
  29. ^ "Mozilla asks, 'Are we fast yet?'". Wired. June 22, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: January 18, 2019. 
  30. ^ "ECMAScript 6: New Features: Overview and Comparison". es6-features.org. March 18, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: March 19, 2018. 
  31. ^ "The secret history behind the success of npm and Node". TheServerSide. 19 July 2018. 2 August 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 August 2021. 
  32. ^ "State of the Union: npm". Linux.com. 13 January 2017. 2 August 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 2 August 2021. 
  33. ^ a b "JavaScript Standard Moves to Yearly Release Schedule; Here is What's New for ES16". The New Stack. 2016-05-04. 2021-01-16 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-01-15. 
  34. ^ "The TC39 Process". tc39.es. Ecma International. 2021-02-07 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-01-15. 
  35. ^ "ECMAScript proposals". TC39. 2020-12-04 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-01-15. 
  36. ^ a b "List of languages that compile to JS". GitHub. January 31, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: February 6, 2020. 
  37. ^ "U.S. Trademark Serial No. 75026640". United States Patent and Trademark Office. 2021-07-13 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-05-08. 
  38. ^ "Legal Notices". Oracle Corporation. 2021-06-05 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-05-08. 
  39. ^ "Vanilla JS". vanilla-js.com. June 16, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: June 17, 2020. 
  40. ^ "Server-Side JavaScript Guide". Oracle Corporation. December 11, 1998. March 11, 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: May 8, 2021. 
  41. ^ "Introducing JScript .NET". Microsoft Developer Network. Microsoft. July 14, 2000. November 10, 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: April 10, 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. December 17, 2009. June 17, 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: July 16, 2016. 
  43. ^ "JavaScript for Acrobat". August 7, 2009 tarihinde kaynağından arşivlendi. Erişim tarihi: August 18, 2009. 
  44. ^ "Answering the question: "How do I develop an app for GNOME?"". 2013-02-11 tarihinde kaynağından arşivlendi. Erişim tarihi: 2013-02-07. 
  45. ^ "Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel". 2021-05-26 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-05-08. 
  46. ^ "Node.js Raspberry Pi GPIO Introduction". 2021-08-13 tarihinde kaynağından arşivlendi. Erişim tarihi: 2020-05-03. 
  47. ^ "Espruino – JavaScript for Microcontrollers". 2020-05-01 tarihinde kaynağından arşivlendi. Erişim tarihi: 2020-05-03. 
  48. ^ JavaScript: The Definitive Guide: The Definitive Guide. "O'Reilly Media, Inc.". August 17, 2006. s. 16. ISBN 978-0-596-55447-7. August 1, 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: March 29, 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.  Kaynak hatası: Geçersiz <ref> etiketi: "casting_rules" adı farklı içerikte birden fazla tanımlanmış (Bkz: Kaynak gösterme)
  50. ^ "Wat". www.destroyallsoftware.com. October 28, 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: October 28, 2019. 
  51. ^ "JavaScript data types and data structures – JavaScript | MDN". Developer.mozilla.org. February 16, 2017. March 14, 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: February 24, 2017. 
  52. ^ a b Flanagan 2006.
  53. ^ "Inheritance and the prototype chain". Mozilla Developer Network. Mozilla. April 25, 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: April 6, 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 August 2011. 5 April 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: April 6, 2013. 
  57. ^ Effective JavaScript. Addison-Wesley. 2013. ss. 125–127. ISBN 978-0-321-81218-6. 
  58. ^ "Function – JavaScript". MDN Web Docs (İngilizce). Erişim tarihi: 2021-10-30. 
  59. ^ "Properties of the Function Object". Es5.github.com. January 28, 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: May 26, 2013. 
  60. ^ "Home | CocktailJS". Cocktailjs.github.io. February 4, 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: February 24, 2017. 
  61. ^ "Concurrency model and Event Loop". Mozilla Developer Network. September 5, 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: August 28, 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. February 14, 2014. July 24, 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: July 13, 2014. 
  64. ^ "var – JavaScript – MDN". The Mozilla Developer Network. December 23, 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: December 22, 2012. 
  65. ^ "let". MDN web docs. Mozilla. May 28, 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: June 27, 2018. 
  66. ^ "const". MDN web docs. Mozilla. June 28, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: June 27, 2018. 
  67. ^ "ECMAScript Language Specification – ECMA-262 Edition 5.1". Ecma International. November 26, 2012 tarihinde kaynağından arşivlendi. Erişim tarihi: December 22, 2012. 
  68. ^ "console". Mozilla Developer Network. Mozilla. February 28, 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: April 6, 2013. 
  69. ^ "arguments". Mozilla Developer Network. Mozilla. April 13, 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: April 6, 2013. 
  70. ^ "Import & Export Modules in javascript". Learnersbucket.com. April 23, 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: April 23, 2019. 
  71. ^ "Making JavaScript Safe for Advertising". ADsafe. 2021-07-06 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-05-08. 
  72. ^ "Secure ECMA Script (SES)". May 15, 2013 tarihinde kaynağından arşivlendi. Erişim tarihi: May 26, 2013. 
  73. ^ "Google Caja Project". Google. 2021-01-22 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-07-09. 
  74. ^ "Mozilla Cross-Site Scripting Vulnerability Reported and Fixed – MozillaZine Talkback". Mozillazine.org. August 22, 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: February 24, 2017. 
  75. ^ "Right-click "protection"? Forget about it". June 17, 2008. ISSN 1797-1993. August 9, 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: June 17, 2008. 
  76. ^ "Why You Should Never Put Sensitive Data in Your JavaScript". ServiceObjects Blog. ServiceObjects. June 3, 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: June 3, 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. December 21, 2016. doi:10.14722/ndss.2017.23414. ISBN 978-1-891562-46-4. March 29, 2017 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: February 22, 2017. 
  78. ^ Collins (March 27, 2016). "How one programmer broke the internet by deleting a tiny piece of code". Quartz. February 22, 2017 tarihinde kaynağından arşivlendi. Erişim tarihi: February 22, 2017. 
  79. ^ "Buffer-overflow bug in IE". CNET. August 19, 1998. December 25, 2002 tarihinde kaynağından arşivlendi. 
  80. ^ "Protected Mode in Vista IE7 – IEBlog". Blogs.msdn.com. February 9, 2006. January 23, 2010 tarihinde kaynağından arşivlendi. Erişim tarihi: February 24, 2017. 
  81. ^ "Part 5: Enhanced Browsing Security". Microsoft Docs. Changes to Functionality in Windows XP Service Pack 2. 2004-08-09. Erişim tarihi: 2021-10-20. 
  82. ^ For one example of a rare JavaScript Trojan Horse, see Symantec Corporation, JS.
  83. ^ Jean-Pharuns (July 30, 2015). "Rowhammer.js Is the Most Ingenious Hack I've Ever Seen". Motherboard. Vice. January 27, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: January 26, 2018. 
  84. ^ "DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript". Ars Technica. August 4, 2015. January 27, 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: January 26, 2018. 
  85. ^ "Rowhammer security exploit: Why a new security attack is truly terrifying". slate.com. July 28, 2015. July 30, 2015 tarihinde kaynağından arşivlendi. Erişim tarihi: July 29, 2015. 
  86. ^ "Benchmark.js". benchmarkjs.com. 2016-12-19 tarihinde kaynağından arşivlendi. Erişim tarihi: 2016-11-06. 
  87. ^ "JSBEN.CH Performance Benchmarking Playground for JavaScript". jsben.ch. 2021-02-27 tarihinde kaynağından arşivlendi. Erişim tarihi: 2021-08-13. 
  88. ^ "Popularity". April 3, 2008. July 3, 2011 tarihinde kaynağından arşivlendi. Erişim tarihi: January 19, 2012. 
  89. ^ "Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine". Visual Studio Magazine. 2018-02-10 tarihinde kaynağından arşivlendi. Erişim tarihi: 2018-02-09. 
  90. ^ "frequently asked questions". asm.js. June 4, 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: April 13, 2014. 

Dış bağlantılar