⊗jsPmFCPf 272 of 505 menu

Úskalí IIFE v JavaScriptu

Pojďme se podívat na dva kousky kódu.

První:

let result = 1 +function() { return 2; }(); console.log(result);

Druhý:

let result = 1; +function() { return 2; }(); console.log(result);

Tyto dva kousky kódu jsou téměř totožné, ale pokud je spustíte - výsledek se bude lišit. První kód vypíše do konzole číslo 3, a druhý - číslo 1.

Proč je takový rozdíl: celé je to v tom, že v jednom případě na konci prvního řádku chybí středník, a ve druhém případě - je přítomen.

Můžete se zeptat: jak to, vždyť v JavaScriptu středník na konci příkazu není povinný! Ve skutečnosti to není úplně tak. Pojďme se podívat, co se u nás vlastně děje.

První kód lze přepsat takto:

let result = 1 + function() { return 2; }(); console.log(result); // vypíše 3

Nyní je hned zřejmé, že k jedničce se přičítá výsledek volání funkce na místě, tedy 2. Proto konečný výsledek bude 3.

Pokud však za jedničku napíšeme středník, kód bude interpretem vnímán jinak:

// První příkaz: let result = 1; // Druhý příkaz: +function() { return 2; }(); // Třetí příkaz: console.log(result); // vypíše 1

To znamená, že přiřazení do proměnné a volání funkce na místě se stanou různými příkazy. A to všechno kvůli přítomnosti středníku!

Vychází to tak, že v tomto případě volání funkce na místě vlastně nic nedělá - prostě do ničeho vrátí číslo 2, které žádným způsobem neovlivní proměnnou result.

Pojďme se tedy podívat, proč vůbec můžeme nepsat středník v JavaScriptu. Předpokládejme, že máme takový kód bez středníků:

let result = 1 // do result se zapíše 1 let test = 2 // do test se zapíše 2

Funguje korektně, protože interpret sám umístil na konec každého řádku středník.

Ale podívejte se na takový kód:

let result = 1 + 2; // do result se zapíše 3

Nyní se středník na konci prvního řádku neumístí automaticky, protože interpret chápe, že příkaz na druhém řádku - to je část příkazu z prvního řádku.

Ale pokud my sami napíšeme středník - výsledek bude úplně jiný:

let result = 1; // do result se zapíše 1 + 2; // příkaz nic nedělá, ale ani nebude chyba

Vychází to tak, že interpret sám umisťuje středník, pouze pokud následující příkaz není částí předchozího.

A nyní se podívejte na tento kód:

let result = 1 +function() { return 2; }(); console.log(result);

Opravdu, druhý řádek - je prostě pokračování příkazu z prvního řádku a interpret nekladl středník automaticky. Právě proto, pokud my sami napíšeme středník na konci prvního řádku - výsledek bude úplně jiný. To říká, že nejlépe je vždy umístit středník na potřebná místa, aby se předešlo problémům.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout