Middle
Ինչպե՞ս արգելել JavaScript-ում կոնտեքստի փոփոխությունը։
sobes.tech AI
Պատասխան AI-ից
JavaScript-ում ֆունկցիայի կատարման կոնտեքստը (this արժեքը) որոշվում է դինամիկ կերպով՝ կանչի պահին: Ապահովել նրա փոփոխության լիակատար արգելքը հնարավոր չէ ամբողջությամբ, բայց տարբեր մեթոդներով կարելի է վերահսկել կամ ֆիքսել կոնտեքստը.
-
call,apply,bindմեթոդները:callևapplyթույլ են տալիս կանչել ֆունկցիան հստակ նշված կոնտեքստով և արգումենտներով (առանցcall-ի՝ առանձին,apply-ի՝ զանգվածով):bindստեղծում է նոր կապված ֆունկցիա, որիthis-ը կոշտորեն ֆիքսված է նշված արժեքին ստեղծման ժամանակ, անկախ հետագա կանչից: Սա ամենաարդյունավետ միջոցն է "արգելափակել" կոնտեքստի փոփոխությունը՝ ապագա կանչերի համար:
// `bind`-ով օրինակ const obj = { արժեք: 42 }; function ցույցտվյալ() { console.log(this.արժեք); } const կապվածՑույցտվյալ = ցույցտվյալ.bind(obj); կապվածՑույցտվյալ(); // Տպում է 42 կապվածՑույցտվյալ.call({ արժեք: 100 }); // Հետո էլ տպում է 42, կոնտեքստը ֆիքսված է -
Նետային ֆունկցիաներ (Arrow Functions):
- Նետային ֆունկցիաները չունեն սեփական
this-ը: Նրանք բռնում ենthis-ը շրջակա (լեքսիկ) տարածքից նրանց սահմանման ժամանակ։ - Նետային ֆունկցիայի կոնտեքստը չի կարող փոխվել
call,apply, կամbind-ով:
// Նմուշ նետային ֆունկցիայի const արտաքինOb = { անուն: 'Արտաքին' }; դաս `ԻմԴասը` { constructor() { this.կլասԱնուն = 'ԻմԴասը'; this.ցույցտվյալՆետ = () => { // `this` այստեղ բռնում է `this`-ը կոնստրուկտորից կամ `ԻմԴասը` սահմանումից console.log(this.կլասԱնուն); }; } ցույցտվյալԸնդհանուր() { // `this` այստեղ որոշվում է կանչի ժամանակ console.log(this.կլասԱնուն); } } const օրինակ = new ԻմԴասը(); օրինակ.ցույցտվյալՆետ(); // Տպում է 'ԻմԴասը' const այլOb = { անուն: 'Այլ' }; const կապվածՆետ = օրինակ.ցույցտվյալՆետ.bind(այլOb); // Փորձում է փոխել կոնտեքստը կապվածՆետ(); // Հետո էլ տպում է 'ԻմԴասը', նետային ֆունկցիայի կոնտեքստը անփոփոխ է օրինակ.ցույցտվյալԸնդհանուր.call(այլOb); // Տպում է 'Այլ', սովորական ֆունկցիայի կոնտեքստը փոխվում է - Նետային ֆունկցիաները չունեն սեփական
Այսպիսով, "կարգել փոփոխության արգելքը" լավագույնը հասկանալ որպես կոշտ ամրացում կոնտեքստին։ Դրա համար օգտագործվում է bind սովորական ֆունկցիաների համար և բնական լեքսիկ կապը նետային ֆունկցիաների համար։ Նետային ֆունկցիաները այս առումով ավելի "անփոփոխ" են։