Sobes.tech
Middle

JavaScript-də kontekstin dəyişməsini necə qadağan etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də funksiyanın icra konteksti (this dəyəri) dinamik olaraq çağırış anında müəyyən edilir. Onun dəyişdirilməsini tamamilə qadağan etmək mümkün deyil, amma onu müxtəlif üsullarla idarə etmək və ya sabitləşdirmək olar:

  1. call, apply, bind metodları:

    • callapply funksiyanı açıq şəkildə kontekst və arqumentlərlə çağırmağa imkan verir (call ayrı arqumentlər, apply isə massiv şəklində).
    • bind yeni bağlanmış funksiya yaradır, onun this dəyəri yaradılma zamanı sərt şəkildə təyin edilir, sonrakı çağırışlardan asılı olmayaraq. Bu, gələcək çağırışlar üçün "konteksti" "qadağan etməyin" ən effektiv yoludur.
    // bind ilə nümunə
    const obj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    
    const boundShowValue = showValue.bind(obj);
    
    boundShowValue(); // 42 göstərəcək
    boundShowValue.call({ value: 100 }); // Hələ də 42 göstərəcək, kontekst sərt şəkildə təyin olunub
    
  2. Ox funksiyaları (Arrow Functions):

    • Ox funksiyaları öz this-ə malik deyil. Onlar this-i ətraf mühitdən tərif zamanı ələ keçirirlər.
    • Ox funksiyasının konteksti call, apply, və ya bind ilə dəyişdirilə bilməz.
    // Ox funksiyası ilə nümunə
    const outerObj = { name: 'Outer' };
    
    class MyClass {
      constructor() {
        this.className = 'MyClass';
        this.showNameArrow = () => {
          // `this` burada `MyClass`-ın konstruktorundan və ya tərif mühitindən ələ keçir
          console.log(this.className);
        };
      }
    
      showNameRegular() {
        // `this` burada çağırış zamanı müəyyən edilir
        console.log(this.className);
      }
    }
    
    const instance = new MyClass();
    instance.showNameArrow(); // 'MyClass' göstərəcək
    
    const anotherObj = { className: 'Another' };
    const boundArrow = instance.showNameArrow.bind(anotherObj); // Konteksti dəyişdirməyə cəhd
    boundArrow(); // Yenə 'MyClass' göstərəcək, ox funksiyasının konteksti dəyişməz
    
    instance.showNameRegular.call(anotherObj); // 'Another' göstərəcək, adi funksiyanın konteksti dəyişir
    

Qısaca, "kontekstin dəyişdirilməsini qadağan etmək" daha yaxşı kontekstin sərt şəkildə bağlanması kimi başa düşülür. Bunun üçün bind adi funksiyalar üçün və təbii leksik bağlama üçün istifadə olunur. Ox funksiyaları bu baxımdan daha "dəyişməz" sayılır.