JavaScript'te fonksiyonun bağlamı nereden gelir?
sobes.tech yapay zeka
AI'dan gelen yanıt
JavaScript'te yürütme bağlamı (this), fonksiyonun tanımlandığı anda değil, çağrıldığı anda belirlenir. Bu değeri etkileyen faktörler şunlardır:
-
Küresel bağlam: Fonksiyonların dışında,
thisküresel nesneye (tarayıcıdawindow, Node.js'deglobal) işaret eder. Katı modda ('use strict') bu durumdathisundefinedolur.// Tarayıcıda console.log(this); // window // Node.js'de console.log(this); // global -
Bir nesnenin metodunu çağırmak: Bir fonksiyon, bir nesnenin metodu olarak çağrılırsa (nokta ile),
thisbu nesneye işaret eder.const obj = { name: 'Obj', method: function() { console.log(this.name); } }; obj.method(); // Obj -
"Normal" fonksiyon çağrısı: Basit bir fonksiyon çağrısında (metod olarak değil), katı olmayan modda
thisküresel nesneye işaret eder. Katı moddathisundefinedolur.function greet() { console.log(this); } greet(); // window (katı olmayan modda) veya undefined (katı modda) -
Yapıcı (constructor) fonksiyon (
newile): Bir fonksiyonnewanahtar kelimesiyle çağrıldığında, yapıcı gibi davranır. Fonksiyon içindekithis, yeni oluşturulan nesne örneğine işaret eder.function Person(name) { this.name = name; } const person1 = new Person('Alice'); console.log(person1.name); // Alice -
call,apply,bindmetodları: Bu metodlar, fonksiyonunthisdeğerini açıkça ayarlamaya izin verir.callveapplyfonksiyonu hemen çağırır,thisilk argüman olarak geçirilir.calldiğer argümanları ayrı ayrı alırken,applybunları dizi olarak alır.bindise,thisdeğerini kalıcı olarak ilk argümanla "bağlar" ve yeni bir fonksiyon döner.
const anotherObj = { name: 'Another Obj' }; function displayContext() { console.log(this.name); } displayContext.call(anotherObj); // Another Obj displayContext.apply(anotherObj); // Another Obj const boundFunction = displayContext.bind(anotherObj); boundFunction(); // Another Obj -
Ok fonksiyonlar: Ok fonksiyonlar kendi
this'lerine sahip değildir.thisdeğerini, tanımlandıkları ortamdan "yakalarlar" ve bu, geri çağırma fonksiyonları veya DOM olaylarıyla çalışırken kullanışlıdır.const objWithArrow = { name: 'Arrow Obj', method() { const arrowFunc = () => { console.log(this.name); // `this`, `method`'dan (objWithArrow) alınır }; arrowFunc(); } }; objWithArrow.method(); // Arrow Obj // Normal fonksiyonla karşılaştırın const objWithRegular = { name: 'Regular Obj', method() { const regularFunc = function() { console.log(this); // `this`, çağrı sırasında window veya undefined olur (strict modda) }; regularFunc(); } }; objWithRegular.method(); // window (veya undefined)
Bağlamın tanımı, JavaScript'in temel özelliklerinden biridir ve bu kuralları anlamak, fonksiyonlar ve nesnelerle doğru çalışmak için çok önemlidir.