var’dan const-let’e

ES5’te değişkenleri var (variable) ile tanımlarız. Bu değişkenler fonksiyon scopedtur (fonksiyon kapsamlıdır). varın davranışı zaman zaman kafa karıştırıcı olabilir. Örneğin:

var x = 3;
function func(randomize) {
  if (randomize) {
    var x = Math.random(); // (A) scope: tüm fonksiyon
    return x;
  }
  return x; // A satırından x'e erişir
}
func(false); // undefined

func() fonksiyonunun undefined çıktısını vermesi şaşırtıcı olabilir. Kodu şu şekilde yeniden yazarsak bunun sebebini daha iyi anlayabiliriz:

var x = 3;
function func(randomize) {
  var x;
  /*
    'var' ile oluşturulan değişkenler fonksiyon kapsamlı olduğundan
    x değişkeni 'func()' fonksiyonu içerisinde tanınır.
    return x yapıldığında x'e değer atanmamış olduğundan 'undefined' sonucu döner.
    Fonksiyon dışında tanımlanmış olan ´var x = 3;´ değerini okuyamaz.
  */
  if (randomize) {
    x = Math.random();
    return x;
  }
  return x;
}
func(false); // undefined

ES6’da, değişkenleri let ve const aracılığı ile oluşturabiliriz. Bu değişkenler block-scopedtur (blok kapsamlıdır). const, var gibi çalışır fakat değeri değiştirilemezdir.

let x = 3;
function func(randomize) {
  if (randomize) {
    let x = Math.random();
    return x;
  }
  return x; // (A)
}
func(false); // 3

/*
  ´funk()´ fonksiyonunda (A) ile işaretlenmiş satırda return x ifadesi çalışır.
  ´let´ ile tanımlanmış olan x değişkeni fonksiyon içerisinde de tanınır.
  Bu yüzden 3 sonucunu return edebilir.
*/

Kodda var ile tanımladığınız değişkenleri refactoring sırasında let yada consta düzenlerken dikkatli olmalısınız.

Sıradaki Konu: IIFEs’den blocklara