03.12 Životní Cyklus Proměnných
Výuka
Proč životní cyklus proměnných?
Podívej se na tento kód. Co se stane?
console.log(name); // Co vypíše?
var name = "Alice";
Možná si řekneš: "Vypíše chybu - používáš name před deklarací!" Ale výsledek je:
// → undefined (žádná chyba!)
A co tenhle kód?
console.log(age); // Co vypíše?
let age = 25;
// → ReferenceError: Cannot access 'age' before initialization
Proč se var a let chovají různě? Protože JavaScript zpracovává deklarace ve dvou fázích:
- Kompilace - JavaScript "vidí" všechny deklarace a připraví prostor
- Spuštění - JavaScript vykoná kód řádek po řádku
Hoisting (česky "vytažení nahoru") popisuje, jak se deklarace chovají, jako by byly přesunuté na začátek scope. Ale var, let, const mají různé chování!
Proč je to užitečné?
- Pochopíš chyby - proč někdy dostaneš
undefined, jindyReferenceError - Pochopíš function hoisting - proč můžeš volat funkci před deklarací
- Napíšeš bezpečnější kód - vyhneš se pastím hoistingu
Představ si to jako: Plánování akce. Nejdřív si napíšeš, co všechno potřebuješ (deklarace), pak to postupně shromážďuješ (inicializace). Ale některé věci můžeš připravit dopředu (var), jiné musíš mít až v pravý čas (let/const).
Jak to funguje?
Hoisting = deklarace se "zpracují" před spuštěním kódu:
1. JavaScript nejdřív projde kód a najde všechny deklarace (var, let, const, function)
2. Vytvoří pro ně prostor v paměti
3. var: inicializuje na undefined
4. let/const: NEINICIALIZUJE - vytvoří "Temporal Dead Zone" (TDZ)
5. function: plně dostupná
6. Teprve pak spustí kód řádek po řádku
Důležité:
- Hoistuje se DEKLARACE, ne přiřazení
var xse hoistuje, alex = 5nelet/constmají TDZ - nelze použít před deklaracífunctiondeklarace jsou plně hoistované
Klíčové koncepty
- Hoisting - deklarace se zpracují před spuštěním kódu
- Temporal Dead Zone (TDZ) - oblast, kde
let/constnelze použít (od začátku scope do deklarace) - var hoisting -
varje inicializovaný naundefined - function hoisting - celá funkce je dostupná
- let/const hoisting - deklarace hoistuje, ale nelze použít (TDZ)
JavaScript
Příklad 1: var hoisting - inicializace na undefined
console.log(name); // Co vypíše?
var name = "Alice";
console.log(name);
Výsledek:
undefined
Alice
Co se stalo? JavaScript to "vidí" jako:
var name; // Deklarace hoistována nahoru, inicializováno na undefined
console.log(name); // → undefined
name = "Alice"; // Přiřazení zůstává na místě
console.log(name); // → Alice
- Deklarace
var namese hoistuje nahoru - Inicializace na
undefinedproběhne automaticky - Přiřazení
= "Alice"zůstává na původním místě
Příklad 2: let/const - Temporal Dead Zone (TDZ)
console.log(age); // ❌ ReferenceError!
let age = 25;
// ReferenceError: Cannot access 'age' before initialization
Co se stalo?
// -- TDZ začíná zde pro 'age' --
console.log(age); // ❌ age je v TDZ!
let age = 25; // -- TDZ končí zde --
console.log(age); // ✅ Teď už je OK
- Deklarace
let agese hoistuje, ALE není inicializovaná - Od začátku scope do řádku s
let ageje TDZ - Pokus o přístup v TDZ =
ReferenceError constse chová stejně jakolet
Příklad 3: Porovnání var vs let/const
// ✅ var - funguje (ale vrací undefined)
console.log(x); // → undefined
var x = 10;
// ❌ let - Error (TDZ)
console.log(y); // → ReferenceError
let y = 20;
// ❌ const - Error (TDZ)
console.log(z); // → ReferenceError
const z = 30;
Co se stalo?
varje hoistovaný a inicializovaný naundefined→ žádná chybaletaconstjsou v TDZ před deklarací →ReferenceError- Proto používej
let/const- brání použití před deklarací!
Příklad 4: Function hoisting - plně dostupné
// ✅ Funguje! Funkce je plně hoistovaná
greet("Alice"); // → "Hello, Alice!"
function greet(name) {
console.log("Hello, " + name + "!");
}
Co se stalo?
- Function deklarace jsou plně hoistované
- Celá funkce (deklarace + tělo) je dostupná od začátku scope
- Můžeš volat funkci před jejím napsáním v kódu!
Ale function expression ne:
// ❌ Nefunguje - function expression není hoistovaný
greet("Bob"); // → ReferenceError (let) nebo TypeError (var)
const greet = function(name) {
console.log("Hello, " + name + "!");
};
Příklad 5: Proč TDZ existuje
// ❌ var umožňuje použít proměnnou před deklarací
function badExample() {
console.log(count); // → undefined (matoucí!)
// ... 50 řádků kódu ...
var count = 0;
}
// ✅ let odhalí chybu hned
function goodExample() {
console.log(count); // → ReferenceError (jasná chyba!)
// ... 50 řádků kódu ...
let count = 0;
}
Co se stalo?
varvracíundefined- můžeš si myslet, že je vše OKletvyhodí chybu - okamžitě víš, že něco není v pořádku- TDZ tě chrání před používáním proměnné před inicializací!
Příklad 6: Hoisting ve scope
function outer() {
console.log(x); // → undefined (var hoisting uvnitř funkce)
if (true) {
var x = 10; // var se hoistuje na začátek FUNKCE
let y = 20; // let je jen v bloku
}
console.log(x); // → 10 (var viditelný v celé funkci)
console.log(y); // → ReferenceError (let jen v bloku)
}
outer();
Co se stalo?
var xse hoistuje na začátek funkce (function scope)let yje jen v bloku (block scope)- Hoisting respektuje typ scope!
TypeScript
TypeScript má stejný hoisting jako JavaScript - je to runtime chování!
// ❌ TypeScript ti neporadí, že var je hoistovaný
console.log(name); // TypeScript error: Variable 'name' is used before being assigned.
var name: string = "Alice";
// ❌ TypeScript odhalí TDZ problém
console.log(age); // TypeScript error: Block-scoped variable 'age' used before its declaration.
let age: number = 25;
TypeScript přidává:
- ✅ Varování před použitím - upozorní, pokud použiješ proměnnou před deklarací
- ✅ Lepší chybové hlášky - jasně řekne, co je špatně
- ✅ Kontrola při psaní - nemusíš čekat na runtime
Rozdíl JS vs TS
JavaScript:
// Runtime chování - odhalíš až při spuštění
console.log(x); // → undefined (překvapení!)
var x = 10;
console.log(y); // → ReferenceError (až při spuštění)
let y = 20;
TypeScript:
// Compile-time varování - odhalíš při psaní
console.log(x); // ⚠️ Variable 'x' is used before being assigned
var x: number = 10;
console.log(y); // ❌ Block-scoped variable 'y' used before its declaration
let y: number = 20;
Rozdíl:
- JavaScript odhalí problém až při spuštění (runtime)
- TypeScript upozorní při psaní (compile-time)
- Ale hoisting samotný funguje stejně v obou!
Tip
💡 Vždy deklaruj proměnné na začátku scope:
// ❌ Špatně - matoucí
function bad() {
console.log(count); // → undefined
// ... 50 řádků ...
var count = 0;
}
// ✅ Dobře - jasné
function good() {
let count = 0; // Hned na začátku
console.log(count); // → 0
// ... 50 řádků ...
}
💡 Používej let/const místo var:
// ❌ var - hoisting může zmást
var x = 1;
if (true) {
var x = 2; // Přepíše vnější x!
}
console.log(x); // → 2 (překvapení!)
// ✅ let - block scope, TDZ ochrana
let y = 1;
if (true) {
let y = 2; // Nový y jen v bloku
}
console.log(y); // → 1 (jak očekáváš)
💡 Function deklarace vs expression:
// ✅ Function deklarace - plně hoistovaná
sayHello(); // Funguje!
function sayHello() {
console.log("Hello!");
}
// ❌ Function expression - ne hoistovaná
sayGoodbye(); // ReferenceError!
const sayGoodbye = () => {
console.log("Goodbye!");
};
// Použij expression, pokud CHCEŠ zabránit hoistingu
Kvíz
Co vypíše tento kód?
console.log(typeof x);
console.log(typeof y);
var x = 10;
let y = 20;
❌ - let y je v TDZ, nelze použít ani s typeof
✅ - var x je hoistovaný a inicializovaný na undefined, takže typeof x je "undefined". let y je v TDZ → ReferenceError
❌ - var x NEHODÍ chybu, vrací undefined
❌ - x ještě nemá hodnotu 10, je undefined, takže typeof vrací "undefined", ne "number"
🎯 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ě