Co byste měli vědět o JavaScriptu [5]: with je zlý čaroděj

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”:http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/ a také “vlastní RSS”:http://zapisnik.pepiino.cz/tagy/co-byste-meli-vedet-o-javascriptu/feed/.

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ů.
/—html

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); 
}

\—
“Zkuste si”:http://jsfiddle.net/pepiino/7g6QV/. Vypadá to užitečně, že? Ale třpyt neimplikuje zlato, jak již zajisté víme.

With nepřehledný a zrádný
******************

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

with (neco) {
    olala = bubu;
}

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

//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;

\—

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 “zapsaná hodnota snadno skončit v globálním oboru platnosti”:http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-1-promenna-a-globalni-obor-platnosti/, 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.

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