Deo zbornika Napredni Javaskript

Funkcije koja vraćaju funkcije

U Javascriptu, funkcija može da vrati vrednost bilo kog tipa, a to može biti i funkcija.

Ova tehnika se bitno oslanja na zatvorenost (closure) funkcija.

Funkcija unutar funkcije

Poznato je da možemo ugnezditi funkciju unutar druge funkcije. Na primer:

function spoljnja() {
  function unutrasnja() {
    // telo unutrasnje funkcije
  }
}

Ovde važi klasično pravilo opsega - unutrašnja funkcija deluje unutar spoljnje, te ima pristup njenim varijablama i argumentima. Međutim, spoljnja funkcija nema pristup varijablama unutrašnje.

Međutim, osim što funkciju možemo staviti unutar druge, nju možemo i vratiti iz druge funkcije.

Funkcija koja vraća funkciju

Napravićemo funkciju koja prima jedan argument i vraća funkciju koja prima drugi argument, a druga funkcija vraća zbir oba argumenta:

function dodaj(x) {
  return function(y) {
    return y + x
  }
}

Funkciju koja vraća funkciju možemo koristiti na dva načina. Možemo je pozvati sa dva para zagrada i proslediti argumente i spoljnjoj i unutrašnjoj funkciji:

dodaj(9)(10) // pozivamo spoljnju pa unutrašnju funkciju

Ili možemo prvo pozvati spoljnju funkciju i njen rezultat (unutrašnju funkciju) smestiti u varijablu, nakon čega po imenu varijable pozivamo unutrašnju funkciju:

const dodaj3 = dodaj(3)
dodaj3(4)  // pozivamo unutrašnju funkciju

Ceo primer

Ceo prethodni primer bi izgledao ovako:

function dodaj(x) {
  return function(y) {
    return y + x
  }
}

console.log(dodaj(9)(10))
const dodaj3 = dodaj(3)
console.log(dodaj3(4))

Streličasta sintaksa

Prethodni primer pomoću streličaste sintakse može da se napiše na sledeći način:

const dodaj = x => y => y + x

Ovde takođe imamo spoljnu funkciju koja prima argument x i unutrašnju funkciju y => y + x.

Vidimo da je zbog implicitnog vraćanja vrednosti sintaksa značajno kraća i manje očigledna.

Još primera

function napraviPozdrav(pozdrav) {
  return function (ime) {
    console.log(pozdrav + ' ' + ime)
  }
}

const zdravo = napraviPozdrav('Zdravo')
const dovidjenja = napraviPozdrav('Dovidjenja')

zdravo("Ana")
zdravo("Nikola")
dovidjenja('Marko')

napraviPozdrav('Dobar dan')('komsija')

Stvarna upotreba

Funkcije koje vraćaju funkcije se u Javascriptu često koriste. Jedan primer je funkcija connect iz react-redux biblioteke:

connect(mapStateToProps)(App)

Literatura

  • Shelley Powers, Naučite JavaScript (probno poglavlje), Zagreb 2010.
  • Ved Antani, Stojan Stefanov, Objektno-orjentisan JavaScript, Beograd, 2017.