Sobes.tech
Middle

Ok fonksiyonlar ile normal fonksiyonlar arasındaki fark, bind metodunun kullanılma gerekliliği açısından nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Ok işaretli fonksiyonlar kendi this bağlamına sahip değildir. Çevresel alan (lexical ortam) içinden this'i yakalarlar.

Normal fonksiyonlar, çağrılma şekline bağlı olarak kendi this'lerini belirler:

  • Küresel bağlamda (window veya global).
  • Bir nesnenin metodu olarak (this nesneye işaret eder).
  • Yapıcı (constructor) olarak (this yeni örneğe işaret eder).
  • call, apply veya bind kullanılarak (this açıkça ayarlanır).

Çünkü ok fonksiyonlarının kendi this'i yoktur, bir ok fonksiyonuna bind çağrısı yapmak anlamlı değildir ve bağlamış this'i değiştirmez. Bir ok fonksiyonuna bind çağrısı yapmaya çalışırsanız, fonksiyon kendisini geri döner.

Örnek:

// Normal fonksiyon
const normalFunc = function() {
  console.log(this.name);
};

const obj1 = { name: 'Obje 1', method: normalFunc };
const obj2 = { name: 'Obje 2' };

obj1.method(); // Çıktı: Obje 1

const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Çıktı: Obje 2 (this başarıyla değiştirildi)

// Ok fonksiyonu
const arrowFunc = () => {
  console.log(this.name);
};

const obj3 = { name: 'Obje 3' };

// ArrowFunc çevresel bağlamdan this'i yakalar (bu durumda, küresel nesne)
arrowFunc(); // Çıktı: undefined (muhtemelen, çünkü this name içermiyor)

const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Çıktı: undefined (this değişmedi, bind etkili olmadı)

// this yakalama örneği
const person = {
  name: 'Alice',
  greet: function() {
    // Burada, this `person`'a işaret eder
    const greetLater = () => {
      // Burada, this dış fonksiyonun çevresel bağlamından yakalanır, yani yine `person`
      console.log(`Merhaba, ${this.name}!`);
    };
    greetLater();
  }
};

person.greet(); // Çıktı: Merhaba, Alice!

Sonuç olarak, bind normal fonksiyonlar için this bağlamını açıkça ayarlamak için gereklidir, oysa ok fonksiyonları için gereksizdir çünkü this'leri lexikal olarak belirlenir ve bind ile değiştirilemez.