PodÃvejme se nynà znovu na Å¡ipkové funkce.
Å ipkové funkce nejsou jen âzkratkaâ pro zápis krátkého kódu. Majà urÄité velmi specifické a užiteÄné vlastnosti.
V JavaScriptu nastává spousta situacÃ, kdy potÅebujeme napsat malou funkci, která se bude spouÅ¡tÄt nÄkde jinde.
NapÅÃklad:
pole.forEach(funkce)âfunkceje spouÅ¡tÄna funkcÃforEachpro každý prvek pole.setTimeout(funkce)âfunkceje spouÅ¡tÄna zabudovaným plánovaÄem.- â¦a mnoho dalÅ¡Ãch.
VytvoÅit funkci a nÄkam ji pÅedat je zcela v duchu JavaScriptu.
A v takových funkcÃch obvykle nechceme opustit aktuálnà kontext. Tehdy Å¡ipkové funkce pÅijdou vhod.
Å ipkové funkce nemajà âthisâ
Jak si pamatujeme z kapitoly Objektové metody, âthisâ, Å¡ipkové funkce nemajà this. Jestliže k this pÅistupujeme, vezme se zvnÄjÅ¡ku.
NapÅÃklad je můžeme použÃt k iteraci uvnitÅ objektové metody:
let skupina = {
název: "Naše skupina",
studenti: ["Jan", "Petr", "Alice"],
zobrazSeznam() {
this.studenti.forEach(
student => alert(this.název + ': ' + student)
);
}
};
skupina.zobrazSeznam();
Zde je ve forEach použita Å¡ipková funkce, takže this.název v nà je pÅesnÄ stejný jako ve vnÄjšà metodÄ zobrazSeznam. Tedy: skupina.název.
Kdybychom použili âobyÄejnouâ funkci, nastala by chyba:
let skupina = {
název: "Naše skupina",
studenti: ["Jan", "Petr", "Alice"],
zobrazSeznam() {
this.studenti.forEach(function(student) {
// Chyba: Nelze naÄÃst vlastnost 'název' z undefined
alert(this.název + ': ' + student)
});
}
};
skupina.zobrazSeznam();
Chyba nastane proto, že forEach standardnÄ spouÅ¡tà funkci s this=undefined, takže je uÄinÄn pokus o pÅÃstup k undefined.název.
Na Å¡ipkové funkce to vliv nemá, protože ty prostÄ this nemajÃ.
newNeexistence this pochopitelnÄ znamená dalšà omezenÃ: Å¡ipkové funkce nelze použÃvat jako konstruktory. Nemůžeme je volat s new.
Existuje drobný rozdÃl mezi Å¡ipkovou funkcà => a obyÄejnou funkcà volanou pomocà .bind(this):
.bind(this)vytvoÅà âvázanou verziâ funkce.- Å ipka
=>žádnou vazbu nevytváÅÃ. Funkce prostÄ nemáthis. HledánÃthisse provádà pÅesnÄ stejným způsobem jako hledánà bÄžné promÄnné: ve vnÄjÅ¡Ãm lexikálnÃm prostÅedÃ.
Å ipkové funkce nemajà âargumentsâ
Å ipkové funkce také nemajà promÄnnou arguments.
To je vynikajÃcà pro dekorátory, když potÅebujeme pÅesmÄrovat volánà s aktuálnÃm this a arguments.
NapÅÃklad odlož(f, ms) pÅijÃmá funkci a vracà obal kolem nÃ, který odložà jejà volánà o ms milisekund:
function odlož(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms)
};
}
function ÅekniAhoj(kdo) {
alert('Ahoj, ' + kdo);
}
let ÅekniAhojOdložené = odlož(ÅekniAhoj, 2000);
ÅekniAhojOdložené("Jan"); // Ahoj, Jan po 2 sekundách
Totéž bez Å¡ipkové funkce by vypadalo následovnÄ:
function odlož(f, ms) {
return function(...argumenty) {
let kontext = this;
setTimeout(function() {
return f.apply(kontext, argumenty);
}, ms);
};
}
Zde jsme museli vytvoÅit navÃc promÄnné argumenty a kontext, aby je mohla pÅevzÃt funkce uvnitÅ setTimeout.
ShrnutÃ
Šipkové funkce:
- NemajÃ
this. - NemajÃ
arguments. - Nemohou být volány s
new. - Nemajà také
super, ale to jsme jeÅ¡tÄ neprostudovali. UÄinÃme tak v kapitole TÅÃdnà dÄdiÄnost.
Je to proto, že jsou urÄeny pro krátké Äásti kódu, které nemajà svůj vlastnà âkontextâ, ale mÃsto toho pracujà v aktuálnÃm. A v tomto způsobu použità opravdu vynikajÃ.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)