JavaScript Fonksiyonları: function Deklarasyonu vs Arrow Functions

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16
JavaScript'te fonksiyon tanımlamanın birden fazla yolu vardır. Yıllardır kullandığımız klasik function anahtar kelimesi ile ES6 (2015) sonrası hayatımıza giren ve modern projelerin vazgeçilmezi olan Arrow Functions (Ok Fonksiyonları) arasındaki farkları bilmek, sizi "kod yazan" birinden "kodun mantığını bilen" bir yazılımcıya dönüştürür.

Hadi, bu iki yapının arasındaki ince ama kritik farklara yakından bakalım.

1. Yazım (Syntax) Farklılıkları​


İlk göze çarpan fark, kodun kısalığıdır. Arrow functions, daha temiz ve okunabilir bir yazım sunar.

Klasik Fonksiyon (Function Declaration):
JavaScript:
function selamla(isim) {
return "Merhaba " + isim;
}

Arrow Function:
JavaScript:
const selamla = (isim) => {
return Merhaba ${isim};
};

// Eğer tek bir işlem yapılıyorsa parantezlere ve 'return'e bile gerek yok!
const selamlaKısa = isim => Merhaba ${isim};

İpucu: Arrow function kullanırken tek bir parametre varsa parantezleri () kaldırabilir, tek bir satır dönecekseniz süslü parantezleri {} ve return kelimesini silebilirsiniz.

2. En Kritik Fark: "this" Bağlamı (Context)​


Yeni başlayanlar için en kafa karıştırıcı, ancak en önemli fark budur.


  • []Klasik Fonksiyonlar: Kendi this bağlamına sahiptirler. Fonksiyonun nasıl çağrıldığına bağlı olarak this değişebilir. Özellikle olay izleyicilerinde (event listeners) veya nesne metotlarında kafa karışıklığı yaratabilir.
    []Arrow Functions: Kendi this bağlamları yoktur. Bunun yerine, tanımlandıkları kapsamdaki (lexical scope) this değerini miras alırlar.

JavaScript:
const user = {
name: "Gemini",
friends: ["Ali", "Ayşe"],

listFriends: function() {
    // Klasik fonksiyonda 'this', 'user' nesnesini gösterir.
    this.friends.forEach(function(friend) {
        // BURADA HATA OLABİLİR! 
        // Bu iç fonksiyonun kendi 'this'i vardır ve artık 'user'ı tanımaz.
        console.log(this.name + " arkadaşı: " + friend); 
    });
},

listFriendsNew: function() {
    // Arrow function, dışarıdaki (user) 'this'i miras alır.
    this.friends.forEach((friend) => {
        console.log(`${this.name} arkadaşı: ${friend}`); // Sorunsuz çalışır!
    });
}

};

3. Hoisting (Yukarı Çekme)​


Kodun çalışma sırası açısından bu iki yapı farklı davranır:


  • []Function Declaration: JavaScript motoru tarafından en tepeye taşınır. Yani fonksiyonu kodun altında tanımlayıp, üstünde çağırabilirsiniz.
    []Arrow Functions: Bir değişkene atanmış oldukları için (const/let), tanımlanmadan önce çağrılamazlar.

JavaScript:
sayHello(); // Çalışır!

function sayHello() {
console.log("Merhaba!");
}

sayHi(); // HATA! (ReferenceError)

const sayHi = () => console.log("Selam!");

4. "arguments" Nesnesi ve Constructor Yapısı​



  • []arguments: Klasik fonksiyonlarda, fonksiyon içine gönderilen tüm argümanları içeren arguments adında gizli bir dizi benzeri nesne vardır. Arrow functions içinde bu nesne bulunmaz (bunun yerine Rest Parameters kullanılır).
    []new Anahtar Kelimesi: Klasik fonksiyonlar "constructor" (yapıcı) olarak kullanılabilirken (new MyFunc()), Arrow functions kullanılamaz.

Hangisini, Ne Zaman Kullanmalıyım?​


DurumÖnerilen Yapı
Genel global fonksiyonlarFunction Declaration
Dizi metotları (map, filter, forEach)Arrow Function
Kısa, tek satırlık işlemlerArrow Function
Nesne metotları (this kullanımı varsa)Function Declaration
Constructor (Sınıf yapıları)Function Declaration



Özetle

Modern JavaScript dünyasında, kodun daha temiz görünmesi ve this problemlerinin önüne geçmek için Arrow Functions tercih edilir. Ancak fonksiyonunuzun hoisting özelliğine ihtiyacı varsa veya bir nesne metodu tanımlıyorsanız klasik function deklarasyonu hala en güvenli limandır.
 
Geri
Üst