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:
-
call,apply,bindmeetodid:calljaapplyvõimaldavad kutsuda funktsiooni selgelt määratud kontekstiga ja argumentidega (eraldicall, massiivinaapply).bindloob uue seotud funktsiooni, millethison 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 -
Noolefunktsioonid (Arrow Functions):
- Noolefunktsioonidel puudub oma
this. Nad haaravadthisümbritsevast (leksikaalsest) keskkonnast oma määramise ajal. - Noolefunktsiooni kontekst ei saa muuta
call,applyvõibindabil.
// 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 - Noolefunktsioonidel puudub oma
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".