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 колдонулат жөнөкөй функциялар үчүн жана лексикалык байланышты колдонуу стрелка функцияларында. Стрелка функциялары бул жактан "өзгөртүлбөс" болуп саналат.