<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pepiino.cz &#187; Co byste měli vědět o JavaScriptu</title>
	<atom:link href="http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/feed/" rel="self" type="application/rss+xml" />
	<link>http://zapisnik.pepiino.cz</link>
	<description>console.log(&#34;o Javascriptu, webu a vůbec&#34;);</description>
	<lastBuildDate>Tue, 07 Dec 2010 14:18:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Co byste měli vědět o JavaScriptu [5]: with je zlý čaroděj</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-5-with-je-zly-carodej/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-5-with-je-zly-carodej/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 11:15:53 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=581</guid>
		<description><![CDATA[
<p>Vítejte u dalšího dílu série článku „Co byste měli vědět
o JavaScriptu“. K pátemu dílu jsem seriálu nadělil vlastní štítek a
také vlastní RSS. Dnes si povíme o konstrukci with a rovnou prozradím, že
učiníte lépe, nebudete-li ji používat. Konstrukce with Konstrukce with je
určena ke zkrácení zápisu přístupu k vlastnostem objektů. var osoba = {
jmeno: „franta“, prijmeni: „frantiskovec“, […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Vítejte u dalšího dílu série článku „Co byste měli vědět
o JavaScriptu“. K pátemu dílu jsem seriálu <a
href="http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/">nadělil
vlastní štítek</a> a také <a
href="http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/feed/">vlastní
RSS</a>.</p>

<p>Dnes si povíme o konstrukci <code>with</code> a rovnou prozradím, že
učiníte lépe, nebudete-li ji používat.</p>

<h2>Konstrukce with</h2>

<p>Konstrukce <code>with</code> je určena ke zkrácení zápisu přístupu
k vlastnostem objektů.</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
var osoba = {
    jmeno: "franta",
    prijmeni: "frantiskovec",
    velikostBot: 42
};

//v rámci bloku with mohu pracovat s vlastnostmi
//objektu 'osoba' podobně jako s lokálními proměnnými
with (osoba) {
   //vypíše "franta"
   console.log(jmeno);
   //vypíše "frantiskovec"
   console.log(prijmeni);
   //vypíše odpověď na základní otázku života, vesmíru a vůbec
   console.log(velikostBot);
}

</pre>

<p><a href="http://jsfiddle.net/pepiino/7g6QV/">Zkuste si</a>. Vypadá to
užitečně, že? Ale třpyt neimplikuje zlato, jak již zajisté víme.</p>

<h2>With nepřehledný a zrádný</h2>

<p>Představte si, že při čtení JavaScriptového kódu narazíte na
následující pasáž:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
with (neco) {
    olala = bubu;
}
</pre>

<p>Poznáte, co uvedený kód dělá? Stát se mohou 4 různé věci,
v závislosti na tom, zda jsou <code>olala</code> a <code>bubu</code>
vlastnostmi objektu <code>neco</code>.</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
//olala je vlastností neco, bubu nikoli
neco.olala = bubu;
//bubu je vlastností neco, olala nikoli
olala = neco.bubu;
//bubu i olala jsou vlastnostmi neco
neco.olala = neco.bubu;
//bubu i olala nejsou vlastnostmi neco
olala = bubu;
</pre>

<p>Vzhledem k dynamické povaze JavaScriptu nemůžete nijak snadno zaručit,
že objekt bude mít vámi předpokládané vlastnosti. A pokud je nemá,
může <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/">zapsaná
hodnota snadno skončit v globálním oboru platnosti</a>, což lehce způsobí
obtížně odladitelné chyby. Také pokud čtete cízí (nebo vlastní, ale
starý) kód a předpoklad existence vlastností není vyjádřen jinak (třeba
v komentáři), budete mít nejspíš problém pochopit autorův záměr.</p>

<h2>Žijte bez with</h2>

<p><code>With</code> do JavaScriptu bezpochyby nepatří, proto byl ve
striktním módu ECMAScriptu 5 vyřazen. <a
href="http://stackoverflow.com/questions/61552/are-there-legitimate-uses-for-javascripts-with-statement">Ačkoliv
lze dlouze diskutovat o zajímavých použitích této konstrukce</a>,
usnadníte si život, pokud se bez něj obejdete i vy.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-5-with-je-zly-carodej/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Co byste měli vědět o JavaScriptu [4]: deklarace funkce a funkce jako výraz</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-4-deklarace-funkce-a-funkce-jako-vyraz/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-4-deklarace-funkce-a-funkce-jako-vyraz/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 13:20:42 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=447</guid>
		<description><![CDATA[
<p>Vítejte u dalšího dílu mého seriálu o méně známých zákoutích
JavaScriptu. Pravidelný čtenář si zajisté všiml, že první tři díly
měly něco společného. Všechny se nějak dotýkaly platnosti proměnných
v JavaScriptu. Dnešní článek nebude výjimkou a bude trochu delší
i náročnější, takže doporučuji lehce si osvěžit paměť prolétnutím
předcházejících témat. V prvním díle jsem psal o deklaraci lokálních
proměnných, klíčovém slovu var […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Vítejte u dalšího dílu mého <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/">seriálu
o méně známých zákoutích JavaScriptu</a>. Pravidelný čtenář si
zajisté všiml, že první tři díly měly něco společného. Všechny se
nějak dotýkaly platnosti proměnných v JavaScriptu. Dnešní článek nebude
výjimkou a bude trochu delší i náročnější, takže doporučuji lehce si
osvěžit paměť prolétnutím předcházejících témat.</p>

<p>V prvním díle jsem psal o <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/">deklaraci
lokálních proměnných, klíčovém slovu <code>var</code> a globálním
‚scope‘</a>, navázal jsem krátkou zmínkou o tom, <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope/">že
v JavaScriptu jsou lokální proměnné platné vždy v rámci celé
funkce</a> a nakonec jsem se minulý týden rozepsal o méně známé
vlastnosti: <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/">variable
hoisting</a>.</p>
<span id="more-447"></span>
<h2>Funkce jako hodnota</h2>

<p>Asi jednou z nejhezčích vlastností JavaScriptu je, že se funkce chovají
naprosto stejně jako jakýkoliv jiný referenční datový typ. Můžete je
ukládat do proměnných, předávat jako parametr jiným funkcím a dokonce
i vracet jako návratovou hodnotu. (V angličtině se používá termín
<em>first class object</em>, který ale nemá s objekty ani třídami z OOP
nic společného).</p>

<p>Předpokládám, že každý čtenář dokáže bezpochyby funkci
deklarovat:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
//třeba takto
function ahoj() {
   //....
}

//nebo takto
var ahoj = function() {
   //...
}


//i takto
var ahoj = function ahoj() {
   //...
}

//všechny tři varianty voláme stejně, oslovujeme dle nálady
ahoj();
</pre>

<p>Ve všech třech příkladech vznikne v aktuálním kontextu (oboru
platnosti) proměnná s názvem <code>ahoj</code> odkazující na naši novou
funkci.</p>

<h2>Deklarace versus výraz</h2>

<p>Abychom neměli život příliš jednoduchý, je mezi prvním výše
uvedeným příkladem a jeho následovníky podstatný rozdíl. Z hlediska
syntaxe JavaScriptu existují dvě konstrukce, které lze použít
k vytvoření funkce: <em>function declaration</em> (deklarace) a <em>function
expression</em> (výraz).</p>

<p>Zatímco deklarace má pouze jednu formu:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
//deklarace
function ahoj(parametr, dalsiparametr) {
   //....
}
</pre>

<p>Výraz může nabývat rozličných tvarů, chutí i vůní:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
//anonymní funkce přiřazená do proměnné
var ahoj = function(parametr, dalsiparametr) {
   //....
}
//pojmenovaná funkce přiřazená do proměnné
var ahoj = function nazdar(parametr, dalsiparametr) {
   //....
}
</pre>

<p>Jak interpret JavaScriptu (nebo třeba programátor) pozná, zda jde
v konkrétním případě o deklaraci či výraz? Je potřeba mít na paměti,
že název funkce je u deklarace povinný a u výrazu volitelný, takže jeho
nepřítomnost nelze považovat za rozhodující. Rozhodující pravidlo by
mohlo být formulováno třeba takto: je-li v daném kontextu očekávána
hodnota (přiřazení do proměnné, návratová hodnota, ale i další) bude
konstrukce zpracována jako výraz, jinak jako deklarace. Těžko
představitelné? Lze použít i lehce zjednodušující pomůcku: začíná-li
příkaz (<em>statement</em>) klíčovým slovem function jde o deklaraci,
jinak o výraz.</p>

<p>Srovnejte:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function ahoj() {...} //vyhodnocena jako deklarace

(function ahoj() {...}) //vyhodnocena jako výraz

function() {...} //je vyhodnocována jako deklarace, pak je ale očekáváno povinné jméno =&gt; dojde k syntaktické chybě

return function() {...} //zde již je vyhodnocována jako výraz

new function() {...}; // operátor new aplikovaný na anonymní funkci, která je opět vyhodnocena jako výraz. Funkce poslouží jako konstruktor.

</pre>

<h2>Deklarace funkce se vznášejí také, ale jinak</h2>

<p><a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/">Podobně
jako u deklarací proměnných</a> dochází k „vznášení“
identifikátorů funkcí. Pokud stvoříte funkci pomocí výrazu, aplikuje se
<em>variable hoisting</em> podle totožného principu jako u ostatních
proměnných (což nás nijak nepřekvapí). Použijete-li ale deklaraci,
probublá na začátek nadřazeného kontextu nejen identifikátor, ale i tělo
(nebo chcete-li hodnota) funkce.</p>

<p>Takže následující ukázka:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {
    //... kód
    var ahoj = function(parametr, dalsiparametr) {
        console.log("ahoj");
    }
    //... kód
    function nazdar() {
        console.log("nazdar");
    }

}
</pre>

<p>Je interpretována nějak takto:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {
    var ahoj, nazdar = function nazdar() {
        console.log("nazdar");
    };

    //... kód
    ahoj = function(parametr, dalsiparametr) {
        console.log("ahoj");
    }
    //... kód
}
</pre>

<p>Můžete si <a href="http://jsfiddle.net/pepiino/UDfqT/">zkusit
následující příklad</a>:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {
    console.log(typeof ahoj); //=&gt; undefined
    console.log(typeof nazdar); //=&gt; function;
    //ahoj(); //odkomentujte a dojde k chybě
    nazdar(); //=&gt; "nazdar"

    var ahoj = function(parametr, dalsiparametr) {
        console.log("ahoj");
    }
    console.log(typeof ahoj); //=&gt; "function"
    ahoj(); //=&gt; "ahoj"

    function nazdar() {
        console.log("nazdar");
    }
}

tulipan();
</pre>

<h2>Trable s bloky</h2>

<p>V souvislosti s deklaracemi funkcí musím zmínit jednu z nekompatibilit
mezi současnými interprety JavaScriptu. Z hlediska specifikace totiž nesmí
být deklarace funkce zanořena v blocích podmínek, cyklů a podobně.
Všechny implementace JavaScriptu ale takovou konstrukci akceptují a chovají
se různě.</p>

<p><a href="http://jsfiddle.net/pepiino/gkrWp/">Vyzkoušejte si následující
ukázku</a> v různých prohlížečích (se zapnutou konzolí) a uvidíte, že
některé vypíšou „nazdar“, jiné „ahoj“.</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {

   if (true) {
       function ahoj() {
           console.log("ahoj");
       }
   } else {
       function ahoj() {
           console.log("nazdar");
       }
   }


   ahoj();
   //Chrome a IE vypíšou 'nazdar'
   //Firefox vypíše 'ahoj'
}

tulipan();
</pre>

<h2>Používat deklarace?</h2>

<p>Nejsilnější výhodou deklarací je možnost volat funkci dříve, než je
v kódu uvedena (u výrazu sice proměnná díky <em>hoistingu</em> existuje,
ale má hodnotu <code>undefined</code>). Jako další argument pro používání
deklarací se často uvádí lepší ladění v debuggerech – díky tomu,
že funkce jsou pojmenované. Pozorný čtenář si ale v příkladech zajisté
všiml pojmenované funkce i ve výrazech.</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
//pojmenovaná funkce přirazená do proměnné
var ahoj = function nazdar(parametr, dalsiparametr) {
   //....
}
</pre>

<p>Tato konstrukce problém řeší, leč bohužel nefuguje úplně korektně
v Internet Exploreru (pro podrobnější popis viz na konci odkázaný
článek).</p>

<p>Při vší skromnosti si myslím, že deklarace funkce je v JavaScriptu
omylem. Respektive záměrně, ale jen aby usnadnila tvorbu kódu
programátorům přicházejícím od jiných jazyků, kde jsou na podobnou
konstrukci zvyklí. Poměrně se vymyká základní myšlence práce s funkcemi
v JavaScriptu a působí víc zmatení, než užitku.</p>

<p>Nestačí-li vám můj stručný popis problematiky, doporučuji zevrubné a
asi nejlepší zpracování tématu od Juriye ‚kangax‘ Zaytseva: <a
href="http://kangax.github.com/nfe/">Named function expressions
demystified</a>.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-4-deklarace-funkce-a-funkce-jako-vyraz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Co byste měli vědět o JavaScriptu [3]: variable hoisting</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 19:42:31 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=428</guid>
		<description><![CDATA[
<p>Minule jsem krátce popsal, že v JavaScriptu jsou lokální proměnné
platné vždy na úrovni celé funkce, nikoli v bloku. S tím silně souvisí
vlastnost, která je v angličtině označována variable hoisting. Rozumný
český překlad mě nenapadá (a žádný oficiální neznám), ale sousloví
by se dalo kostrbatě přeložit jako „zdvihání proměnných“. Zdvihám,
zdviháš, zdviháme Princip je jednoduchý: interpret javascriptu
při […]</p>
]]></description>
			<content:encoded><![CDATA[
<p><a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope">Minule
jsem krátce popsal</a>, že v JavaScriptu jsou lokální proměnné platné
vždy na úrovni celé funkce, nikoli v bloku. S tím silně souvisí
vlastnost, která je v angličtině označována <em>variable hoisting</em>.
Rozumný český překlad mě nenapadá (a žádný oficiální neznám), ale
sousloví by se dalo kostrbatě přeložit jako „zdvihání
proměnných“.</p>

<h2>Zdvihám, zdviháš, zdviháme</h2>

<p>Princip je jednoduchý: interpret javascriptu při zpracování těla funkce
nalezne všechny identifikátory <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/">lokálních
proměnných deklarovaných pomocí klíčového slova <code>var</code></a>,
a „vyzdvihne“ je na začátek těla funkce (před jakýkoliv příkaz).</p>

<p>Takže následující kód:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {
    if (test()) {
        var promenna = 10;
        fanfan();
    }
    var hodnota = "malá";
    return "vysledek";
    var cislo = 1;
}
</pre>

<p>Je interpretován jako:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function tulipan() {
    var promenna, hodnota, cislo;
    if (test()) {
        promenna = 10;
        fanfan();
    }
    hodnota = "malá";
    return "vysledek";
    cislo = 1;
}
</pre>

<h2>Proč je to důležité?</h2>

<p>Nuže podívejme se na několik ukázek kódu, kde neznalost tohoto principu
způsobí vývojaří přinejmenším zmatení.</p>

<p>Přístup ke globální proměnné (či proměnné z nadřazených oborů
platnosti):</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
var hodnota = 20;
function delej() {
    console.log(hodnota);
    var hodnota = 6;
    console.log(hodnota);
}
delej();
</pre>

<p><a href="http://www.jsfiddle.net/pepiino/rPsbh/">Můžete si vyzkoušet</a>,
že první volání <code>console.log</code> vypíše <code>undefined</code> a
ne <code>20</code>, jak by mohl očekávat neznalec.</p>

<p>Podobně v následující ukázce bude hodnota proměnné <code>baf</code>
uvnitr funcke <code>tulipan</code> vždy vyhodnocena jako „vychozi“.</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
var baf = 'fanfan';

function tulipan() {
  var baf = baf || 'vychozi';
  console.log(baf);
};

tulipan();
</pre>

<p><a href="http://www.jsfiddle.net/pepiino/QENXC/">Vyzkoušejte si.</a></p>

<h2>Doporučení na závěr</h2>

<p>Běžným doporučením, na které můžete ohledně psaní kódu
v JavaScriptu narazit, je právě používání jediného klíčového slova
<code>var</code> hned na začátku funkce, kde uvedete všechny lokální
proměnné. Pokud k JavaScriptu přijdete z jiného jazyka (jako třeba já
z Javy), může to být zarážející. Důvodem je ale právě <em>variable
hoisting</em>. Dodržování této rady vám může ušetřit pár
nepříjemných záseků.</p>

<p>Příště navážu opět souvisejícím tématem, povíme si něco
o deklaracích funkcí.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Co byste měli vědět o JavaScriptu [2]: JavaScript nemá &#8222;block-level scope&#8220;</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 09:00:01 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=375</guid>
		<description><![CDATA[
<p>V dnešním velice krátkém dílu se zmínim o drobnosti, kterou by měli
mít na paměti hlavně programátoři přicházející z jazyků jako je Java
či C#. Vývojáře znalé třeba PHP ale zajisté nijak nezaskočí, ti zde
budou jako doma. V JavaScriptu (podobně jako v PHP) je totiž lokální
proměnná platná vždy v rámci celé funkce. Oproti tomu ve zmiňované
Javě je platnost […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>V dnešním velice krátkém <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/">dílu</a>
se zmínim o drobnosti, kterou by měli mít na paměti hlavně programátoři
přicházející z jazyků jako je Java či C#. Vývojáře znalé třeba PHP
ale zajisté nijak nezaskočí, ti zde budou jako doma. V JavaScriptu (podobně
jako v PHP) je totiž <em>lokální proměnná platná vždy v rámci celé
funkce</em>.</p>

<p>Oproti tomu ve zmiňované Javě je platnost omezena na blok kódu.</p>

<pre
class="brush: java; pad-line-numbers: false;">
// Java
public void funkce() {
    int  i = 10;
    for (int i =0; i &lt; 15; i++) {
        System.out.println("Uvnitr bloku i: " + i);
    }
    System.out.println("Vne bloku i: " + i);

}
</pre>

<p>V uvedném kódu překryje proměnná <code>i</code> deklarovaná
v záhlaví cyklu vnější proměnnou <code>i</code>.</p>

<p>V Javascriptu ale následující zápis postrádá smysl:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
// JavaScript
function funkce() {
    var i = 10;

    for (var i = 0; i &lt; 6; i++) {
        //neco...
    }

    for (var i = 0; i &lt; 68; i++) {
        //neco jineho
    }

}
</pre>

<p>Proměnná <code>i</code> bude prostě jenom jedna, bez ohledu na počet <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/">použití
klíčového slova <code>var</code></a>.</p>

<p>S oborem platnosti na úrovni funkce silně souvisí další zajímavá
vlastnost, nazývaná „variable hoisting“. Proberu ji příště.</p>
]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Co byste měli vědět o Javascriptu [1]: proměnná a globální obor platnosti</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 13:00:39 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=295</guid>
		<description><![CDATA[
<p>V prvním díle miniseriálu zmíním jedno z nejznámějších špatných
míst Javascriptu. V anglicky psaných zdrojích bývá označován termínem
„implied global“. Jde o velice důležitou vlastnost jazyka, jejíž
znalost (a hlavně plné pochopení důsledků) vám může ušetřit mnoho
vytrhaných vlasů. K deklaraci proměnné v Javascriptu slouží klíčové
slovo var. Často se (a mylně) uvádí, že je jeho použití nepovinné. Ve
většině případů má […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>V <a
href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/">prvním
díle miniseriálu</a> zmíním jedno z nejznámějších špatných míst
Javascriptu. V anglicky psaných zdrojích bývá označován termínem
„implied global“. Jde o velice důležitou vlastnost jazyka, jejíž
znalost (a hlavně plné pochopení důsledků) vám může ušetřit mnoho
vytrhaných vlasů.</p>
<span id="more-295"></span>
<p>K deklaraci proměnné v Javascriptu slouží klíčové slovo
<code>var</code>. Často se (a mylně) uvádí, že je jeho použití
nepovinné. Ve většině případů má ale deklarace proměnné bez použití
<code>var</code> jiný význam.</p>

<p>Vezměme si následující příklad:</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function test() {
    var promenna = 10;
    console.log(promenna); //predpokladam dostupnou konzoli - tedy firefox+firebug ci jakukoliv prohlizec s rozumnymi vyvojarskymi nastroji
}

test();
console.log(promenna); //reference error
</pre>

<p>Zde je korektně deklarována lokální proměnná. <a
href="http://jsfiddle.net/pepiino/5tu3n//">Vyzkoušejte si.</a>.</p>

<p>Pokud ale klíčové slovo <code>var</code> záměrně či omylem vynecháme,
Javascript deklaruje proměnnou v globálním oboru platnosti (alespoň
v následujícím příkladu).</p>

<pre
class="brush: jscript; pad-line-numbers: false;">
function test() {
    promenna = 10;
    console.log(promenna)
}

test();
console.log(promenna); //vypise 10

</pre>

<p><a href="http://jsfiddle.net/pepiino/Qcbje/">Vyzkoušejte si.</a>.</p>

<p>Tedy přesněji řečeno:</p>

<ul>
	<li>při zápisu do proměnné v javascriptu interpret zjistí, zda
	požadovaná proměnná existuje. Pokud není deklarována jako lokální či
	parametr, hledá ji v celém „scope chain“ (česky by se asi dalo
	přeložit jako „zřetězení oborů platnosti“). Tomuto tématu (stejně
	jako uzávěrům) se ale budu věnovat někdy příště.</li>

	<li>pokud proměnnou někde nalezne, zapíše do ní přiřazovanou hodnotu</li>

	<li>pokud ji nenalezne, vytvoří ji <strong>v globálním oboru
	platnosti</strong> a zapíše do ní hodnotu.</li>
</ul>

<h2>Je to opravdu tak zlé?</h2>

<p>Ano.</p>

<ul>
	<li>Pokud nepoužíváte či zapomínáte <code>var</code>, zasviníte si
	globální obor platnosti spoustou proměnných, které tam nepatří. Obecně
	je za správnou považována snaha minimalizovat množství globálně platných
	proměnných, které kód vytváří, na jednu či méně.</li>

	<li>Snadno mohou vzniknout chyby, které těžko odhalíte:</li>
</ul>

<pre
class="brush: jscript; pad-line-numbers: false;">
function cykluj() {
   for (i = 0; i &lt; 10; i++) {
       cyklujvic();
   }
}

function cyklujvic() {
   for (i = 0; i &lt; 5; i++) {
       console.log(i);
   }
}

cykluj();

</pre>

<p>Vidíte průšvih? Obě funkce pracují se stejnou globální proměnnou.
Nejen, že se kód bude chovat jinak, než bylo nejspíš zamýšleno, ale
dokonce skončí v nekonečné smyčce (funkce <code>cyklujvic</code> vždy
přenastaví proměnnou <code>i</code> a skončí na hodnotě <code>5</code>,
tudíž funkce <code>cykluj</code> nikdy nedojde na konečnou hodnotu). A teď
si představte, že dané funkce jsou rozmístěny ve dvou odlišných souborech
v jiných částech projektu.</p>

<ul>
	<li>můžete se omylem dostat do konfliktu s vlastnostmi objektu window
	(Globální proměnné jsou totiž vlastnostmi tzv. globálního objektu,
	kterým je v prohlížeči právě window, v <a
	href="http://nodejs.com">node.js</a> je jím objekt global)</li>

	<li>tuto situaci ještě komplikuje Internet Explorer, který registruje pro
	elementy v DOM, které mají nastaven atribut <code>id</code> vlastnost objektu
	window (tedy globální proměnnou). Pokud se vám pak sejde stejné jméno
	proměnné jako <code>id</code> nějakého elementu a zapomenete na
	<code>var</code>, dojde k chybě.</li>
</ul>

<h2>Doporučení na závěr</h2>

<p>Používejte klíčové slovo <code>var</code> vždy. Zvolte si vývojové
prostředí, které vás na nedeklarovanou proměnnou umí upozornit.
Používejte <a href="http://jslint.com">http://jslint.com</a>.</p>

<p>A sledujte <a href="http://zapisnik.pepiino.cz/feed/">RSS</a> nebo <a
href="http://twitter.com/pepiino">twitter</a>, jelikož již brzy vám povím
o dalších věcech, které byste o Javascriptu měli vědět.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Co byste měli vědet o Javascriptu [0]: Úvod</title>
		<link>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/</link>
		<comments>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 09:00:10 +0000</pubDate>
		<dc:creator>Josef Adamčík</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Co byste měli vědět o JavaScriptu]]></category>

		<guid isPermaLink="false">http://zapisnik.pepiino.cz/?p=181</guid>
		<description><![CDATA[
<p>Vítejte v úvodním příspěvku průvodce po temných i světlých
zákoutích JavaScriptu. Každý týden tu naleznete kratší zápisky
o různých vlastnostech jazyka, které je dobré znát. JavaScript je mezi
programovacími jazyky výjimečný tím, že většina z nás k němu přijde
bez jakýchkoliv znalostí. Syntaxe je podobná jazykům vycházejícím z C a
za pomoci (většinou mizerných) tutoriálů na internetu dokáže spatlat
„nějak“ funkční kus […]</p>
]]></description>
			<content:encoded><![CDATA[
<p><img
src="http://zapisnik.pepiino.cz/wp-content/upload/2010/10//js-reserved-used2-193x300.png"
alt="Rezervovaná slova JavaScriptu (výběr těch, která mají význam"
class="left" /> Vítejte v úvodním příspěvku průvodce po temných
i světlých zákoutích JavaScriptu. Každý týden tu naleznete kratší
zápisky o různých vlastnostech jazyka, které je dobré znát.</p>

<p>JavaScript je mezi programovacími jazyky výjimečný tím, že většina
z nás k němu přijde bez jakýchkoliv znalostí. Syntaxe je podobná
jazykům vycházejícím z C a za pomoci (většinou mizerných) tutoriálů na
internetu dokáže spatlat „nějak“ funkční kus kódu každý. Mnohdy si
člověk vystačí bez pořádných znalostí jazyka poměrně dlouho a než se
naděje, tvoří už svojí první velkou Javascriptovou věc. A pak to může
dost bolet. V JavaScriptu (podobně jako v ostatních jazycích) existuje
mnoho temných zákoutí, jejichž neznalost velice zkomplikuje vývojářův
život. A naopak má svoje silné stránky, jejichž pochopení mu může
pomoci dosáhnout výsledků rychleji, lépe a dokonce zábavněji ;-) .
Ostatně, <a href="http://zapisnik.pepiino.cz/mam-se-naucit-javascript/">už
jsem o tom nedávno psal</a>.</p>

<p>Nebudu se zde zabývat základními konstrukcemi jazyka, jejichž popis se
válí na každém internetovém rohu. Chci se spíš soustředit a informace,
které bývají (bohužel) často v materiálech pro začátečníky opomíjeny
nebo dokonce(!) uváděny špatně. Obvyjkle programátoři neznají ani po
mnoha letech občasného užívání Javascriptových pilulek, nebo jim úplně
nerozumí.</p>

<p>Seriál má vlastní <a
href="http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/">štítek</a>
a také <a
href="http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/feed/">vlastní
RSS</a>.</p>

<p>Držte si čepice, přístí týden začínáme!</p>

<h2>Aktualizace: zatím vyšlo</h2>

<p>Zatím v seriálu vyšly následující články:</p>

<ol>
	<li><a
	href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/">proměnná
	a globální obor platnosti</a></li>

	<li><a
	href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-2-javascript-nema-block-level-scope/">Javascript
	nemá ‚block-level scope‘</a></li>

	<li><a
	href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-3-variable-hoisting/">variable
	hoisting</a></li>

	<li><a
	href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-4-deklarace-funkce-a-funkce-jako-vyraz/">deklarace
	funkce a funkce jako výraz</a></li>

	<li><a
	href="http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-5-with-je-zly-carodej/">with
	je zlý čaroděj</a></li>
</ol>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-0-uvod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

