JavaScript dili yazılırken âevrensel objeâ diye bir obje fikri vardı. Bu obje tüm deÄiÅken ve fonksiyonları içinde barındırarak tarayıcıda bulunan kodların evrensel obje yardımıyla deÄiÅkenleri paylaÅabileceÄi düÅünülmüÅtü.
Tabi o zamandan beri JavaScript çok deÄiÅti, artık evrensel obje göze batar oldu. Modern JavaScriptâte bu objenin yerini module yapısı aldı.
Evrensel obje hala dil içerisinde yer almaktadır.
Tarayıcı için bu âwindowâ ve NodeJs için ise âglobalâ'dir. DiÄer ortamlar da kendine ait evrensel objelere sahiptirler.
İki Åeyi yapmaktadır:
-
Dil dahilindeki fonksiyon ve deÄiÅkenlere eriÅim saÄlar. ÃrneÄin,
alertdoÄrudan veyawindowâun bir metodu olarak çaÄırılabilir.alert("Merhaba"); // aynısı window.alert("Merhaba");Bu aynı Åekilde diÄer dahili fonksiyon ve deÄiÅkenler için de geçerlidir. ÃrneÄin
Arrayyerinewindow.Arraykullanılabilir. -
Global
vardeÄiÅkeni tanımlamaya olanak tanır.windowözellikleri ile okuma ve yazma saÄlanabilir. ÃrneÄinvar selam = "Merhaba"; function selamVer() { alert(selam); } // window'dan okunabilir alert( window.terim ); // Merhaba (global var) alert( window.selamVer ); // function (global function declaration) // window'a yazılabilir. (yeni global deÄiÅken oluÅturur.) window.test = 5; alert(test); // 5
â¦Fakat global obje let/const ile tanımlanmıŠdeÄiÅkenler barındıramaz.
let kullanici = "Ahmet";
alert(kullanici); // Ahmet
alert(window.kullanici); // tanımsız, let ile tanımlama yapılamaz.
alert("kullanici" in window); // false
ECMAScript ES-2015 öncesi let/const deÄiÅkenleri bulunmamaktaydı, sadece var deÄiÅkeni vardı. Global objeler global ortam kaydı olarak kullanılıyordu.
Fakat ES-2015 sonrası, bu varlıklar ayrıldı. Artık evrensel sözcük ortamı ve bunun ortam kaydı. İkinci olarak evrensel obje ve bunun sunduÄu bazı âevrensel deÄiÅkenlerâ bulunmaktadır.
Uygulamada evrensel let/const deÄiÅkenleri global Evrensel Kayıtta tanımlanmıŠözelliklerdir fakat evrensel objeâde bulunmamaktadırlar.
DoÄal olarak, evrensel objenin âevrensel olan her Åeye eriÅebilirâ fikri eski zamanlarda kalmıÅtır. Artık bu iyi bir Åey olarak görülmemektedir. let/const gibi dil özellikleri bunu desteklememektedir, fakat eski olanlara hala destek verir.
âwindowâ'un kullanım alanları
Node.JS gibi sunucu ortamlarında, global obje çok az kullanılır. Hatta hiçbir zaman diyebiliriz.
Buna raÄmen window bazı durumlarda kullanılmaktadır.
Genelde, kullanmak çok iyi bir fikir olmasa da, aÅaÄıda bazı örnekleri görebilirsiniz.
-
EÄer evrenselde bulunan deÄiÅken ile fonksiyon içindeki deÄiÅken ismi aynı ise;
var kullanici = "Evrensel"; function selamVer() { var kullanici = "Yerel"; alert(window.kullanici); // Evrensel } selamVer();Bu sizi çözüme ulaÅtırır fakat deÄiÅkenlere farklı isimler vermek daha iyidir, böylece
windowkullanmanıza gerek kalmaz. Ayrıca dikkat edersenizkullanicitanımlamak içinvarkullanılmıÅtır.letkullanılmıŠolsaydıwindowâdan bu deÄeri alamazdınız. -
Global bir deÄiÅkenin var olup olmadıÄına bakar.
ÃrneÄin,
XMLHttpRequestâin global bir fonksiyon olup olmadıÄını kontrol etmek isterseniz,if (XMLHttpRequest)Åeklinde yazamazsınız, çünküXMLHttpRequestyoksa hata verecektir.Bunu
window.XMLHttpRequestüzerinden okuyabilirsiniz.if (window.XMLHttpRequest) { alert('XMLHttpRequest tanımlı!') }EÄer böyle bir global fonksiyon olmasaydı
undefineddönerdi.windowolmadan da bunu test etmek mümkündür:if (typeof XMLHttpRequest == 'function') { /* XMLHttpRequest? fonksiyonu var mı? */ }Burada
windowkullanılmasa da (teorik olarak) daha az güvenilirdir, çünkütypeofyerel XMLHttpRequest kullanabilir, halbuki biz evrensel olanını kontrol etmek istiyoruz. -
DoÄru pencereden deÄiÅken alma. Bu en uygun kullanım Åeklidir.
Tarayıcıda birçok sekme ve pencere açılabilir. Bir pencere diÄerini
<iframe>içerisinde gösterebilir. Her tarayıcı kendine aitwindowobjesine ve bunun global deÄiÅkenlerine sahiptir. JavaScript pencerelerin (aynı site içerisinde ise) birbirlerinden deÄiÅken almalarına izin verir.Bu biraz amacının dıÅında da olsa Åuna benzer:
<iframe src="/" id="iframe"></iframe> <script> alert( innerWidth ); // içerideki boyutu alır ( sadece tarayıcı için) alert( Array ); // o anki pencerenin dizisini alır.get Array of the current window (javascript core builtin) // when the iframe loads... iframe.onload = function() { // iframe'in geniÅliÄini al alert( iframe.contentWindow.innerWidth ); // iframe penceresinin dizisini al. alert( iframe.contentWindow.Array ); }; </script>Burada ilk iki alert var olan pencereyi kullanmaktadır, geriye kalan iki tanesi de
iframeâden deÄiÅken almaktadır. Bu eÄeriframeaynı protocol/host/portâtan besleniyor ise herhangi bir deÄiÅken olabilir.
âthisâ ve evrensel objeler
Bazen, thisâin deÄeri tamamen evrensel obje olur. Bu çok nadir de olsa bazı kod sayfalarında görülmektedir.
-
Tarayıcıda
thisâin global alandaki deÄeriwindowâdur:// fonksiyonların dıÅında alert( this === window ); // trueTarayıcı olmayan çevrelerde ise,
thisiçin farklı deÄer kullanabilirler. -
Sıkı olmayan modda bir fonksiyon
thisçaÄırırsa, evrensel obje olanthisâi kabul eder:// Sıkı modda deÄil (!) function f() { alert(this); // [object Window] } f(); // obje olmadan çaÄırıldı.Tanım gereÄi,
thisbu durumda evrensel obje olmalı, Node.JS ortamında olmasa bilethisevrensel objedir. Bu eski kodlar ile uyumluluk amacıyladır, sıkı moddathistanımsız olabilir.
Polyfillâler İçin Kullanma
Modern dil özelliklerinin desteÄini test etmek için global nesneyi kullanıyoruz.
ÃrneÄin, yerleÅik bir âPromiseâ nesnesinin olup olmadıÄını test edelim (gerçekten eski tarayıcılarda yoktur):
if (!window.Promise) {
alert("Senin tarayıcın gerçekten çok yaÅlı");
}
Hiçbiri yoksa (örneÄin, eski bir tarayıcıdayız), âpollyfills(çoklu dolgular)â oluÅturabiliriz: çevre tarafından desteklenmeyen, ancak modern standartta var olan iÅlevler ekleyebiliriz.
if (!window.Promise) {
window.Promise = ... // modern dil özelliÄinin özel uygulaması
}
Ãzet
-
Global nesne, her yerde bulunması gereken deÄiÅkenleri tutar.
Buna âArrayâ gibi JavaScript yerleÅikleri ve âwindow.innerHeightâ gibi ortama özgü deÄerler â tarayıcıdaki pencere yüksekliÄi dahildir.
-
Global nesnenin evrensel bir adı âglobalThisâ vardır.
â¦Ancak daha sık olarak âwindow(tarayıcı)â ve âglobal(Node.js)â gibi âeski tarzâ çevreye özgü adlarla anılır. âglobalThisâ yeni bir teklif olduÄundan, Chromium Edge dıÅında desteklenmemektedir (ancak polyfilled olabilir).
-
DeÄerleri yalnızca projemiz için gerçekten küresellerse global nesnede saklamalıyız. Ve sayılarını minimumda tutun.
-
Tarayıcıda, modules kullanmadıÄımız sürece, âvarâ ile bildirilen global iÅlevler ve deÄiÅkenler global nesnenin bir özelliÄi haline gelir.
-
Kodumuzu geleceÄe dönük ve daha kolay anlaÅılır kılmak için global nesnenin özelliklerine doÄrudan âwindow.xâ olarak eriÅmeliyiz.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)