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 сырткыОбъект = { аты: 'Сырткы' }; класстын МоюКласс { constructor() { this.классАты = 'МоюКласс'; this.көрсөткүлөАрыстын = () => { // бул жерде `this` `МоюКласс` конструкторунан же аны түзүүчү чөйрөдөн алынады console.log(this.классАты); }; } көрсөтүүАтыЖөнөкөй() { // бул жерде `this` чакырылышта аныкталат console.log(this.классАты); } } const мисал = new МоюКласс(); мисал.көрсөткүлөАрыстын(); // 'МоюКласс' чыгат const башкаОбъект = { аты: 'Башка' }; const байланганАрыстын = мисал.көрсөткүлөАрыстын.bind(башкаОбъект); // контекстти өзгөртүүгө аракет байланганАрыстын(); // дагы эле 'МоюКласс' чыгат, стрелка функциясынын контексти өзгөрбөйт мисал.көрсөткүлөАтыЖөнөкөй.call(башкаОбъект); // 'Башка' чыгат, жөнөкөй функциянын контексти өзгөрөт - Стык функциялар өзүнүн
Демек, "контекстти өзгөртүүнү" тыюу эң жакшы деп түшүнүү — катуу бекитилген контекст түзүү. Бул үчүн bind колдонулат жөнөкөй функциялар үчүн жана лексикалык байланышты колдонуу стрелка функцияларында. Стрелка функциялары бул жактан "өзгөртүлбөс" болуп саналат.