Sobes.tech
Middle

Kuidas keelata konteksti muutmine JavaScriptis?

sobes.tech AI

Vastus AI-lt

JavaScripti kontekst täitmise (väärtus this) määratakse dünaamiliselt väljakutse hetkel. Selle täielik keeld ei ole võimalik absoluutmõistes, kuid seda saab kontrollida või fikseerida erinevate meetoditega:

  1. call, apply, bind meetodid:

    • call ja apply võimaldavad kutsuda funktsiooni selgelt määratud kontekstiga ja argumentidega (eraldi call, massiivina apply).
    • bind loob uue seotud funktsiooni, mille this on rangelt fikseeritud määratud väärtusele loomise ajal, sõltumata järgmisest kutsest. See on kõige tõhusam viis "keelata" konteksti muutmine tulevasteks kutsedeks.
    // Näide bind-iga
    const obj = { väärtus: 42 };
    function näitaVäärtust() {
      console.log(this.väärtus);
    }
    
    const seotudNäitaVäärtust = näitaVäärtust.bind(obj);
    
    seotudNäitaVäärtust(); // Väljund 42
    seotudNäitaVäärtust.call({ väärtus: 100 }); // Endiselt väljund 42, kontekst on fikseeritud
    
  2. Noolefunktsioonid (Arrow Functions):

    • Noolefunktsioonidel puudub oma this. Nad haaravad this ümbritsevast (leksikaalsest) keskkonnast oma määramise ajal.
    • Noolefunktsiooni kontekst ei saa muuta call, apply või bind abil.
    // Näide noolefunktsiooniga
    const välineObjekt = { nimi: 'Väline' };
    
    klass MinuKlass {
      constructor() {
        this.klassNimi = 'MinuKlass';
        this.näitaNimiNoole = () => {
          // siin haarab `this` konstruktorist või määramise keskkonnast
          console.log(this.klassNimi);
        };
      }
    
      näitaNimiTavaline() {
        // siin määratakse `this` kutsumise ajal
        console.log(this.klassNimi);
      }
    }
    
    const näide = new MinuKlass();
    näide.näitaNimiNoole(); // Väljund 'MinuKlass'
    
    const teineObjekt = { nimi: 'Teine' };
    const seotudNoole = näide.näitaNimiNoole.bind(teineObjekt); // Katse muuta konteksti
    seotudNoole(); // Endiselt väljund 'MinuKlass', noole funktsiooni kontekst on muutmatu
    
    näide.näitaNimiTavaline.call(teineObjekt); // Väljund 'Teine', tavalise funktsiooni kontekst muutub
    

Seega, "konteksti muutmise keeld" on kõige paremini mõistetav kui rangelt fikseeritud kontekst. Selle saavutamiseks kasutatakse bind tavaliste funktsioonide puhul ja loomulikku leksikalist seost noolefunktsioonide puhul. Noolefunktsioonid on selles mõttes "murdumatud".