Există diferențe suplimentare între cele două în afară de sintaxă.
Ca aproape orice limbaj de programare modern, JavaScript oferă modalități de a crea funcții pentru a permite reutilizarea codului. Pentru cei care nu sunt familiarizați cu limbajul, există două moduri diferite de a declara o funcție în JavaScript.
Inițial, cel funcţie a fost folosit cuvântul cheie și, ulterior, a fost creată sintaxa săgeții. Deși diferă în ceea ce privește accesibilitatea domeniului de aplicare, atât cuvântul cheie al funcției, cât și sintaxa săgeții creează rezultate similare.
Incapacitatea de a distinge între cele două poate cauza probleme și poate duce la o utilizare incorectă. Este o necesitate pentru dezvoltatorul JS modern să înțeleagă modul în care fiecare declarație de funcție afectează domeniul și vizibilitatea.
Care sunt funcțiile săgeților JavaScript?
Funcțiile săgeții JavaScript sunt o modalitate alternativă de a defini funcții care nu folosesc implicit funcţie cuvânt cheie:
funcţiejurnalMessage(mesaj) {
consolă.log (mesaj);
}const logMessage = (mesaj) => {
consolă.log (mesaj);
}
const logMessage = mesaj =>consolă.log (mesaj);
Mai sus, puteți vedea același mesaj scris în trei moduri diferite. Primul folosește metoda obișnuită de declarare a funcției. Următoarele două arată cele două moduri de a utiliza funcțiile săgeată ale lui ES6.
JavaScript a adoptat pentru prima dată sintaxa funcției săgeată odată cu lansarea standardelor ECMAScript 2015. Funcțiile Arrow au oferit o modalitate curată și concisă de a crea rapid funcții și o soluție interesantă pentru mai multe probleme de lungă durată din JavaScript.
Aceste caracteristici au făcut rapid funcțiile săgeată un succes printre mulți dezvoltatori. Programatorii care caută o bază de cod JavaScript modernă sunt la fel de probabil să găsească funcții săgeți ca și funcții obișnuite.
Prin ce diferă funcțiile săgeților de funcțiile obișnuite din JavaScript?
La prima vedere, funcțiile săgeată nu par să difere mult de funcțiile declarate folosind cuvântul cheie funcție. În afara sintaxei, ambele încapsulează un set reutilizabil de acțiuni care pot fi apelate din altă parte a codului.
Cu toate acestea, în ciuda asemănărilor dintre cele două, există unele diferențe de care dezvoltatorii trebuie să fie conștienți.
Diferența în domeniul de aplicare
Ori de câte ori o funcție obișnuită este declarată în JavaScript, asta funcția funcționează ca o închidere care își creează propriul domeniu de aplicare. Acest lucru poate cauza o problemă atunci când utilizați anumite funcții specializate, cum ar fi setTimeout și setInterval.
Înainte de ES6, existau un număr semnificativ de soluții de soluționare care ar ridica articolele la niveluri mai înalte de acțiune pentru utilizare în apeluri inverse. Aceste hack-uri au funcționat, dar erau adesea greu de înțeles și puteau cauza probleme cu suprascrierea anumitor variabile.
Funcțiile săgeată au rezolvat ambele probleme într-un mod simplu și elegant. Când o funcție săgeată este utilizată ca parte a unui apel invers, aceasta are acces la același domeniu ca și funcția de la care a fost apelată.
Acest lucru a permis ca funcțiile să fie folosite ca apeluri inverse fără a pierde accesul la contextul în care a fost apelat evenimentul inițial. Ca un test simplu pentru a arăta acest principiu în acțiune, puteți configura o funcție de mesagerie întârziată ca cea de mai jos:
funcţiedelayedMessage(mesaj, întârziere) {
setTimeout(funcţie(mesaj) {
consolă.log (mesaj);
}, întârziere);}
delayedMessage("Salut Lume", 1000);
Funcția este simplă, acceptând mesaj și întârziere în milisecunde. După trecerea întârzierii, ar trebui să înregistreze mesajul pe consolă. Cu toate acestea, atunci când codul este executat, nedefinit va fi conectat la consolă în locul mesajului care a fost transmis.
Când funcția de apel invers este executată, domeniul de aplicare se modifică și mesajul original nu mai este accesibil. Utilizarea mesajului din interiorul închiderii necesită ca mesajul să fie ridicat la o variabilă globală, ceea ce ar putea avea ca rezultat suprascrierea acestuia înainte de apel invers.
O funcție săgeată este o soluție adecvată pentru această problemă. Dacă înlocuiți primul argument pentru setTimeout, domeniul de aplicare poate fi menținut, iar funcția va avea acces la mesajul căruia i-a fost transmis delayedMessage.
funcţiedelayedMessage(mesaj, întârziere) {
setTimeout(() => {
consolă.log (mesaj);
}, întârziere);}
delayedMessage("Salut Lume", 1000);
Acum, când este executat, delayedMessage funcția va înregistra mesajul. În plus, acest lucru permite ca mai multe mesaje să fie puse în coadă cu diferite întârzieri și toate vor apărea în continuare la momentul corect.
Acest lucru se datorează faptului că de fiecare dată delayedMessage este utilizat, își generează propriul domeniu de aplicare cu propria copie a funcției săgeată internă.
Lizibilitatea codului
În timp ce funcțiile săgeți sunt utile ca apeluri inverse, ele sunt, de asemenea, folosite pentru a menține codul curat și concis. În secțiunea de mai sus, puteți vedea că folosind o funcție săgeată, este ușor evident ce se va întâmpla atunci când delayedMessage funcția este numită.
Pe măsură ce funcțiile devin mai complexe, un pic de claritate poate face codul mult mai ușor de citit. Când compuneți obiecte, acest lucru poate simplifica codul atunci când adăugați funcții scurte:
clasătejghea{
_număr = 0;
increment = () => {
acest._count += 1;
}
decrement = () => {
acest._count -= 1;
}
numără = () => {
întoarcereacest._numara;
}
}
lăsa ct = nou tejghea();
Rol în programarea orientată pe obiecte
În timp ce funcțiile săgeți ale JavaScript sunt o parte integrantă a programării funcționale, ele au și un loc în programare orientată pe obiecte. Funcțiile săgeată pot fi utilizate în declarațiile de clasă:
clasăorderLineItem{
_LineItemID = 0;
_Produs = {};
_Cantitate = 1;constructor(produs) {
acest._LineItemID = crypto.randomUUID();
acest._Produs = produs
}
changeLineItemQuantity = (newQty) => {
acest._Qty = newQty;
}
}
Folosirea unei funcții săgeată pentru a declara metode în cadrul unei declarații de clasă nu schimbă comportamentul funcției în cadrul clasei. În afara clasei, totuși, expune funcția, permițându-i să fie folosită de alte clase.
Funcțiile obișnuite nu pot fi accesate în afara declarației de clasă fără a fi apelate. Aceasta înseamnă că, în timp ce alte declarații de clasă pot moșteni aceste funcții, ele nu pot fi accesate direct pentru a compune alte clase.
Când ar trebui să utilizați funcțiile săgeată JavaScript?
Funcțiile săgeți ale JavaScript sunt o caracteristică incredibil de puternică care oferă dezvoltatorilor mult mai mult control asupra domeniului la care are acces o funcție. A ști când un apel invers ar trebui să aibă acces la domeniul de aplicare al părintelui său și când nu ar trebui, poate ajuta un dezvoltator să determine ce tip de declarație să folosească.
Funcțiile săgeată oferă programatorilor o modalitate clară și concisă de a scrie apeluri fără a expune părți din domeniul de aplicare care ar trebui să fie ascunse. Ele permit, de asemenea, crearea de compoziții curate și simple, permițând și mai mult programarea funcțională în JavaScript.
Dezvoltatorii JS trebuie să fie conștienți de diferențele dintre cele două sintaxe și să fie atenți la care sintaxă este adecvată atunci când își declară funcțiile.