JavaScript’te “Implicit Binding” Kavramı
JavaScript’te “implicit binding” kavramı, bir fonksiyonun this değerinin çağrıldığı bağlama göre otomatik olarak belirlenmesi durumudur.
“Implicit Binding”
Bir objenin metodu olarak çağrılan fonksiyonun this değeri, o metodun bizzat ait olduğu obje olacaktır. Ne demek istediğimiz aşağıdaki örneği incelediğinizde daha anlaşılır olacaktır diye düşünüyorum. Bakınız:
1 2 3 4 5 6 7 8 9 |
let obj = { name: 'John', greet: function() { console.log(`Hello, ${this.name}`); // this = obj //console.log(`Hello, ${obj.name}`); } } obj.greet(); // "Hello, John" |
Yukarıdaki örnekte, greet
fonksiyonunun this
değeri, fonksiyonun çağrıldığı objeye, yani bizzat obj
‘ye bağlanmıştır. İşte bu, “implicit binding” kavramının ta kendisidir.
JavaScript motoru bunu belirleyebilmek için fonksiyonun çağrıldığı yeri (call site) inceler. “Call site”, bir fonksiyonun çağrıldığı konumdur ve this
değeri fonksiyonun çağrıldığı obje olarak otomatik olarak atanır.
Yukarıdaki örneğimizde fonksiyonun çağrıldığı yer, obj.greet()
satırıdır. JavaScript motoru bu satıra bakar ve greet
fonksiyonunu çağıran objeyi (obj
) bulur. Ardından da greet
fonksiyonunun içindeki this
değerini obj
olarak atar.
Bu türden bir bağlama otomatik bir şekilde gerçekleştiği için avantajlıymış gibi görünse de, kodun tahmin edilebilirliğini azalttığı için haliyle istenmeyen sonuçlar ortaya çıkabilir. Örneğin, bir fonksiyonu başka bir değişkene atarsanız ve sonra bu değişkeni çağırırsanız, this
değeri orijinal objeye bağlı olmayabilir. Genellikle bu tür durumlardan kaçınmak için yardımcı metotlardan, yani explicit binding kavramından yararlanırız.