
A nyílfüggvények (más néven „zsírnyílfüggvények”) kétségtelenül az ES6 egyik legnépszerűbb jellemzője. Bevezették a tömör funkciók megírásának új módját.
Itt van egy ES5 szintaxissal írt függvény:
function timesTwo(params) { return params * 2}function timesTwo(params) { return params * 2 } timesTwo(4); // 8
Most itt van ugyanaz a függvény, amelyet nyílfüggvényként fejezünk ki:
var timesTwo = params => params * 2 timesTwo(4); // 8
Sokkal rövidebb! Az implicit visszatérések miatt el tudjuk hagyni a göndör zárójeleket és a return utasítást (de csak akkor, ha nincs blokk - erről bővebben alább).
Fontos megérteni, hogy a nyíl függvény hogyan viselkedik másként, mint a szokásos ES5 funkciók.
Változatok

Az egyik dolog, amit gyorsan észrevesz, az a nyílfunkciókban elérhető szintaxisok sokfélesége. Futtassuk át a közöseket:
1. Nincsenek paraméterek
Ha nincsenek paraméterek, akkor üres zárójeleket helyezhet el a =&
gt; elé .
() => 42
Valójában nincs is szükség zárójelre!
_ => 42
2. Egy paraméter
Ezekkel a függvényekkel a zárójel nem kötelező:
x => 42 || (x) => 42
3. Több paraméter
Zárójelek szükségesek ezekhez a funkciókhoz:
(x, y) => 42
4. Nyilatkozatok (szemben a kifejezésekkel)
A legalapvetőbb formájában a függvénykifejezés értéket állít elő, míg a függvény utasítás műveletet hajt végre.
A nyíl funkcióval fontos megjegyezni, hogy az állításoknak göndör zárójelekkel kell rendelkezniük. Amint a göndör zárójel megvan, mindig írnia kellreturn
is.
Íme egy példa az if utasításhoz használt nyílfüggvényre:
var feedTheCat = (cat) => { if (cat === 'hungry') { return 'Feed the cat'; } else { return 'Do not feed the cat'; } }
5. „Blokk test”
Ha a funkciója blokkban van, akkor az explicit return
utasítást is használnia kell :
var addValues = (x, y) => { return x + y }
6. Tárgy literálok
Ha egy tárgy betűjét adja vissza, azt zárójelbe kell csomagolni. Ez arra kényszeríti az értelmezőt, hogy értékelje, mi van a zárójelben, és az objektum literál visszatér.
x =>({ y: x })
Szintaktikailag névtelen

Fontos megjegyezni, hogy a nyílfüggvények névtelenek, ami azt jelenti, hogy nem nevezik meg őket.
Ez a névtelenség néhány problémát vet fel:
- Nehezebb hibakeresés
Ha hibát kap, akkor nem tudja nyomon követni a függvény nevét vagy a pontos sorszámot, ahol történt.
2. Nincs önreferencia
Ha a funkciójának bármikor rendelkeznie kell önreferenciával (pl. Rekurzió, eseménykezelő, amelynek ki kell kapcsolódnia), akkor nem fog működni.
Fő előny: Nincs kötelező érvényű

A klasszikus függvénykifejezésekben a this
kulcsszó különböző értékekhez van kötve a kontextus alapján , amelyben hívják. Nyíllal funkciók azonban this
nem lexikailag kötve . Ez azt jelenti, hogy this
a nyílfüggvényt tartalmazó kódból használja .
Nézze meg például az setTimeout
alábbi függvényt:
// ES5 var obj = { id: 42, counter: function counter() { setTimeout(function() { console.log(this.id); }.bind(this), 1000); } };
Az ES5 példában arra .bind(this)
van szükség, hogy segítsen átadni a this
kontextust a függvénynek. Ellenkező esetben alapértelmezés this
szerint nincs meghatározva.
// ES6 var obj = { id: 42, counter: function counter() { setTimeout(() => { console.log(this.id); }, 1000); } };
Az ES6 nyílfüggvények nem köthetők this
kulcsszavakhoz, ezért lexikálisan felmennek egy hatókörbe, és annak értékét használják fel this
abban a körben, amelyben meghatározták.
Amikor nem szabad használni a nyílfüggvényeket
Miután többet megtudtam a nyílfüggvényekről, remélem, megértette, hogy ezek nem helyettesítik a szokásos függvényeket.
Íme néhány olyan eset, amikor valószínűleg nem szeretné használni őket:
- Objektum módszerek
Híváskor cat.jumps
az életek száma nem csökken. Azért van, mert this
nem kötődik semmihez, és örökölni fogja annak értékét this
a szülői hatóköréből.
var cat = { lives: 9, jumps: () => { this.lives--; } }
2. Visszahívási funkciók dinamikus kontextusban
Ha a kontextusnak dinamikusnak kell lennie, a nyílfüggvények nem a megfelelő választás. Vessen egy pillantást az alábbi eseménykezelőre:
var button = document.getElementById('press'); button.addEventListener('click', () => { this.classList.toggle('on'); });
Ha rákattintunk a gombra, akkor egy TypeError-t kapunk. Azért van, mert this
nem a gombhoz van kötve, hanem a szülő hatóköréhez.
3. Amikor ez kevésbé olvashatóvá teszi a kódot
Érdemes figyelembe venni a korábban ismertetett szintaxis változatosságát. Rendszeres funkcióival az emberek tudják, mire számíthatnak. A nyíl funkciókkal nehéz lehet megfejteni azt, amit azonnal néz.
Mikor érdemes használni őket
A nyílfüggvények a legjobban ragyognak, amihez this
meg kell kötni a kontextust, és nem magával a funkcióval.
Annak ellenére, hogy névtelenek, én is szívesen használom őket olyan módszerekkel, mint a map
és reduce
, mert úgy gondolom, hogy ez könnyebben olvashatóvá teszi a kódomat. Számomra a profik meghaladják a hátrányokat.
Köszönjük, hogy elolvasta a cikkemet, és ossza meg, ha tetszett! Nézze meg a többi cikkemet, például a Hogyan építettem fel a Pomodoro Clock alkalmazást, és az általam tanult tanulságokat, valamint a Demystify a JavaScript 'új' kulcsszavát.