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:
-
call,apply,bindmetodes:callunapplyļauj izsaukt funkciju ar skaidri norādītu kontekstu un argumentiem (atsevišķicall, masīvāapply).bindizveido jaunu sasaistītu funkciju, kurasthisstingri 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 -
Loku funkcijas (Arrow Functions):
- Loku funkcijas nav savas
this. Tās ņemthisno apkārtējās (leksiskās) vides sava definēšanas laikā. - Loku funkcijas konteksts nav maināms ar
call,applyvaibind.
// 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 - Loku funkcijas nav savas
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".