Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript'te bind(), bir fonksiyon için kullanılacak this değerini önceden sabitleyen ve yeni bir fonksiyon döndüren metottur. Ayrıca fonksiyonun ilk argümanlarını da önceden verebilirsiniz. Özellikle bir nesnenin metodunu callback olarak aktarırken this bağlamının kaybolmasını önlemek için kullanılır.

Temel kullanım​


Normal bir fonksiyon nesne metodu olarak çağrıldığında this, çağrıyı yapan nesneyi gösterir. Ancak metot başka bir değişkene atanıp tek başına çağrılırsa bu bağlantı kaybolabilir.

JavaScript:
"use strict";
const kullanici = {
  ad: "Ayşe",
  selamla() {
    return `Merhaba ${this.ad}`;
  }
};

const bagimsizFonksiyon = kullanici.selamla;
try {
  console.log(bagimsizFonksiyon());
} catch (hata) {
  console.log(hata.name); // TypeError
}

const bagliFonksiyon = kullanici.selamla.bind(kullanici);
console.log(bagliFonksiyon());
// Merhaba Ayşe

Burada bind(kullanici), selamla fonksiyonunun this değerini kullanici olarak sabitler. bind() fonksiyonu hemen çalıştırmaz; çağrıldığında çalışacak yeni bir fonksiyon üretir.

Callback içinde neden kullanılır?​


Bir metodu setTimeout, olay dinleyicisi veya başka bir callback mekanizmasına doğrudan verdiğinizde, fonksiyonun hangi nesneye ait olduğu otomatik olarak korunmayabilir.

Kod:
const sayaç = {
  deger: 0,
  artır() {
    this.deger++;
    console.log(this.deger);
  }
};

setTimeout(sayaç.artır.bind(sayaç), 1000);

Yaklaşık bir saniyelik gecikme sonrasında, olay döngüsü uygun olduğunda artır() çalışır ve this değeri sayaç olur. Aynı işlem, fonksiyonu sarmalayan bir ok fonksiyonuyla da yapılabilir:

Kod:
setTimeout(() => sayaç.artır(), 1000);

Bu iki timer örneği alternatif kullanımlardır; ikisini birden çalıştırırsanız aynı sayaç iki kez artırılır. Kesin çalışma zamanı yalnız verilen gecikme değerinden belirlenmez.

Bu nedenle karar verirken aşağıdaki ayrım işinizi kolaylaştırır:
İhtiyaçUygun yöntemSonuç
Fonksiyonu hemen, belirli this ile çalıştırmakcall()Fonksiyon hemen çağrılır
Fonksiyonu hemen, dizi argümanlarıyla çalıştırmakapply()Fonksiyon hemen çağrılır
Daha sonra çağrılacak yeni fonksiyon üretmekbind()Bağlanmış fonksiyon döner

Argümanları önceden verme​


bind() yalnızca this değerini sabitlemez; fonksiyonun başlangıç argümanlarını da saklayabilir. Bu kullanım kısmi uygulama olarak düşünülebilir.

Kod:
function toplam(a, b, c) {
  return this.temel + a + b + c;
}

const toplamHesapla = toplam.bind({ temel: 10 }, 1, 2);
console.log(toplamHesapla(3));
// 16

Burada this.temel değeri 10, a değeri 1 ve b değeri 2 olarak bağlanmıştır. Sonradan verilen 3 ise c parametresine gider.

Uygularken dikkat edilmesi gerekenler​

  1. bind() çağrısının sonucunu bir değişkene atayın veya doğrudan callback olarak verin. fonksiyon.bind(nesne) tek başına yazmak fonksiyonu çalıştırmaz.
  2. Her bind() çağrısı yeni bir fonksiyon üretir. Olay dinleyicisi ekleyip kaldırırken aynı referansı kullanmak için bağlanmış fonksiyonu saklayın.
  3. Ok fonksiyonlarının kendilerine ait this değeri yoktur. Bu nedenle bir ok fonksiyonuna bind() uygulamak, onun this davranışını normal fonksiyonlardaki gibi değiştirmez.
  4. Bağlanmış bir fonksiyonu tekrar bind() ederseniz normal çağrıda ilk bağlanan this değeri korunur; sonraki bağlama daha çok ek argümanlar için etkili olur.
Bir olay dinleyicisini kaldırırken metot.bind(nesne) ifadesini tekrar yazmayın. İlk çağrıdan dönen referansı saklayıp hem addEventListener hem removeEventListener için aynı fonksiyonu ve eşleşen capture ayarını kullanın. Yoksa yeni üretilen fonksiyon daha önce kaydedilen dinleyiciyle eşleşmez.

Sık sorulan sorular​

Bağlanmış fonksiyon new ile çağrılırsa this ne olur?​

Hedef fonksiyon kurucu olarak kullanılabiliyorsa new çağrısı kendi yeni nesnesini oluşturur; bind ile verilmiş thisArg bu durumda kullanılmaz. Önceden bağlanan argümanlar korunur. Normal fonksiyon çağrısı için anlatılan sabit this davranışını kurucu çağrısına aynen taşımayın.

Bağlanmış fonksiyonun length değeri neden azalır?​

length, bağlanan başlangıç argümanları dikkate alınarak hesaplanır ve sıfırın altına düşmez. thisArg bu sayıya argüman olarak katılmaz. Bu özellik hangi argümanların doğrulanacağını veya fonksiyonun çağrıldığında kaç argüman kabul edeceğini sınırlayan bir kontrol değildir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.