JavaScript

JavaScript (genellikle JS olarak kısaltılır), HTML ve CSS ile birlikte World Wide Web'in temel teknolojilerinden biri olan programlama dilidir. Web sitelerinin %97'sinden fazlası, web sayfası hareketleri için istemci tarafında JavaScript kullanırlar ve kullanılan kodlar genellikle üçüncü taraf kitaplıkları içerir. 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. 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 yaygın ç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. 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. 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. 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. 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. 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ü. === 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ı. 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ı. 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ı. === 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ı. 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ı. 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ı. 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ü. En önemli yenilik tam zamanında derlemeydi (JIT), bu nedenle diğer tarayıcı satıcılarının motorlarını JIT için elden geçirmeleri gerekiyordu. 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 derlemesiyle sonuçlandı. Node.js'nin 2009 yılında Ryan Dahl tarafından oluşturulması, JavaScript'in web tarayıcıları dışında kullanımında önemli bir artışa yol açtı. Node, V8 motorunu, bir olay döngüsünü ve I/O API'lerini birleştirerek bağımsız bir JavaScript çalışma zamanı sistemi sağlamaktaydı. 2018 itibarıyla, Node milyonlarca geliştirici tarafından kullanılıyordu ve npm dünyadaki herhangi bir paket yöneticisinden çok daha fazla modüle sahipti. 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. Dildeki olası revizyonlar, kapsamlı bir teklif süreciyle incelenir. Artık, sürüm numaraları yerine geliştiriciler, gelecek özelliklerin durumunu tek tek kontrol etmektedirler. 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. == Ticari Marka == "JavaScript" adı, Oracle Corporation'ın Amerika Birleşik Devletleri'ndeki ticari markasıdır . == Web sitesi istemci tarafı kullanımı == JavaScript, web sitelerinin % 97'sinin bu amaçla kullandığı, Web'in baskın istemci tarafı komut dosyası dilidir. 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 === * Ajax veya WebSocket aracılığıyla sayfayı yeniden yüklemeden yeni web sayfası içeriği yükleme. Örneğin, sosyal medya 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ı oyunları oynama. * Akış ortamının oynatılmasını kontrol etme. * Açılan (pop-up) reklamlar oluşturma. * Veriler bir web sunucusuna gönderilmeden önce bir web formunun giriş değerlerinin 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 analiz, 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 kitaplığı veya web çerçevesi kullanırlar. jQuery, web sitelerinin %75'inden fazlası tarafından kullanılan açık ara en popüler kitaplıktır. 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. 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. == 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 idi, ancak bunlar küçük özelliklerdi. 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ı. 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 ve JavaScript ile yazılmış GNOME Shell uzantılarını içerir. JavaScript, son zamanlarda bazı gömülü sistemlerde, genellikle Node.js'den yararlanılarak görünmeye başladı. == Ö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. === Zayı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. * İ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: * 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. Ö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/array) `+` `[]` (boş dizi/array) `""` (boş string/dize) `[]` (boş dizi/array) `+` `{}` (boş obje/nesne) `"[object Object]"` (dize/string) `false` (boole/doğru-yanlış) `+` `[]` (boş dizi/array) `"false"` (dize/string) `"123"` (dize/string) `+` `1` (sayı/number) `"1231"` (dize/string) `"123"` (dize/string) `-` `1` (sayı/number) `122` (sayı/number) `"123"` (dize/string) `-` `"abc"` (dize/string) `NaN` (sayı/number) 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 (tekli) `+` 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. === 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. JavaScript, ördek yazımı dâhil, objelerin türünü test etmenin çeşitli yollarını destekler. ; Ç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. JavaScript'te prototiplerle birçok sınıf tabanlı özelliği simüle etmek mümkündür. ; 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. 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). `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. ; 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 fonksiyon birinci sınıftır ; bir fonksiyon bir obje olarak kabul edilir. Bu nedenle, bir fonksiyonun `.call()` ve `.bind()` gibi özellikleri ve metotları olabilir. İç 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. . 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 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 `