Sobes.tech
Middle

JavaScript'te bağlam değişikliğini nasıl engellersiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

JavaScript'te bir fonksiyonun yürütme bağlamı (this değeri), çağrı anında dinamik olarak belirlenir. Bu bağlamın tamamen değiştirilmesini engellemek mümkün değildir, ancak çeşitli yollarla kontrol edilebilir veya sabitlenebilir:

  1. call, apply, bind metodları:

    • call ve apply, fonksiyonu açıkça belirtilmiş bağlam ve argümanlarla çağırmaya olanak tanır (call ayrı argümanlar, apply ise dizi olarak).
    • bind, yeni bir bağlı fonksiyon oluşturur ve bu fonksiyonun this değeri, oluşturulma sırasında sabitlenir, sonraki çağrılardan bağımsızdır. Bu, gelecekteki çağrılar için "bağlam değişikliğini" "yasaklamanın" en etkili yoludur.
    // bind ile örnek
    const obj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    
    const boundShowValue = showValue.bind(obj);
    
    boundShowValue(); // 42 yazdırır
    boundShowValue.call({ value: 100 }); // Yine 42 yazdırır, bağlam sabitlenmiştir
    
  2. Ok fonksiyonları (Arrow Functions):

    • Ok fonksiyonlarının kendi this değeri yoktur. Çevresinden (lexical) this'i tanım anında yakalarlar.
    • Ok fonksiyonunun bağlamı, call, apply veya bind kullanılarak değiştirilemez.
    // Ok fonksiyon örneği
    const outerObj = { name: 'Outer' };
    
    class MyClass {
      constructor() {
        this.className = 'MyClass';
        this.showNameArrow = () => {
          // `this` burada, yapıcı fonksiyon veya `MyClass`'in tanım alanından yakalanır
          console.log(this.className);
        };
      }
    
      showNameRegular() {
        // `this` burada, çağrı sırasında belirlenir
        console.log(this.className);
      }
    }
    
    const instance = new MyClass();
    instance.showNameArrow(); // 'MyClass' yazdırır
    
    const anotherObj = { className: 'Another' };
    const boundArrow = instance.showNameArrow.bind(anotherObj); // bağlamı değiştirmeye çalışma
    boundArrow(); // Yine 'MyClass' yazdırır, ok fonksiyonunun bağlamı değiştirilemez
    
    instance.showNameRegular.call(anotherObj); // 'Another' yazdırır, normal fonksiyonun bağlamı değişir
    

Özetle, "bağlamın değiştirilmesini engellemek" en iyi şekilde sıkı sıkıya bağlama olarak anlaşılır. Bunun için, normal fonksiyonlar için bind kullanılır ve ok fonksiyonlarının doğal lexikal bağlamı tercih edilir. Ok fonksiyonları bu açıdan daha "değişmez" sayılır.