03.15 Callback funkce
Výuka
Proč Callback funkce?
Callback funkce jsou jedním z nejdůležitějších konceptů v JavaScriptu. Umožňují nám předat funkci jako argument jiné funkci a říct: "Udělej toto, a až budeš hotov, zavolej tuhle funkci."
Proč to potřebujeme?
- Asynchronní operace - Zpracovat odpověď z API, až přijde (ne hned)
- Event handling - Zareagovat na kliknutí, stisk klávesy
- Flexibilní kód - Nechat funkci dělat různé věci podle toho, jaký callback dostane
- Abstrakce opakování - Zopakovat akci N-krát, ale obsah akce nechat na callbacku
Představ si to jako: Pokyn obsluze v restauraci. Řekneš: "Přineste mi jídlo, a až to bude hotové, zavolejte mě na tohle číslo." Telefon je callback - obsluha ho zavolá, až bude jídlo připravené. Nemusíš čekat u pultru, můžeš dělat jiné věci.
Jak to funguje?
Callback je prostě funkce předaná jako argument.
1. Máš funkci A, která přijímá parametr
2. Jako parametr jí předáš funkci B (= callback)
3. Funkce A udělá svou práci
4. Funkce A zavolá funkci B v nějakém okamžiku (hned, nebo později)
5. Funkce B dostane data od funkce A
Klíčové koncepty
- Callback - funkce předaná jako argument jiné funkci
- Funkce jako hodnota - v JavaScriptu můžeš funkci předat jako argument (jako číslo nebo text)
- Synchronní callback - callback se zavolá ihned (např.
forEach,map) - Asynchronní callback - callback se zavolá později (např.
setTimeout, API volání) - Anonymní callback - callback definovaný přímo na místě bez pojmenování
JavaScript
Příklad 1: Nejjednodušší callback
function greet(name, callback) {
console.log("Hello " + name);
callback();
}
function sayGoodbye() {
console.log("Goodbye!");
}
greet("Alice", sayGoodbye);
// → Hello Alice
// → Goodbye!
Co se stalo?
- Funkce
greetpřijímá dva parametry:name(text) acallback(funkce) - Nejdřív vypíše "Hello Alice"
- Pak zavolá
callback()- což je funkcesayGoodbye sayGoodbyevypíše "Goodbye!"
Příklad 2: Callback s anonymní funkcí
function greet(name, callback) {
console.log("Hello " + name);
callback();
}
greet("Bob", function() {
console.log("Nice to meet you!");
});
// → Hello Bob
// → Nice to meet you!
Co se stalo?
- Místo předání pojmenované funkce jsme vytvořili anonymní funkci přímo na místě
- Tento pattern je v JavaScriptu velmi častý - nemusíme pojmenovávat funkci, kterou použijeme jen jednou
Příklad 3: Callback s arrow funkcí
function greet(name, callback) {
console.log("Hello " + name);
callback();
}
greet("Charlie", () => {
console.log("See you later!");
});
// → Hello Charlie
// → See you later!
Co se stalo?
- Použili jsme arrow funkci
() => { ... }jako callback - Je to ještě stručnější zápis než anonymní function
- Moderní způsob zápisu callbacků
Příklad 4: Callback s parametry
function processNumber(num, callback) {
const result = num * 2;
callback(result);
}
processNumber(5, function(doubled) {
console.log("Číslo zdvojnásobeno: " + doubled);
});
// → Číslo zdvojnásobeno: 10
Co se stalo?
processNumberzdvojnásobí číslo 5 → dostane 10- Zavolá callback a předá mu výsledek (10)
- Callback dostane 10 do parametru
doubleda vypíše ho
Příklad 5: Praktický příklad - Opakování akce
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
repeat(3, function(index) {
console.log("Krok " + index);
});
// → Krok 0
// → Krok 1
// → Krok 2
// Nebo s arrow funkcí:
let labels = [];
repeat(5, i => {
labels.push(`Položka ${i + 1}`);
});
console.log(labels);
// → ["Položka 1", "Položka 2", "Položka 3", "Položka 4", "Položka 5"]
Co se stalo?
repeatje abstrakce - zabalili jsme opakování do funkce- Obsah akce necháváme na callbacku - flexibilní!
- První příklad: callback vypisuje text
- Druhý příklad: callback plní pole
Příklad 6: Asynchronní callback - setTimeout
console.log("Start");
setTimeout(function() {
console.log("Toto se vypíše po 2 vteřinách");
}, 2000);
console.log("Konec");
// → Start
// → Konec
// → Toto se vypíše po 2 vteřinách (po 2s)
Co se stalo?
- Vypíše "Start"
setTimeoutnaplánuje callback na za 2000ms (2 vteřiny)- Program pokračuje dál - hned vypíše "Konec"
- Po 2 vteřinách se zavolá callback a vypíše zprávu
Důležité: Toto je asynchronní callback - nezastaví program!
TypeScript
TypeScript přidává typové anotace pro callback funkce - můžeš specifikovat, jaké parametry callback dostane a co vrátí.
Stejné příklady s typy
// Callback bez parametrů a bez návratové hodnoty
function greet(name: string, callback: () => void): void {
console.log("Hello " + name);
callback();
}
greet("Alice", () => {
console.log("Nice to meet you!");
});
// Callback s parametrem
function processNumber(num: number, callback: (result: number) => void): void {
const result = num * 2;
callback(result);
}
processNumber(5, (doubled) => {
console.log("Číslo zdvojnásobeno: " + doubled);
});
// Callback s návratovou hodnotou
function calculate(a: number, b: number, operation: (x: number, y: number) => number): number {
return operation(a, b);
}
const sum = calculate(5, 3, (x, y) => x + y);
console.log(sum);
// → 8
TypeScript přidává:
- ✅ Kontrolu typů callbacku - TS zkontroluje, že callback má správné parametry
- ✅ Lepší nápovědu - editor ti ukáže, jaké parametry callback dostane
- ✅ Prevenci chyb - nemůžeš předat callback s nesprávným podpisem
- ✅ Dokumentaci - hned vidíš, co callback očekává
Rozdíl JS vs TS
JavaScript:
- Callback může mít jakékoliv parametry
- Nemáš jistotu, co callback dostane
- Chyby odhalíš až při spuštění
- Flexibilnější, ale nebezpečnější
TypeScript:
- Callback má jasně definované parametry a návratový typ
- TypeScript zkontroluje, že callback sedí
- Chyby odhalíš už při psaní kódu
- Bezpečnější, lépe čitelné
// JavaScript - projde, ale způsobí problém
function process(callback) {
callback(42, "hello");
}
process((x) => x * 2); // Dostaneš číslo i text, ale očekáváš jen číslo
// TypeScript - editor tě upozorní
function process(callback: (num: number) => number): number {
return callback(42);
}
process((x: number) => x * 2); // ✅ OK
process((x: number, y: string) => x * 2); // ❌ Error: Wrong callback signature
Tip
💡 Anonymní vs pojmenované callbacky:
// ✅ Anonymní callback - pro jednoduché, jednorázové akce
setTimeout(() => console.log("Hotovo"), 1000);
// ✅ Pojmenovaný callback - pro složitější nebo opakovaně použitou logiku
function handleClick() {
console.log("Tlačítko kliknuto");
// ... další logika
}
button.addEventListener("click", handleClick);
💡 Callback hell (peklo callbacků) - vyvaruj se:
// ❌ Špatně - vnořené callbacky jsou těžko čitelné
getData(function(a) {
getMoreData(a, function(b) {
getMoreData(b, function(c) {
getMoreData(c, function(d) {
// ... horror!
});
});
});
});
// ✅ Dobře - použij Promises nebo async/await (pokročilé téma)
getData()
.then(a => getMoreData(a))
.then(b => getMoreData(b))
.then(c => getMoreData(c));
💡 Předávej funkci, ne její volání:
// ❌ Špatně - volání funkce hned
setTimeout(console.log("Ahoj"), 1000); // Vypíše "Ahoj" IHNED!
// ✅ Dobře - předání funkce (arrow funkce)
setTimeout(() => console.log("Ahoj"), 1000); // Vypíše "Ahoj" po 1s
// ✅ Dobře - předání reference na funkci
function sayHello() { console.log("Ahoj"); }
setTimeout(sayHello, 1000); // Pozor: bez závorek!
Kvíz
Co se stane, když předáš setTimeout(greet(), 1000) místo setTimeout(greet, 1000)?
❌ - Funkce se nečeká na 1 vteřinu, zavolá se hned
✅ - greet() se spustí okamžitě (kulaté závorky znamenají "zavolej teď"). setTimeout pak dostane návratovou hodnotu funkce (pravděpodobně undefined), ne funkci samotnou
❌ - Není to syntaktická chyba, JavaScript to provede
❌ - Funkce se zavolá jen jednou, a to hned
Správně: setTimeout(greet, 1000) - předáš referenci na funkci, ne její volání
🎯 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ě