Sobes.tech
Middle

JavaScript-də funksiyanın konteksti haradan gəlir?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də icra konteksti (və ya this) funksiyanın çağırıldığı an müəyyən edilir, elan olunduğu deyil. Onun dəyərinə aşağıdakı amillər təsir edir:

  • Qlobal kontekst: Funksiyaların xaricində, this qlobal obyektə istinad edir (brauzerdə window, Node.js-də global). Qatı rejimdə ('use strict') bu halda this undefined olacaq.

    // Brauzerdə
    console.log(this); // window
    
    // Node.js-də
    console.log(this); // global
    
  • Obyekt metodunun çağırılması: Əgər funksiya obyektin metodu kimi çağırılırsa (nöqtə ilə), this həmin obyektə istinad edir.

    const obj = {
      name: 'Obj',
      method: function() {
        console.log(this.name);
      }
    };
    obj.method(); // Obj
    
  • "Adi" funksiya çağırışı: Sadə funksiya çağırışında (metod kimi deyil), qatı rejimdə this qlobal obyektə istinad edir. Qatı rejimdə this undefined olacaq.

    function greet() {
      console.log(this);
    }
    greet(); // window (qatı olmayan rejimdə) və ya undefined (qatı rejimdə)
    
  • Konstruktor (yeni ilə): Əgər funksiya new açar sözü ilə çağırılırsa, o, konstruktor kimi fəaliyyət göstərir. Funksiya daxilində this yeni yaradılmış obyektə istinad edir.

    function Person(name) {
      this.name = name;
    }
    const person1 = new Person('Alice');
    console.log(person1.name); // Alice
    
  • call, apply, bind metodları: Bu metodlar this dəyərini açıq şəkildə təyin etməyə imkan verir.

    • callapply funksiyanı dərhal çağırır, this ilk arqument kimi ötürülür. call digər arqumentləri ayrıca qəbul edir, apply isə massiv kimi.
    • bind yeni funksiya qaytarır, onun this dəyəri daimi olaraq ilk arqumentlə "bağlanır".
    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
    
  • Ox funksiyalar: Ox funksiyalar öz this-ə malik deyil. Onlar this dəyərini leksikal mühitdən "tuturlar" və bu, metodlar daxilində callback-lər və DOM hadisələri ilə işləmək üçün faydalıdır.

    const objWithArrow = {
      name: 'Arrow Obj',
      method() {
        const arrowFunc = () => {
          console.log(this.name); // `this` `method`-dan (objWithArrow) götürülür
        };
        arrowFunc();
      }
    };
    objWithArrow.method(); // Arrow Obj
    
    // Adi funksiya ilə müqayisə
    const objWithRegular = {
      name: 'Regular Obj',
      method() {
        const regularFunc = function() {
          console.log(this); // `this` window və ya undefined (qatı rejimdə) olacaq
        };
        regularFunc();
      }
    };
    objWithRegular.method(); // window (və ya undefined)
    

Kontekstin tərifi JavaScript-in əsas xüsusiyyətlərindən biridir və bu qaydaları başa düşmək funksiyalar və obyektlərlə düzgün işləmək üçün çox vacibdir.