Sobes.tech
Middle

No kā ir atkarīgs `this` izpildes konteksta vērtība JavaScript?

sobes.tech AI

Atbilde no AI

this vērtība JavaScript ir atkarīga no funkcijas izsaukšanas veida. Galvenie scenāriji:

  1. Globālais konteksts: ārpus funkcijām, stingrā režīmā ('use strict') this ir undefined. Bez stingrā režīma — globālais objekts (window pārlūkprogrammā, global Node.js).

  2. Objekta metodes izsaukums: this norāda uz objektu, kam pieder izsauktais metodes.

    const obj = {
      prop: 'vērtība',
      method: function() {
        // this === obj
        console.log(this.prop);
      }
    };
    obj.method();
    
  3. Parasta funkcijas izsaukšana: Stingrā režīmā this ir undefined. Bez stingrā režīma — globālais objekts.

    function myFunction() {
      // stingrā režīmā this === undefined
      // bez režīma this === window (pārlūkprogrammā)
      console.log(this);
    }
    myFunction();
    
  4. Konstruktors (new): Izmantojot new ar konstruktoru funkciju, this funkcijas iekšienē norāda uz jauno izveidoto objektu.

    function MyClass(name) {
      this.name = name; // this === jauns objekts
    }
    const instance = new MyClass('tests');
    // instance.name === 'tests'
    
  5. Īpaša sasaistīšana (call, apply, bind): Šīs metodes ļauj tieši iestatīt this vērtību funkcijai.

    • call(thisArg, arg1, arg2, ...): izsauc funkciju, iestatot this uz thisArg un argumentus atsevišķi.
    • apply(thisArg, [argsArray]): izsauc funkciju, iestatot this uz thisArg un argumentus kā masīvu.
    • bind(thisArg): atgriež jaunu funkciju ar pastāvīgi saistītu this vērtību.
    const anotherObj = { value: 42 };
    function showValue() {
      console.log(this.value);
    }
    showValue.call(anotherObj); // Izvadīs 42
    
  6. Loku funkcijas (=>): Loku funkcijas nav savas this. this vērtība mantojas no leksiskā konteksta, kurā tā tika definēta.

    const outerObj = {
      name: 'Ārējais',
      method: function() {
        const arrowFunc = () => {
          // this šeit mantojas no `method`, kas tiek izsaukts kā outerObj metode
          console.log(this.name);
        };
        arrowFunc();
      }
    };
    outerObj.method(); // Izvadīs 'Ārējais'
    
    const anotherArrowFunc = () => {
        // this šeit mantojas no globālā konteksta (vai `undefined` stingrā režīmā)
        console.log(this);
    };
    anotherArrowFunc();
    
  7. Notikumu apstrādātāji DOM: Lielākajā daļā gadījumu, this notikumu apstrādātājā norāda uz DOM elementu, kurā notika notikums.

    // Piemērs pārlūkā
    const button = document.querySelector('button');
    button.addEventListener('click', function() {
      // this === button
      console.log(this.tagName);
    });
    

Šo mehānismu izpratne ir kritiska, lai pareizi izmantotu this JavaScript.