Sobes.tech
Middle

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, this küresel nesneye (tarayıcıda window, Node.js'de global) işaret eder. Katı modda ('use strict') bu durumda this undefined olur.

    // 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), this bu 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 this küresel nesneye işaret eder. Katı modda this undefined olur.

    function greet() {
      console.log(this);
    }
    greet(); // window (katı olmayan modda) veya undefined (katı modda)
    
  • Yapıcı (constructor) fonksiyon (new ile): Bir fonksiyon new anahtar kelimesiyle çağrıldığında, yapıcı gibi davranır. Fonksiyon içindeki this, 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, bind metodları: Bu metodlar, fonksiyonun this değerini açıkça ayarlamaya izin verir.

    • call ve apply fonksiyonu hemen çağırır, this ilk argüman olarak geçirilir. call diğer argümanları ayrı ayrı alırken, apply bunları dizi olarak alır.
    • bind ise, this değ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. this değ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.