03.02 Function Expression
Výuka
Proč Function Expression?
V předchozí lekci jsi viděl, že funkce je hodnota - můžeš ji uložit do proměnné. Existují dva způsoby, jak vytvořit funkci:
- Function Expression (funkční výraz) -
const fn = function() {} - Function Declaration (deklarace funkce) -
function fn() {}
Function expression je flexibilnější:
- Můžeš ji přiřadit do proměnné
- Předat jako argument jiné funkci (callback)
- Vytvořit funkci přímo v místě použití
- Změnit funkci za běhu programu (
let)
Představ si to jako: Rozdíl mezi psaním dopisu (declaration) a SMS zprávou (expression). Obojí doručí zprávu, ale SMS je rychlejší a flexibilnější - můžeš ji poslat kdykoli, změnit text za běhu.
Jak to funguje?
1. Vytvoříš funkci pomocí `function() {}`
2. Přiřadíš ji do proměnné: `const nazev = function() {}`
3. Funkce je normální hodnota - můžeš s ní dělat cokoli jako s číslem nebo textem
4. Voláš ji stejně: `nazev()`
Klíčový rozdíl: Function expression se vytvoří až při provádění kódu, ne předem.
Klíčové koncepty
- Funkce jako hodnota - můžeš ji přiřadit, předat, vrátit, uložit do pole
- Expression vs Declaration - expression se vytvoří při provádění, declaration při načtení
- Hoisting - declaration se "přesunou" na začátek, expression ne
- Přepisování - pokud použiješ
let, můžeš funkci později změnit
JavaScript
Příklad 1: Funkce jako hodnota
const launch = function() {
console.log("Launching!");
};
launch();
// → Launching!
Co se stalo?
- Vytvořili jsme funkci pomocí
function() {} - Přiřadili ji do proměnné
launch - Funkce je hodnota - stejně jako číslo nebo text
- Voláme ji
launch()- normálně jako každou funkci
Příklad 2: Přepisování funkce za běhu
let launchMissiles = function() {
missileSystem.launch("now");
};
if (safeMode) {
// V bezpečném režimu změníme funkci na prázdnou
launchMissiles = function() {
/* nic nedělá */
};
}
launchMissiles(); // V safe mode nic neudělá
Co se stalo?
- Použili jsme
letmístoconst- proměnnou můžeme přepsat - Podle podmínky (
safeMode) nahradíme funkci jinou funkcí - To je extrémně užitečné - můžeme změnit chování za běhu!
- Důležité: Tohle by nešlo s
const- ta neumožňuje přepis
Příklad 3: Function Declaration (porovnání)
Function Expression (co jsme používali):
const square = function(x) {
return x * x;
};
Function Declaration (zkrácený zápis):
function square(x) {
return x * x;
}
Vypadá to stejně, ale je jeden zásadní rozdíl - hoisting:
// ✅ Tohle FUNGUJE - function declaration
console.log("The future says:", future());
function future() {
return "You'll never have flying cars";
}
// ❌ Tohle NEFUNGUJE - function expression
console.log(greet("Alice")); // Error: Cannot access 'greet' before initialization
const greet = function(name) {
return "Hello " + name;
};
Proč?
- Function declaration se "přesune" (hoist) na začátek souboru při načítání
- Function expression se vytvoří až když JavaScript dojde k tomu řádku
- Deklaraci můžeš volat kdekoli, expression až po její definici
TypeScript
TypeScript přidává typy pro funkce - můžeš specifikovat typ celé funkce, ne jen parametrů.
// Typ funkce: () => void (žádné parametry, nic nevrací)
const launch = function(): void {
console.log("Launching!");
};
// Explicitní typ proměnné: funkce bez parametrů vracející void
let launchMissiles: () => void = function() {
console.log("Safe mode activated");
};
// Můžeme přepsat na jinou funkci stejného typu
launchMissiles = function() {
console.log("Different implementation");
};
// Function declaration s typy
function future(): string {
return "You'll never have flying cars";
}
TypeScript přidává:
- ✅ Typ celé funkce -
() => void,(x: number) => numberatd. - ✅ Kontrolu při přepisování - nemůžeš přepsat funkci na jiný typ
- ✅ Bezpečnost - pokud změníš typ funkce, editor tě upozorní na všechna místa, kde je použita
Rozdíl JS vs TS
JavaScript:
let greet = function(name) {
return "Hello " + name;
};
// Můžeš přepsat na úplně jiný typ - JS to nevadí
greet = 42; // ✅ Funguje (ale je to špatně!)
greet(); // 💥 Runtime error: greet is not a function
TypeScript:
let greet = function(name: string): string {
return "Hello " + name;
};
// TypeScript zabrání přepisu na jiný typ
greet = 42; // ❌ Error: Type 'number' is not assignable to type '(name: string) => string'
// Můžeš přepsat jen na funkci stejného typu
greet = function(name: string): string {
return "Hi " + name; // ✅ OK - stejný typ
};
Tip
💡 Kdy použít expression vs declaration?
// ✅ Function expression - pro callbacks, podmíněné funkce
const handleClick = function() { /* ... */ };
button.addEventListener('click', handleClick);
// ✅ Function declaration - pro hlavní API tvého modulu
function calculateTax(price) {
return price * 0.21;
}
💡 Vždy používej const pro funkce:
// ✅ Dobře - funkci nelze omylem přepsat
const greet = function(name) {
return "Hello " + name;
};
// ❌ Špatně - funkci můžeš omylem přepsat
let greet = function(name) {
return "Hello " + name;
};
greet = 42; // Uups! Smazali jsme funkci
💡 Hoisting můžeš ignorovat - piš kód shora dolů:
// ✅ Dobře - čitelné, logické pořadí
const add = function(a, b) { return a + b; };
const result = add(5, 3);
// ⚠️ Funguje, ale matoucí - funkce je definovaná až pod voláním
const result = add(5, 3);
function add(a, b) { return a + b; }
Kvíz
Co se stane, když zkusíš zavolat function expression před její definicí?
console.log(greet("Alice"));
const greet = function(name) { return "Hello " + name; };
❌ - To by fungovalo jen s function declaration
❌ - greet existuje, ale ještě není inicializovaná
✅ - Function expression se vytvoří až při provádění řádku, ne předem
❌ - Ani se nedostaneme k volání, chyba nastane dřív
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě