Kada koristiti deklaraciju funkcije u odnosu na izraz funkcije

Serija Tech žargon

Vjerojatno već znate kako pisati funkcije na oba ova načina. function doStuff() {}i () =>{} su znakovi koje pišemo cijeli dan. Ali kako se razlikuju i zašto koristiti jedno preko drugog?

Napomena: Primjeri su dati u JavaScript-u. Y naš M ileage M ay V arna s drugim jezicima.

Prva razlika: ime

Kada kreirate funkciju s imenom , to je deklaracija funkcije . Ime se može izostaviti u izrazima funkcija , čineći tu funkciju "anonimnom".

Izjava o funkciji:

function doStuff() {};

Izraz funkcije:

const doStuff = function() {}

Anonimne funkcije koje se koriste sa sintaksom ES6 često vidimo ovako:

const doStuff = () => {}

Podizanje

Podizanje se odnosi na dostupnost funkcija i varijabli "na vrhu" vašeg koda, za razliku od njih tek nakon što su stvorene. Objekti se inicijaliziraju u vrijeme prevođenja i dostupni su bilo gdje u vašoj datoteci.

Deklaracije funkcija su podignute, ali izrazi funkcija nisu.

To je lako razumjeti na primjeru:

doStuff();
function doStuff() {};

Gore navedeno ne dovodi do pogreške, ali ovo bi:

doStuff();
const doStuff = () => {};

Slučaj za izraze funkcija

Moglo bi se činiti da će deklaracije funkcija svojim moćnim svojstvima podizanja iskorijeniti izraze funkcija radi korisnosti. Ali odabir jednog nad drugim zahtijeva razmišljanje o tome kada i gdje je funkcija potrebna . U osnovi, tko to treba znati?

Izrazi funkcija pozivaju se kako bi se izbjeglo zagađivanje globalnog opsega . Umjesto da vaš program bude svjestan mnogih različitih funkcija, kad ih držite anonimnima, one se odmah koriste i zaboravljaju.

IIFE

Naziv - odmah pozvani izrazi funkcije - prilično govori sve ovdje. Kada se funkcija kreira istodobno kad se poziva, možete koristiti IIFE koji izgleda ovako:

(function() => {})()

ili:

(() => {})()

Za dublji uvid u IIFE pogledajte ovaj opsežni članak.

Povratni pozivi

Funkcija proslijeđena drugoj funkciji često se naziva "povratni poziv" u JavaScript-u. Evo primjera:

function mapAction(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

Ovdje je problem što mapActionće biti dostupan cijeloj vašoj aplikaciji - nema potrebe za tim. Ako je taj povratni poziv izraz funkcije, neće biti dostupan izvan funkcije koja ga koristi:

array.map(item => { //do stuff to an item })

ili

const mapAction = function(item) { // do stuff to an item } array.map(mapAction)
array.map(mapAction)

iako mapActionće biti dostupan kodu ispod njegove inicijalizacije.

Sažetak

Ukratko, koristite deklaracije funkcija kada želite stvoriti funkciju na globalnom opsegu i učiniti je dostupnom u cijelom kodu. Upotrijebite izraze funkcija da biste ograničili dostupnost funkcije, održavali svijetlo vaše globalno područje i održavali čistu sintaksu.

Reference

  • Izjava o funkciji, MDN dokumenti.
  • Izraz funkcije, MDN dokumenti.
  • Podizanje, MDN rječnik.

Serija Tech žargon

Postoji toliko puno fraza koje se bacaju na tehnološka okupljanja i konferencije, pod pretpostavkom da su svi već dolje s jezikom. Često nisam s jezikom. Uobičajeno je da se programeri ponašaju zaprepašteno što mi nedostaje znanje.

Istina je da često jednostavno ne znam pravu riječ za to. Kao ljudi, ali posebno ljudi koji razvijaju programe, volimo odbaciti one koji ne „govore“, tako da ova serija govori o solidnom razumijevanju programskih koncepata koje treba „znati“.

Ovo je drugi članak u seriji. Prva su bile funkcije višeg reda. Pazite na još dok idem na sastanke i konferencije i pretvaram se da znam o čemu razgovaraju moji kolege tehničari, ali onda moram kući i proguglati.