JavaScript'te İsimli Fonksiyon İfadeleri

Diyelim ki şöyle bir fonksiyon ifademiz var:

javascriptlet test = function() {
  console.log('!');
};

test(); // '!' yazdıracak

Fonksiyonumuza func adını verelim:

javascriptlet test = function func() {
  console.log('!');
};

test();

Zaten bildiğiniz gibi, bu isimle fonksiyona erişilemez:

javascriptlet test = function func() {
  console.log('!');
};

test(); // '!' yazdıracak
func(); // hata verecek

Erişilemeyecekse fonksiyona neden isim verelim? Çünkü bu isim fonksiyonun dışından erişilemez olacak, ancak fonksiyonun içinden erişilebilir olacak.

Kontrol edelim:

javascriptlet test = function func() {
  console.log(func); // fonksiyon kendi kaynak kodunu yazdıracak
};

test(); // fonksiyonu çağırıyoruz

Fonksiyonumuzu kendi içinden çağıralım:

javascriptlet test = function func() {
  console.log('!'); // '!' yazdırıyoruz
  func(); // kendimizi çağırıyoruz
};

test();

Bu kodu çalıştırırsanız, konsola sonsuz sayıda çıktı yazdırılacaktır.

Aslında fonksiyonumuz kendi içinden sadece func olarak değil, aynı zamanda test olarak da çağrılabilir:

javascriptlet test = function func() {
  console.log('!');
  test(); // kendimizi çağırıyoruz
};

test();

Peki fark nedir? Fark şu ki, test ismi sadece bir değişkendir. Script çalışırken fonksiyonumuz başka bir değişkene yazılabilir veya parametre olarak iletilebilir - bu durumda test değişkeni ile fonksiyon arasındaki bağlantı kopabilir.

func ismi ise, fonksiyonun kendi içinden kendisine erişebilmesi için özellikle fonksiyona sıkı bir şekilde bağlanmıştır.

Fonksiyon ismi olan bu tür Function Expression'lara isimli fonksiyon ifadeleri denir.