Context

La oss først lage et objekt som vi kan teste litt på:

let john = {
  firstName: 'John',
  lastName: 'Doe',
  driveCar() {
  console.log()
  }
}

Hva om vi inne i objektet ønsker å referere til firstName? I javascript, og mange andre språk finnes det noe som heter this, som vil referere til objektet man står i. Det vil si at på logg-linja, kan vi skrive

console.log(this.firstName)

Og med dette kan vi hente ut flere verdier slik:

console.log(this.firstName + " " + this.lastName + " is driving a car.")

Et par linjer under objektet, skriv

john.driveCar();

Da vil du se i konsollet at teksten kommer ut riktig.

Hva om vi lager en ny funksjon inni metoden?

let john = {
  firstName: 'John',
  lastName: 'Doe',
  driveCar() {
    function imAFunctionNotAMethod() {
      console.log(this)
    }  imAFunctionNotAMethod()
  }
}

Hvis vi nå sjekker konsollet, så ser vi “John Doe is driving a car”, og på linjen over står det et  Window-objekt. Det er ikke nøye akkurat nå hva Window er, men det er et globalt objekt. this-ordet peker på objektet som kaller på den nåværende funksjonen.

Akkurat dette med “this” kan være en kilde til frustrasjon for forvirring og irritasjon, for utviklere av alle nivåer. Derfor, om du ikke forstår konseptet helt enda, så er det helt greit. Dette er mest for å bli kjent med at det finnes.

function breathe() {
  console.log(this.firstName + " " + this.lastName + " exhaled and inhaled")
}

Hvis vi kaller funksjonen breathe(), så har vi i utgangspunktet ingen “this” å referere til, så hva vil skje hvis vi kaller funksjonen? Du vil få 

< undefined undefined exhaled and inhaled

Vel, det vi kan gjøre for at funksjonen skal vite hva “this” er når vi kaller funksjonen.

call() metoden gjør at vi kan sende inn hva-enn funksjonen (breathe) forventer å få inn. I vårt eksempel forventes et objekt, som har firstName og lastName som egenskaper, så la oss sende inn john-objektet som vi lagde tidligere

breathe.call(john)

Og hvis du nå sjekker konsollet, så vil du få ut riktige navn, istedenfor undefined.