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

Демек, "контекстти өзгөртүүнү" тыюу эң жакшы деп түшүнүү — катуу бекитилген контекст түзүү. Бул үчүн bind колдонулат жөнөкөй функциялар үчүн жана лексикалык байланышты колдонуу стрелка функцияларында. Стрелка функциялары бул жактан "өзгөртүлбөс" болуп саналат.