Sobes.tech
Middle

Ako zakázať zmenu kontextu v JavaScripte?

sobes.tech AI

Odpoveď od AI

V JavaScripte se kontekst izvršavanja funkcije (vrednost this) dinamički određuje u trenutku poziva. Potpuno zabranu promene nije moguće u apsolutnom smislu, ali je moguće kontrolisati ili fiksirati kontekst različitim metodama:

  1. Metode call, apply, bind:

    • call i apply omogućavaju pozivanje funkcije sa jasno navedenim kontekstom i argumentima (odvojeno u call, kao niz u apply).
    • bind kreira novu vezanu funkciju, u kojoj je this čvrsto fiksiran na navedenu vrednost pri kreiranju, bez obzira na naknadni poziv. Ovo je najefikasniji način da se "zabrani" promena konteksta za buduće pozive.
    // Primer sa bind
    const obj = { vrednost: 42 };
    function prikaziVrednost() {
      console.log(this.vrednost);
    }
    
    const vezanaPrikaziVrednost = prikaziVrednost.bind(obj);
    
    vezanaPrikaziVrednost(); // Ispisa 42
    vezanaPrikaziVrednost.call({ vrednost: 100 }); // Ipak ispisuje 42, kontekst je fiksiran
    
  2. Streličaste funkcije (Arrow Functions):

    • Streličaste funkcije nemaju sopstveni this. One hvataju this iz okoline (leksičke oblasti) u vreme definisanja.
    • Kontekst streličaste funkcije ne može biti promenjen pomoću call, apply, ili bind.
    // Primer sa streličastom funkcijom
    const spoljasnjiObjekat = { ime: 'Spoljasnji' };
    
    klasa MojaKlasa {
      constructor() {
        this.imeKlase = 'MojaKlasa';
        this.prikaziImeArrow = () => {
          // this ovde hvata this iz konstruktora ili oblasti definisanja MojaKlasa
          console.log(this.imeKlase);
        };
      }
    
      prikaziImeObicno() {
        // this ovde se odredjuje pri pozivu
        console.log(this.imeKlase);
      }
    }
    
    const primerak = new MojaKlasa();
    primerak.prikaziImeArrow(); // Ispisuje 'MojaKlasa'
    
    const drugiObjekat = { ime: 'Drugi' };
    const vezanaArrow = primerak.prikaziImeArrow.bind(drugiObjekat); // Pokušaj promene konteksta
    vezanaArrow(); // Ipak ispisuje 'MojaKlasa', kontekst streličaste funkcije je nepromenljiv
    
    primerak.prikaziImeObicno.call(drugiObjekat); // Ispisuje 'Drugi', kontekst obične funkcije se menja
    

Dakle, "zabrana promene konteksta" najbolje se shvata kao čvrsto fiksiranje konteksta. Za to se koristi bind za obične funkcije i prirodno leksičko povezivanje za streličaste funkcije. Streličaste funkcije u ovom smislu su "nepokoljebivije".