Sobes.tech
Middle

JavaScript'te `this`'in yürütme bağlamı değeri neye bağlıdır?

sobes.tech yapay zeka

AI'dan gelen yanıt

JavaScript'te this değeri, fonksiyonun nasıl çağrıldığına bağlıdır. Temel senaryolar:

  1. Küresel bağlam: Fonksiyonların dışında, katı modda ('use strict') this undefined olur. Katı mod olmadan, bu global nesne olur (window tarayıcıda, global Node.js'te).

  2. Bir nesnenin metodunun çağrılması: this, çağrılan metodun ait olduğu nesneye işaret eder.

    const obj = {
      prop: 'değer',
      method: function() {
        // this === obj
        console.log(this.prop);
      }
    };
    obj.method();
    
  3. Normal fonksiyon çağrısı: Katı modda, this undefined olur. Katı mod olmadan, bu global nesne olur.

    function myFunction() {
      // katı modda this === undefined
      // katı mod olmadan this === window (tarayıcıda)
      console.log(this);
    }
    myFunction();
    
  4. Yapıcı (new) kullanımı: new operatörü ile bir yapıcı fonksiyon kullanıldığında, fonksiyon içindeki this, yeni oluşturulan nesneye işaret eder.

    function MyClass(name) {
      this.name = name; // this === yeni nesne
    }
    const instance = new MyClass('test');
    // instance.name === 'test'
    
  5. Açık bağlama (call, apply, bind): call, apply ve bind metodları, fonksiyonun this değerini açıkça ayarlamaya izin verir.

    • call(thisArg, arg1, arg2, ...): Fonksiyonu çağırır ve this'i thisArg yapar, argümanları ayrı ayrı geçirir.
    • apply(thisArg, [argsArray]): Fonksiyonu çağırır ve this'i thisArg yapar, argümanları dizi olarak geçirir.
    • bind(thisArg): this'i kalıcı olarak bağlayan yeni bir fonksiyon döner.
    const anotherObj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    showValue.call(anotherObj); // 42 yazdırır
    
  6. Ok fonksiyonları (=>): Ok fonksiyonlarının kendi this'i yoktur. this değeri, tanımlandığı bağlamdan kalıtılır.

    const outerObj = {
      name: 'Outer',
      method: function() {
        const arrowFunc = () => {
          // this, outerObj'in method'u çağrıldığı bağlamdan kalıtılır
          console.log(this.name);
        };
        arrowFunc();
      }
    };
    outerObj.method(); // 'Outer' yazdırır
    
    const anotherArrowFunc = () => {
        // this, küresel bağlamdan kalıtılır (veya katı modda undefined)
        console.log(this);
    };
    anotherArrowFunc();
    
  7. DOM olay işleyicileri: Çoğu durumda, olay işleyicisindeki this, olayın gerçekleştiği DOM elementine işaret eder.

    // Tarayıcıda örnek
    const button = document.querySelector('button');
    button.addEventListener('click', function() {
      // this === button
      console.log(this.tagName);
    });
    

Bu mekaniklerin anlaşılması, JavaScript'te this'in doğru kullanımında kritik öneme sahiptir.