JavaScript – problémy s kontextem
Nálepky:
Že je JavaScript záludný jazyk, který neznalého dokáže řádně potrápit, není třeba zdůrazňovat. leckdy překvapí i znalého. Schválně, tipněte si, co vypíše následující kód:
var a = 10; (function () { alert(a); var a = 20; })();
Nezkoušejte ho, jen od pohledu tipněte:
Své řešení si můžete ověřit na příkladu.
Důvody tohoto chování popisuje Dmitry Soshnikov ve svém článku Two words about „hoisting“. Souvisí se způsobem, jakým JavaScript vytváří „kontext“ – nejprve alokuje použité proměnné, a až poté spustí kód. Umožňuje to například vytvořit v jednom kontextu vzájemnou rekurzi dvou funkcí. V naší ukázce to znamená, že při vyvolání funkce je nejprve vytvořen kontext, v něm je zastíněna globální proměnná „a“ lokální nedefinovanou, a pak je proveden kód.
Haha, trefil jsem to, ale jenom proto, že zprávička na začátku upozornila, že v tom bude háček…
Já tipnul undefined, protože tou funkcí se dělá vlastní namespace. :-)
To není tak úplně přesné. Zkuste si
a uvidíte
Já zase tipnul undefined ale proto, že na prvním řádku je deklarace se slovíčkem var, coč z Pixyho dřívějších článku, jako lokální proměnnou. Nevím, jak mě to napadlo, ale hlasoval jsem rychleji, než myslel, což se mi vyplatilo – tentokrát.
ERRATA:
…což z Pixyho dřívějších článku chápu…
A jo… Máte pravdu, teď když se na to dívam podruhý už to vidím. Děkuju za opravu. :-)
javascript:name=1;alert(name===1);
Skúste tipnúť výsledok a vyskúšať v rôznych prehliadačoch.
Do predchádzajúceho kódu sa nejako dostal nejaký neviditeľný znak. Nie je v pridávaní príspevkov nejaká chyba?
javascript:name=1;alert(name===1);
….tak se chova spousta jazyku, treba i Python.
No, ne tak úplně. Python hodí chybu. Pro js je tohle platný kód, který normálně vykoná, a to je sakra velkej rozdíl.
Ponaučení je, že ani v javascriptu není dobré psát jako prase, ikdyž k tomu ten jazyk vpodstatě vybízí…