Der er yderligere forskelle mellem de to bortset fra syntaksen.
Som næsten ethvert moderne programmeringssprog tilbyder JavaScript måder at oprette funktioner på, der giver mulighed for genbrug af kode. For dem, der ikke er bekendt med sproget, er der to forskellige måder at erklære en funktion i JavaScript.
Oprindeligt er fungere søgeord blev brugt, og senere blev pilesyntaksen oprettet. Selvom det er forskelligt med hensyn til tilgængelighed, skaber både funktionsnøgleordet og pilesyntaksen lignende resultater.
Manglende evne til at skelne mellem de to kan forårsage problemer og føre til forkert brug. Det er en nødvendighed for den moderne JS-udvikler at forstå, hvordan hver funktionsdeklaration påvirker omfang og synlighed.
Hvad er JavaScripts pilefunktioner?
JavaScripts pilefunktioner er en alternativ måde at definere funktioner, der ikke bruger standarden fungere søgeord:
fungerelogMessage(besked) {
konsol.log (meddelelse);
}konst logMessage = (besked) => {
konsol.log (meddelelse);
}
konst logMessage = besked =>konsol.log (meddelelse);
Ovenfor kan du se den samme besked skrevet på tre forskellige måder. Den første bruger den almindelige funktionserklæringsmetode. De næste to viser de to måder at bruge ES6s pilefunktioner på.
JavaScript overtog først pilfunktionens syntaks med udgivelsen af ECMAScript 2015-standarderne. Arrow-funktioner tilbød en ren og kortfattet måde til hurtigt at skabe funktioner og en interessant løsning på flere langvarige scope-problemer inden for JavaScript.
Disse funktioner gjorde hurtigt pilefunktioner til et hit blandt mange udviklere. Programmører, der kigger på en moderne JavaScript-kodebase, er lige så tilbøjelige til at finde pilefunktioner som almindelige funktioner.
Hvordan er pilefunktioner forskellige fra almindelige funktioner i JavaScript?
Ved første øjekast ser pilefunktioner ikke ud til at adskille sig meget fra funktioner, der er erklæret ved hjælp af funktionsnøgleordet. Uden for syntaks indkapsler begge et genanvendeligt sæt handlinger, der kan kaldes fra andre steder i koden.
På trods af lighederne mellem de to, er der dog nogle forskelle, som udviklere skal være opmærksomme på.
Forskel i omfang
Når en almindelig funktion er erklæret i JavaScript, er det funktion fungerer som en lukning, der skaber sit eget omfang. Dette kan forårsage et problem, når du bruger visse specialiserede funktioner som f.eks sætTimeout og sætinterval.
Før ES6 var der et betydeligt antal løsninger, der ville løfte genstande til et højere niveau til brug ved tilbagekald. Disse hacks virkede, men de var ofte svære at forstå og kunne forårsage problemer med, at visse variabler blev overskrevet.
Pilefunktioner løste begge problemer på en enkel og elegant måde. Når en pilefunktion bruges som en del af et tilbagekald, har den adgang til samme omfang som den funktion, hvorfra den blev kaldt.
Dette gjorde det muligt at bruge funktioner som tilbagekald uden at miste adgangen til den kontekst, hvori den oprindelige hændelse blev kaldt. Som en simpel test for at vise dette princip i aktion, kan du konfigurere en forsinket beskedfunktion som den nedenfor:
fungereforsinket Besked(besked, forsinkelse) {
setTimeout(fungere(besked) {
konsol.log (meddelelse);
}, forsinkelse);}
delayedMessage("Hej Verden", 1000);
Funktionen er enkel, accepterende besked og forsinke på millisekunder. Når forsinkelsen er passeret, skal den logge beskeden til konsollen. Men når koden udføres, udefineret vil blive logget på konsollen i stedet for den besked, der blev sendt ind.
Når tilbagekaldsfunktionen udføres, ændres omfanget, og den oprindelige besked er ikke længere tilgængelig. Brug af beskeden inde fra lukningen kræver, at beskeden hejses til en global variabel, hvilket kan resultere i, at den bliver overskrevet før tilbagekaldet.
En pilefunktion er en korrekt løsning på dette problem. Hvis du erstatter det første argument for sætTimeout, kan omfanget vedligeholdes, og funktionen vil have adgang til meddelelsen videregivet til forsinket Besked.
fungereforsinket Besked(besked, forsinkelse) {
setTimeout(() => {
konsol.log (meddelelse);
}, forsinkelse);}
delayedMessage("Hej Verden", 1000);
Nu, når den er henrettet forsinket Besked funktionen vil logge beskeden. Derudover tillader dette, at flere meddelelser kan stå i kø med forskellige forsinkelser, og de vil stadig forekomme på det rigtige tidspunkt.
Dette skyldes, at hver gang forsinket Besked bruges, genererer den sit eget omfang med sin egen kopi af den interne pilfunktion.
Kode læsbarhed
Selvom pilefunktioner er nyttige som tilbagekald, bruges de også til at holde koden ren og kortfattet. I ovenstående afsnit kan du se, at brugen af en pilefunktion gør det let indlysende, hvad der vil ske, når forsinket Besked funktion kaldes.
Efterhånden som funktioner bliver mere komplekse, kan en lille klarhed gøre koden langt mere læsbar. Når du komponerer objekter, kan dette gøre kode enklere, når du tilføjer korte funktioner:
klassetæller{
_count = 0;
stigning = () => {
det her._count += 1;
}
formindske = () => {
det her._count -= 1;
}
tælle = () => {
Vend tilbagedet her._tælle;
}
}
lade ct = ny tæller();
Rolle i objektorienteret programmering
Selvom JavaScripts pilefunktioner er en integreret del af funktionel programmering, har de også en plads i objektorienteret programmering. Pilefunktioner kan bruges i klassedeklarationer:
klasseordreLinjeelement{
_LineItemID = 0;
_Produkt = {};
_Antal = 1;konstruktør(produkt) {
det her._LineItemID = crypto.randomUUID();
det her._Produkt = produkt
}
changeLineItemQuantity = (ny Antal) => {
det her._Antal = nyAntal;
}
}
Brug af en pilefunktion til at erklære metoder i en klasseerklæring ændrer ikke funktionens adfærd i klassen. Uden for klassen afslører den dog funktionen, så den kan bruges af andre klasser.
Regulære funktioner kan ikke tilgås uden for klassedeklarationen uden at blive kaldt. Dette betyder, at mens andre klasseerklæringer kan arve disse funktioner, kan de ikke tilgås direkte for at sammensætte andre klasser.
Hvornår skal du bruge JavaScripts pilefunktioner?
JavaScripts pilefunktioner er en utrolig kraftfuld funktion, der giver udviklere langt mere kontrol over, hvilket omfang en funktion har adgang til. At vide, hvornår et tilbagekald skal have adgang til dets overordnede omfang, og hvornår det ikke skal, kan hjælpe en udvikler med at bestemme, hvilken type erklæring der skal bruges.
Pilefunktioner giver programmører en klar og kortfattet måde at skrive tilbagekald på uden at afsløre dele af omfanget, der burde være skjult. De giver også mulighed for at skabe rene og enkle kompositioner, hvilket yderligere muliggør funktionel programmering i JavaScript.
JS-udviklere skal være opmærksomme på forskellene mellem de to syntakser og være opmærksomme på, hvilken syntaks der er passende, når de erklærer deres funktioner.