Noolefunktsioonid on puhtamad ja lihtsamad kui nende pikaajaline tavaline alternatiiv, kuid te ei tohiks kiirustada neid kasutama, teadmata, kuidas need töötavad.
Noolefunktsiooni süntaks saabus koos ECMAScript 2015, tuntud ka kui ES6, väljalaskmisega. Tänapäeval on noolefunktsioonid muutunud paljude JavaScripti programmeerijate lemmikfunktsiooniks. See armastus noolefunktsioonide vastu on tingitud märksõna "see" kokkuvõtlikust süntaksist ja otsekohesest käitumisest.
Kuid noolefunktsioonidel on mõned puudused. Lugege peamiste erinevuste kohta noolefunktsioonide ja tavaliste funktsioonide vahel ning selgitage välja, miks on enamikul juhtudel parem tavaliste funktsioonide juurde jääda.
1. Enne selle kasutamist peate määratlema noolefunktsiooni
Noolefunktsiooni ei saa tõsta. JavaScripti vaikimisi tõstereeglid võimaldab teil funktsiooni enne selle määratlemist välja kutsuda, kuid noolefunktsioonide puhul see nii ei ole. Kui teil on funktsioonidega JavaScripti fail, tähendab see, et kogu oluline kood on faili allosas.
Mõelge näiteks järgmisele JavaScripti koodile:
konst doubleNumbers = (numbrid) {
numbers.map(n => n* 2)
}konst halfNumbers = (numbrid) {
numbers.map(n => n / 2)
}konst sumNumbers = (numbrid) {
numbers.reduce((summa, n) => {
tagasi summa + n;
}, 0)
}
konst numbrid = [1, 20, 300, 700, 1500]
konst kahekordistatud = topeltNumbrid (numbrid)
konsool.log (halveNumbers (doublered))
konsool.log (sumNumbers (numbrid))
Ülaltoodud koodiplokis on oluline kood allosas. Abifunktsioonid on kõik määratletud enne täitmispunkti. Peavad luua oma JavaScripti funktsioone faili ülaosas võib olla ebamugav, kuna peate allapoole kerima, et näha tegelikku koodi, mis tööd teeb.
Kui teisaldasite abifunktsioonid alla ja tegeliku koodi üles, kuvatakse viitevea. Käitusaeg käsitleb funktsiooni muutujana. Seega peate selle esmalt määratlema, enne kui sellele juurde pääsete või selle käivitate. Kui aga teisendasite kõik noolefunktsioonid tavalisteks funktsioonideks (koos funktsiooni märksõna), siis teie kood toimiks hästi. Samal ajal jääb oluline kood ülaossa, kust saate selle asukoha leida.
See on üks suuremaid probleeme noolefunktsioonide kasutamisel. Nad ei näita mingit hostimiskäitumist. Teisisõnu peate need määratlema enne tegelikku kohta, kus neid kasutate. Teisest küljest saate tõsta tavalisi funktsioone.
2. Noolefunktsioonid võivad mõnele inimesele segadusse ajada
Teine põhjus, miks noolefunktsioonide asemel kasutada tavalisi funktsioone, on loetavus. Tavalisi funktsioone on lihtsam lugeda, kuna need kasutavad selgesõnaliselt funktsiooni funktsiooni märksõna. See märksõna tuvastab, et kõnealune kood on funktsioon.
Teisest küljest määrate muutujatele noolefunktsioonid. Algajana võib see teid segadusse ajada, arvates, et kood on muutuja, mitte funktsioon.
Võrrelge kahte allolevat funktsiooni:
konst poolNumbrid = (numbrid) => {
tagasi numbers.map(n => n / 2)
}
funktsioonipoolNumbreid(numbrid) {
tagasi numbers.map(n => n / 2)
}
Esmapilgul saate hõlpsasti aru, et koodi teine tükk on funktsioon. Süntaks teeb selgeks, et kood on funktsioon. Esimene on aga mitmetähenduslik – te ei pruugi kergesti aru saada, kas see on muutuja või funktsioon.
3. Te ei saa meetoditena kasutada noolefunktsioone
Kui kasutate noolefunktsiooni, siis see märksõna vastab sellele, mis on väljaspool asja, mille sees oleme. Enamikul juhtudel on see aknaobjekt.
Mõelge järgmisele objektile:
konst inimene = {
eesnimi: "Kyle",
perekonnanimi: "Kokk",
Prindi nimi: () => {
konsool.log(`${see.eesnimi}``${see.perekonnanimi}` )
}
}
isik.prindinimi()
Kui käivitate koodi, märkate, et brauser prindib määratlemata nii ees- kui perekonnanime jaoks. Kuna me kasutame noolefunktsiooni, see märksõna vastab aknaobjektile. Samuti ei ole eesnimi või perekonnanimi seal määratletud vara.
Selle probleemi lahendamiseks peate selle asemel kasutama tavalist funktsiooni:
konst inimene = {
eesnimi: "Kyle",
perekonnanimi: "Kokk",
Prindi nimi: funktsiooni() {
konsool.log(`${see.eesnimi}``${see.perekonnanimi}` )
}
}
isik.prindinimi()
See toimib hästi, sest see viitab isik objektiks. Kui kavatsete palju sellist objektorienteeritud programmeerimist teha, peate veenduma, et kasutate tavalisi funktsioone. Noolefunktsioonid ei tööta.
Millal noolefunktsioone kasutada
Kasutage noolefunktsioone peamiselt kohtades, kus vajate anonüümset funktsiooni. Sellise stsenaariumi näide on tagasihelistamisfunktsiooni käsitlemine. Tagasihelistamise kirjutamisel on parem kasutada noolefunktsiooni, kuna süntaks on palju lihtsam kui täisfunktsiooni kirjutamine.
Võrrelge neid kahte ja otsustage, kumb on lihtsam:
funktsioonipoolNumbreid(numbrid) {
tagasi numbers.map(n => n / 2)
}
funktsioonipoolNumbreid(numbrid) {
tagasi numbers.map(funktsiooni(n) {
tagasi n / 2
})
}
Mõlemal juhul edastatakse tagasihelistamisfunktsioon meetodile map(). Kuid esimene tagasihelistamine on noolefunktsioon, teine aga täisfunktsioon. Näete, kuidas esimene funktsioon võtab vähem koodiridu kui teine funktsioon: kolm vs. viis.
Teine aeg noolefunktsioonide kasutamiseks on alati, kui soovite tegeleda konkreetse "selle" süntaksiga. Objekt "see" muutub sõltuvalt sellest, kas kasutate teatud asjade jaoks tavalisi funktsioone või noolefunktsioone.
Järgmine koodiplokk registreerib dokumendiobjektil kaks "klõpsamise" sündmusekuulajat. Esimene eksemplar kasutab tagasihelistajana tavalist funktsiooni, teine aga noolefunktsiooni. Mõlemas tagasihelistuses logib kood täitmisobjekti (selle) ja sündmuse sihtmärgi:
dokument.addEventListener("klõpsake", funktsiooni(e) {
konsool.log("FUNKTSIOON", see, e.sihtmärk)
})
dokument.addEventListener("klõpsake", (e) => {
konsool.log("NOOL", see, e.sihtmärk)
})
Kui käivitaksite selle skripti, märkate, et viide "see" on mõlema puhul erinev. Tavafunktsiooni puhul viitab see atribuut dokumendile, mis on sama e.sihtmärk vara. Kuid noolefunktsiooni puhul viitab see aknaobjektile.
Kui kasutate tagasihelistajana tavalist funktsiooni, viitab see elemendile, kus sündmuse käivitame. Kuid kui kasutate noolefunktsiooni, on selle märksõna vaikimisi aknaobjekt.
Lisateave noolefunktsioonide ja tavaliste funktsioonide kohta
Tavaliste funktsioonide ja noolefunktsioonide vahel on mitmeid muid peeneid erinevusi. Mõlemat tüüpi funktsioonide valdamine on JavaScripti valdamise aluseks. Õppige, millal kasutada üht ja millal teist; siis mõistate oma JavaScriptis tavalise funktsiooni või noolefunktsiooni kasutamise tagajärgi.