Sobes.tech
Middle

Kā aizliegt JavaScript konteksta maiņu?

sobes.tech AI

Atbilde no AI

JavaScript kontekstā funkcijas izpildes (vērtība this) tiek noteikts dinamiski izsaukšanas brīdī. Pilnībā to aizliegt nav iespējams absolūti, taču to var kontrolēt vai fiksēt dažādiem veidiem:

  1. call, apply, bind metodes:

    • call un apply ļauj izsaukt funkciju ar skaidri norādītu kontekstu un argumentiem (atsevišķi call, masīvā apply).
    • bind izveido jaunu sasaistītu funkciju, kuras this stingri ir fiksēts norādītajai vērtībai izveides brīdī, neatkarīgi no turpmākās izsaukšanas. Šis ir efektīvākais veids "aizliegt" konteksta maiņu turpmākajos izsaukumos.
    // Piemērs ar bind
    const obj = { vērtība: 42 };
    function rādītVērtību() {
      console.log(this.vērtība);
    }
    
    const sasaistītRādītVērtību = rādītVērtību.bind(obj);
    
    sasaistītRādītVērtību(); // Izvadīs 42
    sasaistītRādītVērtību.call({ vērtība: 100 }); // Joprojām izvadīs 42, konteksts ir fiksēts
    
  2. Loku funkcijas (Arrow Functions):

    • Loku funkcijas nav savas this. Tās ņem this no apkārtējās (leksiskās) vides sava definēšanas laikā.
    • Loku funkcijas konteksts nav maināms ar call, apply vai bind.
    // Piemērs ar loku funkciju
    const ārējaisObjekts = { nosaukums: 'Ārējais' };
    
    klase ManaKlase {
      constructor() {
        this.klasesNosaukums = 'ManaKlase';
        this.rādītNosaukumuLoka = () => {
          // šeit `this` ņemts no konstruktoru vai definēšanas vides
          console.log(this.klasesNosaukums);
        };
      }
    
      rādītNosaukumuParasta() {
        // šeit `this` tiek noteikts izsaukuma laikā
        console.log(this.klasesNosaukums);
      }
    }
    
    const piemērs = new ManaKlase();
    piemērs.rādītNosaukumuLoka(); // Izvadīs 'ManaKlase'
    
    const citsObjekts = { nosaukums: 'Cits' };
    const sasaistītsLoka = piemērs.rādītNosaukumuLoka.bind(citsObjekts); // Mēģinājums mainīt kontekstu
    sasaistītsLoka(); // Joprojām izvadīs 'ManaKlase', loka funkcijas konteksts ir nemainīgs
    
    piemērs.rādītNosaukumuParasta.call(citsObjekts); // Izvadīs 'Cits', parastās funkcijas konteksts mainās
    

Tādējādi, "konteksta aizliegšana" vislabāk saprotama kā stingra konteksta fiksācija. Tam izmanto bind par parastajām funkcijām un dabisko leksisko sasaisti loka funkcijām. Loku funkcijas šajā ziņā ir "nepārkāpjamas".