Middle
Ako zakázať zmenu kontextu v JavaScripte?
sobes.tech AI
Odpoveď od AI
V JavaScripte se kontekst izvršavanja funkcije (vrednost this) dinamički određuje u trenutku poziva. Potpuno zabranu promene nije moguće u apsolutnom smislu, ali je moguće kontrolisati ili fiksirati kontekst različitim metodama:
-
Metode
call,apply,bind:calliapplyomogućavaju pozivanje funkcije sa jasno navedenim kontekstom i argumentima (odvojeno ucall, kao niz uapply).bindkreira novu vezanu funkciju, u kojoj jethisčvrsto fiksiran na navedenu vrednost pri kreiranju, bez obzira na naknadni poziv. Ovo je najefikasniji način da se "zabrani" promena konteksta za buduće pozive.
// Primer sa bind const obj = { vrednost: 42 }; function prikaziVrednost() { console.log(this.vrednost); } const vezanaPrikaziVrednost = prikaziVrednost.bind(obj); vezanaPrikaziVrednost(); // Ispisa 42 vezanaPrikaziVrednost.call({ vrednost: 100 }); // Ipak ispisuje 42, kontekst je fiksiran -
Streličaste funkcije (Arrow Functions):
- Streličaste funkcije nemaju sopstveni
this. One hvatajuthisiz okoline (leksičke oblasti) u vreme definisanja. - Kontekst streličaste funkcije ne može biti promenjen pomoću
call,apply, ilibind.
// Primer sa streličastom funkcijom const spoljasnjiObjekat = { ime: 'Spoljasnji' }; klasa MojaKlasa { constructor() { this.imeKlase = 'MojaKlasa'; this.prikaziImeArrow = () => { // this ovde hvata this iz konstruktora ili oblasti definisanja MojaKlasa console.log(this.imeKlase); }; } prikaziImeObicno() { // this ovde se odredjuje pri pozivu console.log(this.imeKlase); } } const primerak = new MojaKlasa(); primerak.prikaziImeArrow(); // Ispisuje 'MojaKlasa' const drugiObjekat = { ime: 'Drugi' }; const vezanaArrow = primerak.prikaziImeArrow.bind(drugiObjekat); // Pokušaj promene konteksta vezanaArrow(); // Ipak ispisuje 'MojaKlasa', kontekst streličaste funkcije je nepromenljiv primerak.prikaziImeObicno.call(drugiObjekat); // Ispisuje 'Drugi', kontekst obične funkcije se menja - Streličaste funkcije nemaju sopstveni
Dakle, "zabrana promene konteksta" najbolje se shvata kao čvrsto fiksiranje konteksta. Za to se koristi bind za obične funkcije i prirodno leksičko povezivanje za streličaste funkcije. Streličaste funkcije u ovom smislu su "nepokoljebivije".