Javascript 2 | Variables — Var, Let, Const

Ömer Çelik
3 min readNov 30, 2019

--

Konuya başlamadan önce belirtmeliyim ki artık değişken tanımlarken var keyword’ünün kullanılması tavsiye edilmiyor. Bazı sakıncalı durumlara yol açabiliyor. Birazdan bu konuda örnekler vermeye çalışacağım.

Javascript’teki variable’ları açıklamadan önce öncelikli olarak scope kavramından bahsetmek istedim.
Global Scope
Herhangi bir if,for, function içerisinde olmayan genel olan scope’dur.

Block Scope
if,for,while blogunun scope’u.

Function Scope
Adı üstünde function’ların scope’udur. Ancak var’a özel durumlar vardır. Mesela if bloğunun içinde var keyword’u ile tanımlanmış olan bir variable’a o if bloğunun dışından da erişebiliriz. Çünkü var function scope’dur. Eğer bir function içerisindeki if’in içinde tanımlandıysa o function’ın herhangi bir yerinde erişebiliriz. Ancak o function dışına çıktığı an lifecycle’ı biter ve erişemeyiz.

Var
var
‘in scope’u function scope’dur.
var
birden fazla tanımlanabilir. var’i bir block(if,for,while) içerisinde tanimlasak ve dışarıda erişmeye çalışırsak erişebiliriz. Ancak let ve const’a erişemeyiz.
Yani bir function, bir loop, bir if blogu vb. içerisinde var tanımlarsak bunlara bu block’lar dışarısından da erişebiliriz. Ancak let ve const böyle çalışmaz.

Değişkenleri var olarak istediğimiz key aynı isimle tanımlayabilir veya istediğimiz kadar atama yapabiliriz. (Yukarıda gösterildiği gibi.)

var’ın hataya açık olan bazı durumları vardır. Biz block scope (if , for vb.) içerisinde tanımladığımız bir değişken ismini o scope dışında kullanmaya çalışırsak beklemediğimiz bir durum oluşur.
Örnek :

Çıktı :
In For Loop : 0
In For Loop : 1
In For Loop : 2
In For Loop : 3
In For Loop : 4
In For Loop : 5
Outside For Loop : 6
index.js:9 Uncaught ReferenceError: i is not defined
at index.js:9

Burada for loop dışındayken i değişkeninin 6 olmasını beklemiyorduk. Bu i değişkenini bu method kapsamındayken başka bir işlem için kullanıp hataya sebep olabiliriz.

Örnek 2 :

Ancak bu hatayı const ve let ile yaşamayız. Onlar block scope’tur. Ve o block sonlandığı an yaşamları sona erer.

Burada görmüs olduk ki var ile en dışta tanımlanan değişken block yada function içerisinden tekrar tanımlanıp bir değer atandığında en dıştaki değişkeninde değeri değişiyor.. Bu bizi hataya açık bir durum haline getirmis oluyor. Ancak let yada const ile tanımlandığında bunların scope’u en dıştaki değişkenin scope’undan farklı olduğu için içte tekrar o değişken tanımlandığında en dıştaki değişken etkilenmedi.

Bu sebeplerden dolayı var kullanılması sakıncalıdır. Mümkünse artık let ve const kullanmanızı tavsiye ederim.

const ve let değişken türleri ise neredeyse aynıdır. Yalnızca const degişken türünde sadece bir kez atama yapilir. O da ilk tanimlandiği zaman.
Daha sonradan bir atama yapıldığı zaman const variable hata atar.

Ancak burada dikkat edilmesi gereken bir nokta var. a primitive bir veri tipi ve sadece değeri tutuyor. Doğal olarak 2. bir atama yapıldığında o değeri değiştirmeye çalıştığımız için hata atar.
b ise bir reference veri tipidir. O dizinin bulunduğu adresi tutar.

Güzel bir örnek ile açıklayalım ;
b= [1,2,3,4] dediğimizde bu adresi değiştirdiğimiz için hata atar.
Ancak söyle bir atama yaptığımızda ;
b.push(5);
Böyle bir atama yapıldığında hata atmaz. Çünkü b’nin baktığı adres değişmedi, sadece o adreste bulunan değerler değişti. Adres değişmediği için ve b adres tuttuğu için b’ye 2. değer atanmadı. Ve böylelikle hata atmadı. Bu tüm reference veri tiplerinde geçerlidir.
Ayni sekilde bir örnek daha verelim ;

Bu örnekte de hata atmaz. Çünkü kullanıcı değişkeni hafızadaki bir reference değerini gösteriyor. Ve bu kullanıcı değişkenine yeni bir reference değeri atanmadı. Sadece gösterilen reference’in içerisindeki değer de değişiklikler yapıldı. Bu yüzden de hata atmadı.

Eğer ihtiyacımıza göre const ile bir obje tutup o objenin değişkenlerinin değerlerinin değişmesini istemiyorsak özel işlemler yapmamız gerekir. Ancak bunu yapabiliriz. İlerleyen bölümlerde bunu da inceleyeceğim.

Makalelerimin tamamına erişmek isteyen arkadaşlar için hepsinin linkinin bulunduğu bir tutorial hazırladım. Aşağıdaki linkte paylaşıyorum.

https://medium.com/@omercelikceng/javascript-makalelerimin-tamam%C4%B1-45a71ac3b386

--

--