Základy JavaScriptu
Řízení běhu programu
 Tisk

Řízení běhu programu

V kódu JavaScriptu se příkaz skládá z jedné nebo několika položek a symbolů na řádku. Příkazy jsou obvykle ukončeny středníkem. V praxi, pokud píšete každý příkaz na zvláštní řádek, můžete středník vynechat. Je však žádoucí si zvyknout používat středník k ukončení zápisu příkazu vždy. Příklad zápisu příkazů:

     Jmeno = "Petr";

     var dnes = new Date();

Skupina příkazů JavaScriptu ohraničená složenými závorkami se nazývá blok nebo také složený příkaz. Bloky příkazů se používají například ve funkcích a podmínkách. V následujícím příkladu začíná první příkaz definici funkce, která se skládá z bloku pěti příkazů. Poslední tři příkazy, které nejsou ohraničeny složenými závorkami, nejsou v bloku a nejsou součástí definice funkce.

     function Konvertuj (palcu) {

       // následujích 5 příkazů tvoří blok

       stopa = palcu / 12;

       mil = stopa / 5280;

       namornich_mil = stopa / 6080;

       cm = palcu * 2.54;

       metru = palcu * 39.37

;

     }

      // následující 3 příkazy nejsou částí bloku

     km = metru / 1000;

     kradius = km;

     mradius = mil;

S funkcí (doplněnou o příkazy výstupu) můžete experimentovat − viz ukázka .

Podmíněné příkazy

JavaScript podporuje podmíněný příkaz ve tvaru if a if…else. V příkazu if se testuje podmínka a pokud je splněna provede se kód za if. V příkazu if…else je navíc vykonán kód za else pokud je výsledkem testu podmínky hodnota false. Nejjednodušší podoba příkazu může být napsána na jedné řádce, nicméně daleko více se budete setkávat s víceřádkovou formou. Dalším podmíněným příkazem je příkaz switch. K rozvětvení programu lze použít i podmínkový operátor.

Příkazy if, if…else

Podmíněně vykoná skupinu příkazů v závislosti na hodnotě podmínky.

Syntaxe:

     if (podmínka)

       příkaz1

       [else

       příkaz2];

Syntaxe příkazů if, if…else má tyto části:


Část Popis
podmínka Logický výraz. Pokud je podmínka null nebo undefined, je vyhodnocena jako false.
příkaz1 Příkaz k vykonání pokud je podmínka vyhodnocena jako true. Může se jednat také o složený příkaz.
příkaz2 Příkaz k vykonání pokud je podmínka vyhodnocena jako false. Může se jednat také o složený příkaz.

Pro přehlednost a vyloučení nechtěných chyb je dobrým zvykem uzavírat příkaz1 a příkaz2 do složených závorek. V následujícím příkladu by se mohlo zdát, že else patří k prvnímu if, ale ve skutečnosti patří k tomu druhému:

     if (x == 5)

     if (y == 6)

      z = 17;

      else

      z = 20;

Úpravou kódu do následující podoby vyloučíme všechny mnohoznačnosti - viz také ukázka .

     if (x == 5)

     {

     if (y == 6)

     z = 17;

     }

     else

     z = 20;

Podobně, pokud budete chtít přidat příkaz do Příkaz1 a nepoužijete složenou závorku, nastane chyba:

     if (x == 5)

     z = 7;

     q = 42;

     else

     z = 19;

V tomto příkladu je chyba v syntaxi, tj. je více než jeden příkaz mezi if a else. Pro správný běh programu je nutností doplnění složených závorek okolo příkazů, které jsou mezi if a else.

Následující příklady jsou demonstrací příkazu if…else. První z nich ukazuje nejjednodušší druh testu. Pokud má proměnná nova_lod hodnotu true, provede se kód následující po if:

     // Funkce Rozbij() je definována už někde dříve

     // v programu

     if (nova_lod)

     Rozbij(lahevSampanskeho);

     // Test proměnné nova_lod

V následujícím příkladu se příkaz odpoved = "Je to slon"; provede pouze v případě, že jsou splněny obě podmínky. V ukázce je použit objekt (podrobněji viz studijní článek Objekty v JavaScriptu).

     if (zvire.usi == "velke" && zvire.nohy == 4)

     {

      odpoved = "Je to slon"; }

Následující příklad ilustruje situaci, kdy je proveden příkaz modra_knizka = true; v případě, že je splněna alespoň jedna z podmínek vyska < 150 a hmotnost > 200. Pokud není splněna žádná z podmínek, provede se příkaz modra_knizka = false - viz ukázka .

     // test bude true pokud platí alespoň jedna

     // podmínka

     var modra_knizka;

     if ((vyska < 150) || (hmotnost > 200))

     {

     modra_knizka = true;

     }

     else

     modra_knizka = false;

Pokud máte několik podmínek ke společnému otestování a víte, že jedna má vyšší pravděpodobnost kladného či záporného výsledku (to závisí na použitém operátoru, tj. || nebo &&), můžete urychlit běh programu umístěním této podmínky na začátek podmíněného příkazu. Například jestliže musí být splněny všechny tři podmínky (spojené operátorem &&) a druhá podmínka nebude splněna, třetí se vůbec vyhodnocovat nebude. Podobně v případě, kdy stačí jediná kladně vyhodnocená podmínka z několika (při použití operátoru ||), skončí vyhodnocování, jakmile jedna z podmínek bude splněna.

Podmínkový operátor

Podmínkový operátor je jediným operátorem se třemi operandy (ternární operátor). První operand podmínkového operátoru musí mít logickou hodnotu (obvykle výsledek porovnání). Druhý a třetí operand mohou mít jakoukoli hodnotu. Hodnota vrácená podmínkovým operátorem závisí na logické hodnotě prvního operandu. Pokud je true, pak je hodnota podmínkového operandu rovna hodnotě druhého operandu. Pokud je false, pak je hodnota rovna hodnotě třetího operandu. K zápisu podmínkového operátoru používáme znak otazník, který píšeme za výraz, jehož hodnotu testujeme (narozdíl od if, které se píše před výraz), následují druhý a třetí operand, které jsou odděleny dvojtečkou. Situace je ilustrována příkladem viz ukázka . Při změně hodnot hodina a jmeno se změní i výstupní hodnoty programu.

     var denni_doba = " ";

     // následující podmínkový operátor určí denní

     // dobu, je použita proměnná hodina,

     // která již byla dříve definována

     denní_doba += ( hodina >= 12) ? "odpol" : "dopol";

Následující zápis :

     Pozdrav="ahoj"+((jmeno!=null) ? jmeno : "kamaráde"

je ekvivalentní s

     Pozdrav = "ahoj";

     if (jmeno != null)

     Pozdrav += jmeno

     else

     Pozdrav += "kamaráde"

Příkaz switch

Přepne na příkaz či skupinu příkazů, jejichž návěští odpovídá hodnotě výrazu.

Syntaxe:

     switch (výraz) {

     case návěští:

     seznam příkazů

     case návěští:

     seznam příkazů

     ...

     default:

     seznam příkazů

     }

Příkaz switch má následující části:


Část Popis
výraz Logický výraz.
návěští Pokud je návěští rovno aktuální hodnotě výrazu, vykonávání pokračuje se seznamem příkazů bezprostředně za dvojtečkou a pokračuje, dokud nenarazí na příkaz break, který je volitelný nebo na konec příkazu switch.
seznam příkazů Jeden nebo několik příkazů k vykonání.

Použijte speciální návěští default pro vykonání příkazu v případě, kdy žádné návěští neodpovídá hodnotě výrazu. Může být umístěno kdekoliv v kódu příkazu switch.

Lze používat bloky bez návěští či násobným návěštím. Jestliže žádné návěští neodpovídá hodnotě výrazu a není definováno ani návěští default, nevykoná se žádný příkaz.

Vykonávání příkazu switch probíhá podle následujících pravidel:

  1. Vyhodnocení výrazu a prohlédnutí návěští v pořadí ve, kterém jsou uvedena dokud není nalezeno správné.
  2. Pokud návěští odpovídá hodnotě výrazu, vykonají se příslušné příkazy, dokud se nenarazí na příkaz break či konec příkazu switch. To znamená, že budou vykonány příkazy několika následujících návěští v případu, že nebude použit příkaz break.
  3. Pokud žádné návěští neodpovídá hodnotě výrazu, provedou se příkazy návěští default, pokud není definováno, pokračuje se příkazem, který následuje za příkazem switch.
  4. Pokračuje se příkazem, který následuje za příkazem switch.

Následující příklad ukazuje test typu objektu příkazem switch:

     function MujObjekt() {

     ...}

     switch (objekt.konstruktor){

     case Date:

     ...

     case Number:

     ...

     case String:

     ...

     case MujObjekt:

     ...

     default:

     ...

     }

Cykly

JavaScript podporuje následující druhy cyklů: for, for…in, while a do…while.

Cyklus for

Používá se k opakovanému provádění příkazu, přičemž počet opakování je předem stanoven.

Syntaxe:

     for (inicializace; test; krok)

příkaz;

Syntaxe příkazu for má tyto části:


Část Popis
inicializace Inicializace řídící proměnné se provede pouze jednou a to před začátkem provádění cyklu.
test Logický výraz. Pokud je vyhodnocen jako true, je vykonán příkaz. Pokud je vyhodnocen jako false, cyklus je ukončen.
krok Změna hodnoty řídící proměnné cyklu je provedena na konci každého průchodu cyklem.
příkaz Příkaz k provedení pokud je podmínka test splněna. Samozřejmě se může jednat i o složený příkaz.

Ilustrace použití příkazu cyklu for viz ukázka .

     /* i je nastaveno na počátku na 0 a je postupně zvětšováno na konci každého průchodu o 1. Cyklus se ukončí v okamžiku, kdy i nebude    menší než 10 před dalším průchodem cyklu */

     for (i = 0; i < 10; i++)

     {

     j *= i; // zkratka pro j = j * i

     }

Před každým průběhem cyklu je testována podmínka. Po průběhu cyklu je ještě před dalším průběhem aktualizována řídící proměnná cyklu. Pokud není podmínka nikdy splněna, cyklus není vykonán ani jednou. Pokud je podmínka splněna vždy, dojde k nekonečnému cyklu. Proto pište podmínky cyklů pečlivě.

     /*

     Změna řídící proměnné cyklu ("i++" v následujících případech) je vykonána na konci cyklu, po vykonání bloku příkazů těla cyklu a před testováním podmínky.

     */

     var Kolikrat = 11; // Nastavuje limit 11 průběhů.

     var sum = new Pole(Kolikrat);

     /* Vytváří pole nazvané sum o 11 členech, od 0 do 10. */

     var celkSum = 0;

     sum[0] = 0;

     for(var i = 1; i < Kolikrat; i++)

     { // Počítá od 1 do 10.

     celkSum += i;

     sum[i] = celkSum;

     }

     var sum = 0;

     for(var i = 1; i > 0; i++)

     { // Toto je nekonečný cyklus.

     sum += i;

     }

Cyklus for..in

Provede příkaz pro každou vlastnost objektu nebo složky pole. Objekty a pole jsou podrobněji popsány dále.

Syntaxe:

     for (proměnná in [objekt | pole])

       příkaz;

Syntaxe příkazu for…in má tyto části:


Část Popis
proměnná Řídící proměnná cyklu, která může obsahovat libovolnou vlastnost objektu.
objekt, pole Objekt nebo pole, kterým „proběhne“ cyklus.
příkaz Příkaz, který má být vykonán pro každou vlastnost objektu nebo složky pole. Může být též složený příkaz.

Před každým průběhem cyklu je proměnné přiřazena další vlastnost objektu. Můžete ji potom použít v libovolné části příkazu uvnitř cyklu přesně tak, jako byste používali vlastnost objektu. Když proběhne cyklus celým objektem, neexistuje žádná možnost jak zjistit či kontrolovat pořadí, ve kterém byly jednotlivé vlastnosti objektu přiřazeny do proměnné.

Cyklus while

Vykonává příkaz, dokud je splněna podmínka (tj. není vyhodnocena jako false).

Syntaxe:

     while (výraz)

       příkaz;

Syntaxe příkazu while má následující části:


Část Popis
výraz Podmínka (logický výraz) kontrolovaná před každým průběhem cyklu. Pokud je podmínka splněna, cyklus je vykonán. Pokud podmínka splněna není, cyklus je přerušen a pokračuje se dalšími příkazy za cyklem.
příkaz Příkaz k provedení v případě splnění podmínky. Samozřejmě se může jednat o složený příkaz.

Cyklus while testuje Výraz před prvním průběhem cyklu. Pokud je v tomto okamžiku výraz vyhodnocen jako false, cyklus nikdy neproběhne viz ukázka .

Cyklus do…while

Vykoná blok příkazů jednou a po té opakuje blok příkazů do té doby, než je podmínka vyhodnocena jako false).

Syntaxe:

     do

       příkaz

     while (výraz)

Syntaxe příkazu do_while má následující části:


Část Popis
příkaz Příkaz k vykonání při kladně vyhodnoceném podmínce. Může se samozřejmě jednat i o složený příkaz.
výraz Podmínka (logický výraz), kterou lze vyhodnotit jako true nebo false. Pokud výraz nabývá hodnoty true, proběhne cyklus znovu. Pokud výraz nabývá hodnoty false, průběh cyklu se ukončí.

Hodnota výrazu není testována před prvním průběhem cyklu, což znamená, že cyklus proběhne vždy alespoň jednou. Poté je hodnota výrazu testována vždy po následujícím průběhu cyklu.

Rozdíl mezi cykly while, do…while a cyklem for je v absenci řídící proměnné cyklu. Používá se tehdy, když chcete provádět určitou akci tak dlouho, dokud je splněna nějaká podmínka.

     var stav = "";

     var pocitadlo = 42; // Inicializace odpočítávání

     while (pocitadlo >= 1) {

     if (pocitadlo > 1) {

     stav = "Zbývá " + počítadlo + " s do startu !";

     }

     else {

     stav = "Posledni sekunda pred startem !";

     }

     pocitadlo--; // změní hodnotu počítadla

     }

     stav = "START!";

Protože cykly while nemají zabudovanou řídící proměnnou cyklu, jsou daleko více náchylné ke vzniku nekonečného cyklu.

Použití příkazů break a continue

Tyto příkazy slouží v JavaScriptu pro „nestandardní“ ukončení cyklů. Příkaz break ukončí „natvrdo“ právě probíhající cyklus. Obvykle se používá ve spojení s nějakou podmínkou (příkaz if). Příkaz continue je naproti tomu používán k ukončení aktuálního opakování cyklu. Když je příkaz continue proveden, je aktuální opakování cyklu ukončeno a začíná nové opakování cyklu. Ilustrace použití příkazů break a continue:

     var komentar = "";

     var zbytek = 0;

     var konec = 3;

     var kontrol = 27;

     for (k = 1; k <= 10; k++)

     {

     zbytek = kontrol % k;

     if (zbytek == konec)

     {

     break;

     // ukončí cyklus pokud se zbytek rovná konec

     }

     komentar = kontrol + " děleno " + k

     + " dává zbytek " + zbytek;

     }

     for (k = 1; k <= 10; k++)

     {

     zbytek = kontrol % k;

     if (zbytek != konec)

     {

     continue; // pokračuje jenom v případech,

     // kdy se zbytek rovná konec

     }

     // kód JavaScriptu, který bude vykonán v těchto

     // případech

     }

Ilustrace použití příkazu continue:

     var stav = "";

     var pocitadlo = 42; // inicializace počítadla

     while (pocitadlo >= 1) {

     // if (pocitadlo < 10) { // upozornění !

     // Toto použití continue by vytvořilo nekonečný

     // cyklus

     continue;

     }

     if (pocitadlo > 1) {

     stav = "Zbývá " + pocitadlo +

     " s do startu!";

     }

     else {

     stav = "Poslední sekunda před startem !";

     }

     pocitadlo--;

     }

     stav = "START!";

Použití příkazu continue v posledním příkladu vyvolá nekonečný cyklus, protože aktuální opakování cyklu je vždy ukončeno příkazem continue dříve, než dojde k dekrementaci proměnné pocitadlo.