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 արտաքինOb = { անուն: 'Արտաքին' };
    
    դաս `ԻմԴասը` {
      constructor() {
        this.կլասԱնուն = 'ԻմԴասը';
        this.ցույցտվյալՆետ = () => {
          // `this` այստեղ բռնում է `this`-ը կոնստրուկտորից կամ `ԻմԴասը` սահմանումից
          console.log(this.կլասԱնուն);
        };
      }
    
      ցույցտվյալԸնդհանուր() {
        // `this` այստեղ որոշվում է կանչի ժամանակ
        console.log(this.կլասԱնուն);
      }
    }
    
    const օրինակ = new ԻմԴասը();
    օրինակ.ցույցտվյալՆետ(); // Տպում է 'ԻմԴասը'
    
    const այլOb = { անուն: 'Այլ' };
    const կապվածՆետ = օրինակ.ցույցտվյալՆետ.bind(այլOb); // Փորձում է փոխել կոնտեքստը
    կապվածՆետ(); // Հետո էլ տպում է 'ԻմԴասը', նետային ֆունկցիայի կոնտեքստը անփոփոխ է
    
    օրինակ.ցույցտվյալԸնդհանուր.call(այլOb); // Տպում է 'Այլ', սովորական ֆունկցիայի կոնտեքստը փոխվում է
    

Այսպիսով, "կարգել փոփոխության արգելքը" լավագույնը հասկանալ որպես կոշտ ամրացում կոնտեքստին։ Դրա համար օգտագործվում է bind սովորական ֆունկցիաների համար և բնական լեքսիկ կապը նետային ֆունկցիաների համար։ Նետային ֆունկցիաները այս առումով ավելի "անփոփոխ" են։