Sobes.tech
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:

  1. call, apply, bind metodlari:

    • call va apply funksiyani aniq belgilangan kontekst va argumentlar bilan chaqirish imkonini beradi (callda alohida, applyda massiv shaklida).
    • bind yangi bog'langan funksiyani yaratadi, uning this qiymati 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
    
  2. Qayriladigan funksiyalar (Arrow Functions):

    • Qayriladigan funksiyalarda o'z this qiymati yo'q. Ular this ni atrofdagi (lexikal) muhitdan tashrif buyurish orqali oladi ta'rif qilish paytida.
    • Qayriladigan funksiyaning konteksti call, apply, yoki bind yordamida 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
    

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".