Peale süntaksi on nende kahe vahel täiendavaid erinevusi.
Nagu peaaegu iga kaasaegne programmeerimiskeel, pakub JavaScript viise, kuidas luua funktsioone, mis võimaldavad koodi korduvkasutatavust. Neile, kes pole keelega tuttavad, on JavaScriptis funktsiooni deklareerimiseks kaks erinevat viisi.
Algselt, funktsiooni kasutati märksõna ja hiljem loodi noole süntaks. Ehkki ulatuse juurdepääsetavuse poolest erinevad, loovad nii funktsiooni märksõna kui ka noole süntaks sarnaseid tulemusi.
Suutmatus nende kahe vahel vahet teha võib põhjustada probleeme ja viia vale kasutamiseni. Kaasaegne JS-i arendaja peab mõistma, kuidas iga funktsiooni deklaratsioon mõjutab ulatust ja nähtavust.
Mis on JavaScripti noolefunktsioonid?
JavaScripti noolefunktsioonid on alternatiivne viis funktsioonide määratlemiseks, mis ei kasuta vaikeseadet funktsiooni märksõna:
funktsioonilogisõnum(sõnum) {
konsool.log (sõnum);
}konst logMessage = (sõnum) => {
konsool.log (sõnum);
}
konst logMessage = sõnum =>konsool.log (sõnum);
Ülal näete sama sõnumit, mis on kirjutatud kolmel erineval viisil. Esimene kasutab tavalist funktsiooni deklaratsiooni meetodit. Järgmised kaks näitavad kahte võimalust ES6 noolefunktsioonide kasutamiseks.
JavaScript võttis esmakordselt kasutusele noolefunktsiooni süntaksi koos ECMAScript 2015 standardite väljalaskmisega. Noolefunktsioonid pakkusid selget ja ülevaatlikku võimalust funktsioonide kiireks loomiseks ning huvitavat lahendust mitmele JavaScripti pikaajalise ulatusega probleemile.
Need funktsioonid muutsid noolefunktsioonid kiiresti paljude arendajate seas populaarseks. Moodsat JavaScripti koodibaasi uurivad programmeerijad leiavad sama suure tõenäosusega noolefunktsioone kui tavalisi funktsioone.
Kuidas erinevad noolefunktsioonid JavaScripti tavalistest funktsioonidest?
Esmapilgul ei paista noolefunktsioonid paljuski erinevat funktsiooni märksõnaga deklareeritud funktsioonidest. Väljaspool süntaksit sisaldavad mõlemad korduvkasutatavat toimingute kogumit, mida saab koodis mujalt välja kutsuda.
Vaatamata nende kahe sarnasustele on siiski mõned erinevused, mida arendajad peavad teadma.
Erinevus ulatuses
Kui JavaScriptis deklareeritakse tavaline funktsioon, siis see funktsioon toimib sulgurina, mis loob oma ulatuse. See võib teatud spetsialiseeritud funktsioonide kasutamisel põhjustada probleeme, näiteks setTimeout ja setInterval.
Enne ES6-t oli märkimisväärne hulk lahendusi, mis tõstsid üksused tagasihelistamisel kasutamiseks kõrgemal tasemel. Need häkkimised töötasid, kuid neid oli sageli raske mõista ja need võivad põhjustada probleeme teatud muutujate ülekirjutamisega.
Noolefunktsioonid lahendasid mõlemad probleemid lihtsalt ja elegantselt. Kui noolefunktsiooni kasutatakse tagasihelistamise osana, on sellel juurdepääs samale ulatusele kui funktsioonil, millest see välja kutsuti.
See võimaldas funktsioone kasutada tagasihelistamisena, kaotamata juurdepääsu kontekstile, milles algset sündmust kutsuti. Lihtsa testina selle põhimõtte toimimiseks saate seadistada viivitusega sõnumside funktsiooni, nagu alloleva.
funktsioonihilinenud sõnum(sõnum, viivitus) {
setTimeout(funktsiooni(sõnum) {
konsool.log (sõnum);
}, viivitus);}
delayedMessage("Tere, Maailm", 1000);
Funktsioon on lihtne, aktsepteeritav sõnum ja viivitus millisekundites. Pärast viivituse möödumist peaks see sõnumi konsooli logima. Kui aga kood käivitatakse, määratlemata logitakse konsooli sisse saadetud sõnumi asemel.
Tagasihelistamise funktsiooni käivitamisel muutub ulatus ja algsele sõnumile pole enam juurdepääsetav. Sõnumi kasutamine sulgemise seest nõuab sõnumi tõstmist globaalsesse muutujasse, mille tulemusena võidakse see enne tagasihelistamist üle kirjutada.
Noolefunktsioon on selle probleemi õige lahendus. Kui asendate esimese argumendi poolt setTimeout, saab ulatust säilitada ja funktsioonil on juurdepääs sõnumile, mis on edastatud hilinenud sõnum.
funktsioonihilinenud sõnum(sõnum, viivitus) {
setTimeout(() => {
konsool.log (sõnum);
}, viivitus);}
delayedMessage("Tere, Maailm", 1000);
Nüüd, kui see täidetakse, hilinenud sõnum funktsioon logib sõnumi. Lisaks võimaldab see panna järjekorda mitu sõnumit erinevate viivitustega ja need kõik ilmuvad ikka õigel ajal.
See on tingitud asjaolust, et iga kord hilinenud sõnum kasutatakse, genereerib see oma ulatuse koos oma sisemise noolefunktsiooni koopiaga.
Koodi loetavus
Kuigi noolefunktsioonid on kasulikud tagasihelistamistena, kasutatakse neid ka koodi puhta ja kokkuvõtlikuna hoidmiseks. Ülaltoodud jaotises näete, et noolefunktsiooni kasutamine muudab hõlpsasti selgeks, mis juhtub, kui hilinenud sõnum funktsiooni kutsutakse.
Kuna funktsioonid muutuvad keerukamaks, võib väike selgus muuta kood palju loetavamaks. Objektide koostamisel võib see lühikeste funktsioonide lisamisel koodi lihtsamaks muuta:
klassloendur{
_count = 0;
juurdekasv = () => {
see._count += 1;
}
vähenemine = () => {
see._count -= 1;
}
arv = () => {
tagasisee._count;
}
}
lase ct = uus loendur();
Roll objektorienteeritud programmeerimises
Kuigi JavaScripti noolefunktsioonid on funktsionaalse programmeerimise lahutamatu osa, on neil ka oma koht objektorienteeritud programmeerimine. Noolefunktsioone saab kasutada klassideklaratsioonides:
klassorderLineItem{
_LineItemID = 0;
_Toode = {};
_kogus = 1;konstruktor(toode) {
see._LineItemID = crypto.randomUUID();
see._Toode = toode
}
changeLineItemQuantity = (uusKv) => {
see._Qty = uus kogus;
}
}
Noolefunktsiooni kasutamine meetodite deklareerimiseks klassideklaratsioonis ei muuda funktsiooni käitumist klassis. Väljaspool klassi avaldab see aga funktsiooni, võimaldades seda kasutada teistel klassidel.
Tavalistele funktsioonidele ei pääse juurde väljaspool klassideklaratsiooni, ilma et neid kutsutaks. See tähendab, et kuigi teised klassideklaratsioonid võivad neid funktsioone pärida, ei saa neile otse juurde pääseda teiste klasside koostamiseks.
Millal peaksite kasutama JavaScripti noolefunktsioone?
JavaScripti noolefunktsioonid on uskumatult võimas funktsioon, mis annab arendajatele palju suurema kontrolli selle üle, millisele ulatusele funktsioonil on juurdepääs. Teadmine, millal peaks tagasihelistamisel olema juurdepääs oma vanema ulatusele ja millal mitte, võib arendaja otsustada, millist tüüpi deklaratsiooni kasutada.
Noolefunktsioonid annavad programmeerijatele selge ja kokkuvõtliku viisi tagasihelistuste kirjutamiseks, paljastamata valdkonda, mida tuleks peita. Samuti võimaldavad need luua puhtaid ja lihtsaid kompositsioone, võimaldades veelgi funktsionaalset programmeerimist JavaScriptis.
JS-i arendajad peavad olema teadlikud kahe süntaksi erinevustest ja arvestama, milline süntaks on nende funktsioonide deklareerimisel sobiv.