Sobes.tech
Middle

Чӣ тавр манъ кардани тағйири контекст дар JavaScript?

sobes.tech AI

Ҷавоб аз AI

Дар JavaScript, контексти иҷрои функсия (маҳз this) дар вақти даъват муайян мешавад. Манъ кардани пурра тағйир додани он дар маънои абсолутӣ имконнопазир аст, аммо онро бо роҳҳои гуногун назорат кардан ё мустаҳкам кардан мумкин аст:

  1. Роҳҳои call, apply, bind:

    • call ва apply имкон медиҳанд, ки функсия бо контексти равшан ва аргументҳо даъват шавад (дар call ҷудо, дар apply ҳамчун массив).
    • bind як функсияи навро месозад, ки дар он this сахт ба арзиши муайян мустаҳкам шудааст дар вақти сохтани он, новобаста аз даъвати баъдӣ. Ин самараноктарин роҳи "манъ" кардани тағйири контекст барои даъватҳои оянда мебошад.
    // Масал бо bind
    const obj = { арзиш: 42 };
    function нишонДоданиАрзиш() {
      console.log(this.арзиш);
    }
    
    const мустаҳкамШудароНишонДодан = нишонДоданиАрзиш.bind(obj);
    
    мустаҳкамШудароНишонДодан(); // Натиҷа 42
    мустаҳкамШудароНишонДодан.call({ арзиш: 100 }); // Ҳамеша 42, контекст мустаҳкам шудааст
    
  2. Функсияҳои стрелка (Arrow Functions):

    • Функсияҳои стрелка соҳиби this нестанд. Онҳо this-ро аз муҳити атроф (минтақаи лексикӣ) дар вақти муайян кардани мегиранд.
    • Контексти функсияи стрелка наметавонад тағйир дода шавад бо истифода аз call, apply, ё bind.
    // Масал бо функсияи стрелка
    const объектИдории = { номи: 'Идории' };
    
    синфи МояСинф {
      constructor() {
        this.номиКласс = 'МояСинф';
        this.показатиНомиArrow = () => {
          // `this` дар ин ҷо аз конструктора ё муҳити муайяншуда гирифта шудааст
          console.log(this.номиКласс);
        };
      }
    
      показатиНомиОдатӣ() {
        // `this` дар вақти даъват муайян мешавад
        console.log(this.номиКласс);
      }
    }
    
    const намуна = new МояСинф();
    намуна.показатиНомиArrow(); // Натиҷа 'МояСинф'
    
    const дигарОбъект = { номи: 'Дигар' };
    const мустаҳкамШудароArrow = намуна.показатиНомиArrow.bind(дигарОбъект); // кӯшиши тағйир додани контекст
    мустаҳкамШудароArrow(); // Ҳамеша 'МояСинф', контексти стрелка тағйирнопазир аст
    
    намуна.показатиНомиОдатӣ.call(дигарОбъект); // Натиҷа 'Дигар', контексти функсияи оддӣ тағйир меёбад
    

Бинобар ин, "манъ кардани тағйири контекст" беҳтарин маънои онро дорад, ки чорчӯбаи сахт мустаҳкам. Барои ин bind барои функсияҳои оддӣ ва табиӣ лексикӣ пайвандшавии стрелка истифода мешавад. Функсияҳои стрелка дар ин маъно "напокобили" бештар мебошанд.