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

Odebírat
Upozornit na
guest
10 Komentářů
Nejstarší
Nejnovější Most Voted
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í…

Co je nového v Gitu 2.55.0

Git 2.55.0 přináší šest zajímavých novinek – od dlouho očekávané podpory fsmonitoru na Linuxu, přes zjednodušení úprav historie commitů pomocí nového příkazu git history fixup, až po další krok v postupné integraci jazyka Rust do jádra Gitu. Přidává se i možnost pushovat do skupiny vzdálených repozitářů, omezit šířku grafu u git log --graph a zrychlit git grep a git cherry v částečných klonech.

Od statických stránek k edge computingu: Historie webových technologií za 30 let

Třicet let. Tak dlouho už web existuje v podobě, kterou bychom dnes alespoň zhruba poznali — od prvních statických dokumentů přes éru aplikací běžících v prohlížeči až po kód, který se spouští na stovkách míst po celém světě jen pár milisekund od uživatele. Tenhle příběh ale není jen suchým výčtem technologií a verzí. Je to příběh jednoho kyvadla, které se celé tři dekády houpe mezi serverem a klientem — a které právě teď nachází nový bod rovnováhy někde uprostřed, na okraji sítě.