Přejít k navigační liště

Zdroják » Zprávičky » JavaScript – problémy s kontextem

JavaScript – problémy s kontextem

Zprávičky JavaScript, Různé

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:

Co vypíše kód?

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.

Komentáře

Subscribe
Upozornit na
guest
10 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
petrblahos

Haha, trefil jsem to, ale jenom proto, že zprávička na začátku upozornila, že v tom bude háček…

nes_ro

Já tipnul undefined, protože tou funkcí se dělá vlastní namespace. :-)

Jakub Bouček

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.

Jakub Bouček

ERRATA:
…což z Pixyho dřívějších článku chápu…

nes_ro

A jo… Máte pravdu, teď když se na to dívam podruhý už to vidím. Děkuju za opravu. :-)

_

javascript:na­me=1;alert(na­me===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:na­me=1;alert(na­me===1);

Almad

….tak se chova spousta jazyku, treba i Python.

petrblahos

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.

global a # klidne i bez global
a = 100

def x():
    print a
    a = 200
x()

Ponaučení je, že ani v javascriptu není dobré psát jako prase, ikdyž k tomu ten jazyk vpodstatě vybízí…

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.