CodeBlanks Logo Icon CodeBlanks

this bağlamı

JavaScript kursu · Orta seviye · Ders 4/134

Arrow fonksiyonlarda this'in sözcüksel olarak bağlandığını ve ne anlama geldiğini öğrenirsin.

Lexical this

Arrow fonksiyonlarda this, fonksiyonun tanımlandığı kapsama bağlıdır. Buna lexical this denir. Klasik fonksiyonlar this'i çağırana göre dinamik bağlarken, arrow dış kapsamı miras alır.

const obj = {
  name: "Ayşe",
  show() {
    const inner = () => console.log(this.name);
    inner();
  }
};
obj.show(); // "Ayşe"

Arrow, show metodunun this'ini korur; böylece this.name doğru çalışır.

Callback'de this kaybı

Klasik fonksiyon callback olarak geçildiğinde this bağlamını kaybeder; bu sıkça karşılaşılan bir hatadır. Arrow ise this'i korur.

function Timer() {
  this.count = 0;
  setInterval(function() {
    this.count++; // hatalı: this window
  }, 1000);
}

Aynı kodu arrow ile yazarsan this doğru kalır:

setInterval(() => {
  this.count++; // doğru: this Timer
}, 1000);

Uygulama this'i koruyan arrow callback

counter nesnesinin start metodu setInterval çağırıyor. Callback'i arrow yap ve this.count'u artır. Klasik function kullanma.

Örnek çözümü göster
const counter = {
  count: 0,
  start() {
    setInterval(() => {
      this.count++;
    }, 1000);
  }
};

Kendini test et

  1. Bir arrow içinde this neyi gösterir?

    • Fonksiyonu çağıran nesneyi
    • Arrow'un tanımlandığı dış kapsamı
    • Yeni bir boş nesneyi
    • window nesnesini her zaman
    Cevabı göster

    Arrow'un tanımlandığı dış kapsamı — Doğru. Arrow this'i lexikal olarak dış kapsamdan alır.

  2. this'i koruyacak ok

    setInterval(() ____ { this.count++; }, 1000);
    Cevabı göster
    setInterval(() => { this.count++; }, 1000);
  3. this davranışını eşleştir

    arrow fonksiyon
    this lexikal
    klasik fonksiyon
    this dinamik
    callback hatası
    this kaybolur
  4. Çağrı ne döndürür?

    const obj = {
      v: 10,
      show() {
        const f = () => this.v;
        return f();
      }
    };
    obj.show();
    • undefined
    • 0
    • 10
    • hata fırlatır
    Cevabı göster

    10 — Doğru. <code>show</code> metodu this'i obj'ye bağlar; arrow da bunu miras alır, <code>this.v</code> = 10.

Orta seviye bölümündeki tüm dersler