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 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",
    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. 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áž:

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.

//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, 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, usnadníte si život, pokud se bez něj obejdete i vy.