Middle
JavaScriptda kontekst o'zgarishini qanday taqiqlash mumkin?
sobes.tech AI
AIdan javob
JavaScriptda funksiyaning bajarilish konteksti (this qiymati) dinamik tarzda chaqirilgan paytda aniqlanadi. Uni butunlay o'zgartirishni taqiqlash mumkin emas, ammo uni boshqarish yoki turli usullar bilan mustahkamlash mumkin:
-
call,apply,bindmetodlari:callvaapplyfunksiyani aniq belgilangan kontekst va argumentlar bilan chaqirish imkonini beradi (callda alohida,applyda massiv shaklida).bindyangi bog'langan funksiyani yaratadi, uningthisqiymati yaratilish paytida qat'iy tarzda belgilangan bo'ladi, keyingi chaqiruvlardan mustaqil. Bu "kontekstni" "taqiqlash" uchun eng samarali usul.
// bind bilan misol const obj = { value: 42 }; function showValue() { console.log(this.value); } const boundShowValue = showValue.bind(obj); boundShowValue(); // 42 ni chiqaradi boundShowValue.call({ value: 100 }); // Hali ham 42 ni chiqaradi, kontekst belgilangan -
Qayriladigan funksiyalar (Arrow Functions):
- Qayriladigan funksiyalarda o'z
thisqiymati yo'q. Ularthisni atrofdagi (lexikal) muhitdan tashrif buyurish orqali oladi ta'rif qilish paytida. - Qayriladigan funksiyaning konteksti
call,apply, yokibindyordamida o'zgartirilishi mumkin emas.
// Qayriladigan funksiyaga misol const outerObj = { name: 'Outer' }; class MyClass { constructor() { this.className = 'MyClass'; this.showNameArrow = () => { // bu yerda `this` `MyClass` konstruktoridan yoki ta'rif muhitidan oladi console.log(this.className); }; } showNameRegular() { // bu yerda `this` chaqirilish paytida aniqlanadi console.log(this.className); } } const instance = new MyClass(); instance.showNameArrow(); // 'MyClass' ni chiqaradi const anotherObj = { className: 'Another' }; const boundArrow = instance.showNameArrow.bind(anotherObj); // kontekstni o'zgartirishga urinish boundArrow(); // Hali ham 'MyClass' ni chiqaradi, arrow funksiyaning konteksti o'zgarmas instance.showNameRegular.call(anotherObj); // 'Another' ni chiqaradi, oddiy funksiyaning konteksti o'zgaradi - Qayriladigan funksiyalarda o'z
Shunday qilib, "kontekstni o'zgartirishni taqiqlash" yaxshiroq tushunish uchun kontekstni qat'iy ushlab turish deb tushunish mumkin. Buning uchun bind oddiy funksiyalar uchun va tabiiy leksik bog'lanish arrow funksiyalar uchun ishlatiladi. Arrow funksiyalar bu nuqtai nazardan "o'zgaruvchan emas".