Det finnes ytterligere forskjeller mellom de to bortsett fra syntaksen.

Som nesten alle moderne programmeringsspråk tilbyr JavaScript måter å lage funksjoner for å tillate gjenbruk av kode. For de som ikke er kjent med språket, er det to forskjellige måter å deklarere en funksjon i JavaScript.

Opprinnelig funksjon nøkkelord ble brukt, og senere ble pilsyntaksen opprettet. Selv om de er forskjellige i omfang tilgjengelighet, skaper både funksjonsnøkkelordet og pilsyntaksen lignende resultater.

Manglende evne til å skille mellom de to kan forårsake problemer og føre til feil bruk. Det er en nødvendighet for den moderne JS-utvikleren å forstå hvordan hver funksjonserklæring påvirker omfang og synlighet.

Hva er JavaScripts pilfunksjoner?

JavaScripts pilfunksjoner er en alternativ måte å definere funksjoner som ikke bruker standard funksjon nøkkelord:

funksjonlogMessage(beskjed) {
konsoll.log (melding);
}

konst logMessage = (beskjed) => {
konsoll.log (melding);
}

konst logMessage = beskjed =>konsoll.log (melding);

Ovenfor kan du se den samme meldingen skrevet på tre forskjellige måter. Den første bruker den vanlige funksjonsdeklarasjonsmetoden. De to neste viser de to måtene å bruke ES6s pilfunksjoner.

JavaScript tok først i bruk pilfunksjonens syntaks med utgivelsen av ECMAScript 2015-standardene. Arrow-funksjoner tilbød en ren og kortfattet måte å raskt lage funksjoner og en interessant løsning på flere langvarige omfangsproblemer innen JavaScript.

Disse funksjonene gjorde raskt pilfunksjoner til en hit blant mange utviklere. Programmerere som ser på en moderne JavaScript-kodebase er like sannsynlig å finne pilfunksjoner som vanlige funksjoner.

Hvordan er pilfunksjoner forskjellig fra vanlige funksjoner i JavaScript?

Ved første øyekast ser det ikke ut til at pilfunksjoner skiller seg mye fra funksjoner som er deklarert med funksjonsnøkkelordet. Utenfor syntaks, innkapsler begge et gjenbrukbart sett med handlinger som kan kalles fra andre steder i koden.

Til tross for likhetene mellom de to, er det imidlertid noen forskjeller som utviklere må være klar over.

Forskjell i omfang

Når en vanlig funksjon er deklarert i JavaScript, vil det funksjon fungerer som en lukking som skaper sitt eget omfang. Dette kan forårsake et problem når du bruker visse spesialiserte funksjoner som setTimeout og settintervall.

Før ES6 var det et betydelig antall løsninger som ville løfte gjenstander til høyere omfang for bruk i tilbakeringinger. Disse hackene fungerte, men de var ofte vanskelige å forstå, og kunne forårsake problemer med at visse variabler ble overskrevet.

Pilfunksjoner løste begge problemene på en enkel og elegant måte. Når en pilfunksjon brukes som en del av en tilbakeringing, har den tilgang til samme omfang som funksjonen den ble kalt opp fra.

Dette gjorde det mulig å bruke funksjoner som tilbakeringinger uten å miste tilgangen til konteksten der den opprinnelige hendelsen ble kalt. Som en enkel test for å vise dette prinsippet i aksjon, kan du sette opp en forsinket meldingsfunksjon som den nedenfor:

funksjonforsinket melding(melding, forsinkelse) {

setTimeout(funksjon(beskjed) {
konsoll.log (melding);
}, forsinkelse);

}

delayedMessage("Hei Verden", 1000);

Funksjonen er enkel, aksepterende beskjed og forsinkelse på millisekunder. Etter at forsinkelsen er passert, skal den logge meldingen til konsollen. Men når koden kjøres, udefinert vil bli logget på konsollen i stedet for meldingen som ble sendt inn.

Når tilbakeringingsfunksjonen er utført, endres omfanget og den opprinnelige meldingen er ikke lenger tilgjengelig. Bruk av meldingen fra stengingen krever at meldingen heises til en global variabel, noe som kan føre til at den blir overskrevet før tilbakeringingen.

En pilfunksjon er en riktig løsning på dette problemet. Hvis du erstatter det første argumentet for setTimeout, kan omfanget opprettholdes, og funksjonen vil ha tilgang til meldingen som sendes til forsinket melding.

funksjonforsinket melding(melding, forsinkelse) {

setTimeout(() => {
konsoll.log (melding);
}, forsinkelse);

}

delayedMessage("Hei Verden", 1000);

Nå, når den er henrettet, forsinket melding funksjonen vil logge meldingen. I tillegg gjør dette at flere meldinger kan stå i kø med forskjellige forsinkelser, og de vil fortsatt forekomme på riktig tidspunkt.

Dette skyldes det faktum at hver gang forsinket melding brukes, genererer den sitt eget omfang med sin egen kopi av den interne pilfunksjonen.

Kode lesbarhet

Selv om pilfunksjoner er nyttige som tilbakeringinger, brukes de også for å holde koden ren og konsis. I avsnittet ovenfor kan du se at bruk av en pilfunksjon gjør det lett åpenbart hva som vil skje når forsinket melding funksjonen kalles.

Etter hvert som funksjoner blir mer komplekse, kan det å ha litt klarhet gjøre koden langt mer lesbar. Når du komponerer objekter, kan dette gjøre koden enklere når du legger til korte funksjoner:

klassedisk{
_count = 0;
økning = () => {
dette._count += 1;
}
redusere = () => {
dette._count -= 1;
}
telle = () => {
komme tilbakedette._telle;
}
}

la ct = ny disk();

Rolle i objektorientert programmering

Mens JavaScripts pilfunksjoner er en integrert del av funksjonell programmering, har de også en plass i Objektorientert programmering. Pilfunksjoner kan brukes i klassedeklarasjoner:

klasseordrelinjeelement{
_LineItemID = 0;
_Produkt = {};
_Antall = 1;

konstruktør(produkt) {
dette._LineItemID = crypto.randomUUID();
dette._Produkt = produkt
}

changeLineItemQuantity = (nyAntall) => {
dette._Antall = nyAntall;
}
}

Å bruke en pilfunksjon for å deklarere metoder i en klasseerklæring endrer ikke funksjonens oppførsel i klassen. Utenfor klassen eksponerer den imidlertid funksjonen, slik at den kan brukes av andre klasser.

Vanlige funksjoner kan ikke åpnes utenfor klassedeklarasjonen uten å bli kalt. Dette betyr at mens andre klassedeklarasjoner kan arve disse funksjonene, kan de ikke nås direkte for å komponere andre klasser.

Når bør du bruke JavaScripts pilfunksjoner?

JavaScripts pilfunksjoner er en utrolig kraftig funksjon som gir utviklere langt mer kontroll over hvilket omfang en funksjon har tilgang til. Å vite når en tilbakeringing skal ha tilgang til overordnets omfang, og når den ikke bør, kan hjelpe en utvikler med å bestemme hvilken type erklæring som skal brukes.

Pilfunksjoner gir programmerere en klar og konsis måte å skrive tilbakeringinger uten å avsløre deler av omfanget som bør skjules. De tillater også å lage rene og enkle komposisjoner, noe som muliggjør funksjonell programmering i JavaScript.

JS-utviklere må være klar over forskjellene mellom de to syntaksene og være oppmerksomme på hvilken syntaks som er passende når de deklarerer funksjonene deres.