Deo zbornika Napredni Javaskript

Ključna reč this u Javascriptu

U Javascriptu, ključna reč this unutar funkcije ukazuje na objekat kojem ona pripada. Ako funkcija nije prikačena ni za jedan objekat, onda pripada globalnom window objektu.

Vrednost this se može dinamički menjati zavisno od toga kako je funkcija pozvana (na primer, događaji menjaju this). Leksički opseg važenja je opseg unutar koga je funkcija definisana, a dinamički unutar kog je pozvana. Pomoću metode bind() možemo fiksirati vrednost this, bez obzira kako se funkcija poziva.

Streličaste funkcije se bitno razlikuju od običnih jer nemaju svoj this.

this u funkciji

Unutar samostalne funkcije, this označava globalni window objekat:

function klasicnaFunkcija(){
  console.log(this)
}

klasicnaFunkcija()

this u metodi objekta

Unutar metode, this označava pripadajući objekat:

const radnik = {
  ime: 'Alija Sirotanović',
  predstaviSe () {
    console.log(this.ime)
  }
}

radnik.predstaviSe()

this u povratnoj funkciji

const radnik = {
  ime: 'Alija Sirotanović',
  predstaviSe () {
    setTimeout(function() { // funkcija menja this u window
      console.log(this.ime)
    }, 100)
  }
}

radnik.predstaviSe()

Ovde je this promenjeno u window, a svojstvo ime je nedefinisano na window objektu.

this u streličastoj povratnoj funkciji

Važan aspekt streličastih funkcija je da one nemaju this, pa vrednost this ostaje kao što je bila:

const radnik = {
  ime: 'Alija Sirotanović',
  predstaviSe () {
    setTimeout(() => { // ova funkcija ne menja this
      console.log(this.ime)
    }, 100)
  }
}

radnik.predstaviSe()

this u povratnoj funkciji događaja

Kada događaj inicira povratnu funkciju, pregledač vezuje njen this za element koji je bio okidač. Na primer, ako je klik na dugme iniciralo funkciju, njen this će postati HTML element dugme.

<button id="dugme">Ne klikći</button>

<script>
const dugme = document.getElementById('dugme')

dugme.addEventListener('click', function() {
  alert(this)
})
</script>

this u streličastoj povratnoj funkciji događaja

Streličasta funkcija nema sopstveni this. Kada imamo streličastu funkciju kao callback, događaj ne može vezati this, a vrednost this ostaje kao i da nema streličaste funkcije:

<button id="dugme">Proveri</button>

<script>
const dugme = document.getElementById('dugme')
dugme.addEventListener('click', () => {  
  alert(this)
})
</script>

Ovo može biti izvor problema ako očekujemo da this bude okinuti element.

this u metodi prosleđenoj događaju

Promena vrednosti this u metodi prosleđenoj događaju može biti izvor problema, ako očekujemo da this ukazuje na objekat. U narednom primeru, this umesto vlasnika metode postaje HTML dugme:

<button id="dugme">Proveri</button>

<script>
const komponenta = {
  stanje: "zatvoreno",
  javiStanje() {
    alert(this.stanje)  // this unutar događaja postaje dugme, a this.stanje nedefinisano
  }
}

const dugme = document.getElementById('dugme')
dugme.addEventListener('click', komponenta.javiStanje)
</script>

Ovo je standardan problem u React-u, i zato koristimo bind, odnosno vezujemo vrednost this u metodi koja će biti prosleđena događaju:

this.handleClick.bind(this, this.handleClick)

this u funkciji u strogom modu

U strogom modu, this unutar funkcije više nije window nego undefined:

const klasicnaFunkcija = function(){
  "use strict"
  console.log(this)
}

klasicnaFunkcija()

U ES6 modulima podrazumevano važi strogi mod.

Literatura

  • Ved Antani, Stojan Stefanov, Objektno-orjentisan JavaScript, Beograd, 2017.