İlk bölümde degiskenler altında üç çeÅit deÄiÅken tanımlama yöntemi olduÄundan bahsedilmiÅti.
letconstvar
let ve const Sözcüksel Ortam anlamında birbiri ile tam olarak aynıdır.
Fakat var bunlardan çok farklıdır. Bunun dilin ilk oluÅmaya baÅladıÄı zamanlara dayanır. Genelde modern stilde pek kullanılmazlar fakat yine de arada sırada görebilirsiniz.
EÄer böyle bir yazımla karÅılaÅmayacaÄınıza eminseniz bu bölümü geçebiir veya sonra tekrar gelebilirsiniz.
İlk görüÅte var let ile benzer Åekilde çalıÅıyormuÅ gibi görünür. İkisi de deÄiÅken tanımlamaya yarar:
function selamVer() {
var terim = "Merhaba"; // yerel deÄiÅken "let" yerine "var" kullanılmıÅtır.
alert(terim); // Merhaba
}
selamVer();
alert(terim); // Hata! terim tanımlı deÄil.
â¦Fakat farklılık tam da burada ortaya çıkar.
âvarâ'ın blok kapsamı yoktur
var ya fonksiyon içinde yada globalde tanımlanır, diÄer türlü tüm bloklar içerisinden eriÅilebilir.
ÃrneÄin:
if (true) {
var test = true; // "let" yerine "var" kullanıldı
}
alert(test); // true, deÄiÅken if'ten sonra da varlıÄına devam etti.
EÄer 2. satırda let test kullanılsaydı alert içerisinde görünür olmazdır. Fakat var kod bloÄunu görmezden gelir. Bundan dolayı global bir test deÄiÅkeni olmuÅ olur.
Aynı Åekilde döngüler için de var döngünün dıÅında da eriÅilebilirdir:
for(var i = 0; i < 10; i++) {
// ...
}
alert(i); // 10,"i" döngüden sonra görülebilirdir, evrensel deÄiÅken olarak çalıÅır.
EÄer fonksiyonun içinde bir if bloÄu varsa bu durumda var fonksiyon seviyesinde bir deÄiÅken olur:
function selamVer() {
if (true) {
var terim = "Merhaba";
}
alert(terim); // çalıÅıyor
}
selamVer();
alert(terim); // Hata: terim tanımlı deÄildir.
EÄer if, forâa raÄmen çalıÅan var deÄiÅkenleri görürseniz bunun nedeni önceden JavaScriptâte blokların Sözcüksel Ortama dahil olmamasındandır.
âvarâ fonksiyon çalıÅmaya baÅladıÄında iÅlenir.
var tanımları fonksiyon ( veya script ) çalıÅtıÄında tanımlanır.
DiÄer bir deyiÅle var deÄiÅkenleri fonksiyon baÅlangıcında tanımlanır, tanımın nerede olduÄu önemli deÄil. ( iç içe fonksiyonları hariç tabi )
AÅaÄıdaki koda bakarsanız:
function selamVer() {
terim = "Merhaba";
alert(terim);
var terim;
}
â¦Teknik olarak aÅaÄıdaki gibidir.
function selamVer() {
var terim;
terim = "Merhaba";
alert(terim);
}
â¦Hatta Åu Åekilde de olabilir:
function selamVer() {
terim = "Merhaba"; // (*)
if (false) {
var terim;
}
alert(terim);
}
Bu davranıÅa âyükseltilmeâ davranıÅı da denir, çünkü tüm var ile tanımlamalar fonksiyonun baÅına âyükseltilmeâ
Bundan dolayı yukarıdaki örnekte if(false) hiçbir zaman çalıÅmayacaktır, zaten önemli de deÄildir. İçinde bulunan var fonksiyonun baÅında iÅlenir. Yani (*) anında zaten terim deÄiÅkeni vardır.
Tanımlar yükseltilir fakat atamalar yükseltilmez
Bir örnekle göstermek gerekirse:
function selamVer() {
alert(terim);
var terim = "Merhaba";
}
selamVer();
var terim = "Merhaba" iki tane aksiyon barındırır:
- DeÄiÅken tanımlama
var - DeÄiÅken atama
=.
Tanımlama âyükseltilmeâ iÅlemi ile fonksiyon baÅlangıcında yapılır. Fakat atama kod neredeyse orada yapılır. Bundan dolayı kod aslında tam olarak aÅaÄıdaki gibi çalıÅır:
function selamVer() {
var terim; // tanımalma baÅlangıçta çalıÅır.
alert(terim); // tanımsız
terim = "Merhaba"; // ...atama burada yapılır.
}
selamVer();
Tüm var tanımları fonksiyon baÅladıÄında iÅlendiÄinden dolayı, istenildiÄi yerlere bu deÄiÅkenlere eriÅim bulunmaktadır. Fakat deÄiÅkenler atama yapılana kadar tanımsızdır ( undefined ).
Yukarıdaki her iki alert örneÄi de hatasız çalıÅmaktadır çünkü terim mevcuttur. DeÄeri atanmadıÄından undefined göstermiÅtir.
Ãzet
varâın iki tane ana farklılıÄı mevcuttur:
- DeÄiÅkenlerin blok limiti yoktur. En düÅük fonksiyon içerisinden görünebilirler. Yani aynı fonksiyon içerisinde farklı bir bloÄun içinde yazılsa bile fonksiyon içinden eriÅilebilmektedir.
- DeÄiÅkenlerin tanımlanması fonksiyon baÅladıÄında gerçekleÅir.
Evrensel obje söz konusu olduÄunda bir farklılık bulunmaktadır bunu bir sonraki bölümde göreceÄiz.
Bu farklılıklar aslında kötüdür. Ãncelikle blok seviyesinde deÄiÅken yaratılmamaktadır. âYükseltmeâ olayı hataya neden olabilmektedir. Bundan dolayı yeni kodlarda var çok nadir olarak kullanılır.
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)