{"id":72,"date":"2015-02-26T19:22:10","date_gmt":"2015-02-26T18:22:10","guid":{"rendered":""},"modified":"2018-09-17T21:53:24","modified_gmt":"2018-09-17T19:53:24","slug":"kto-skutocne-vie-ako-funguje-scope-a-closure-v-javascripte","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/kto-skutocne-vie-ako-funguje-scope-a-closure-v-javascripte\/","title":{"rendered":"Kto skuto\u010dne vie ako funguje Scope a Closure v JavaScripte?"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/df456sdaf.jpg\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"215\" \/>Ke\u010f som pred nieko\u013ek\u00fdmi rokmi za\u010dal \u0161tudova\u0165 programovanie v JavaScripte, pam\u00e4t\u00e1m si, ako som v jednej knihe narazil prv\u00fdkr\u00e1t na pojem Closure. Autor hne\u010f na za\u010diatku tvrdil, \u017ee ak ste program\u00e1tor zo sveta objektov\u00e9ho programovania, budete ma\u0165 probl\u00e9m to pochopi\u0165 (\u010desi na to maj\u00fa v\u00fdborn\u00fd v\u00fdraz: \u201ep\u016fjde v\u00e1m z toho hlava kolem\u201c). No, mysl\u00edm \u017ee nebol \u010faleko od pravdy. Ani po tej dobe nie je Closure pre m\u0148a jednoduch\u00e1 t\u00e9ma, a aj preto som hne\u010f po zhliadnut\u00ed n\u00e1zvu knihy <a href=\"http:\/\/www.bookdepository.com\/You-Dont-Know-JS-Scope-Closures-Kyle-Simpson\/9781449335588\">You dont know JS: Scope <span lang=\"en-US\">&amp; <\/span><span lang=\"sk-SK\">Closure<\/span><\/a><span lang=\"sk-SK\"> od Kyle Simpsona vedel, \u017ee je pre m\u0148a. Tak nejako ten n\u00e1zov vyjadroval moje pocity k tejto t\u00e9me \ud83d\ude42<!--break--><\/span><!--more--><\/p>\n<p><span lang=\"sk-SK\">Knih<\/span><span lang=\"sk-SK\">a<\/span><span lang=\"sk-SK\"> m\u00e1 len 98 str\u00e1n a ak sa chcete nau\u010di\u0165 programova\u0165 <\/span><span lang=\"sk-SK\">v JavaScripte,<\/span><span lang=\"sk-SK\"> tak to nie je kniha pre v\u00e1s. Nepopisuje jazyk ako celok, ale zameriava sa len na Scope a Closure. Je to kniha <\/span><span lang=\"sk-SK\">z<\/span><span lang=\"sk-SK\"> ed\u00edcie, kde v\u0161etky za\u010d\u00ednaj\u00fa t\u00fdm \u201eYou dont know JS\u201c. Je to preto, lebo ve\u013ek\u00e1 \u010das\u0165 \u013eud\u00ed, ktor\u00e1 JavaScript pou\u017e\u00edva, ho naozaj dobr\u00e9 nepozn\u00e1. Je to syndr\u00f3m, ktor\u00fd sa za\u010d\u00edna viac a viac objavova\u0165 ako sa postupne pou\u017eitie JavaScriptu rozrast\u00e1. Aj s\u00e1m autor tvrd\u00ed, \u017ee je to preto, lebo JavaScript sa d\u00e1 pou\u017e\u00edva\u0165 bez toho, aby ste vedeli, \u010do to Scope a Closure je. <\/span><span lang=\"sk-SK\">Sta\u010d\u00ed, ke\u010f sa na<\/span><span lang=\"sk-SK\">u<\/span><span lang=\"sk-SK\">\u010d\u00edte vola\u0165 API nejakej JavaScript kni\u017enice. A ja mus\u00edm potvrdi\u0165, \u017ee pozn\u00e1m ve\u013ea program\u00e1torov, ktor<\/span><span lang=\"sk-SK\">\u00ed<\/span><span lang=\"sk-SK\"> boli dotla\u010den<\/span><span lang=\"sk-SK\">\u00ed<\/span><span lang=\"sk-SK\"> k tomu, aby v nejakej miere pou\u017e\u00edvali JavaScript, ale poznaj\u00fa <\/span><span lang=\"sk-SK\">ho naozaj len z poh\u013eadu pou\u017e\u00edvate\u013ea API<\/span><span lang=\"sk-SK\">.<\/span><\/p>\n<p>Tak\u017ee Scope a Closure. To s\u00fa t\u00e9my, ktor\u00e9 spolu \u00fazko s\u00favia. Scope je rozsah platnosti premennej. <span style=\"background: transparent;\">Inak povedan\u00e9, ak ju na nejakom mieste zadefinujete, <\/span><span style=\"background: transparent;\">ur\u010duje<\/span><span style=\"background: transparent;\"> kde v\u0161ade ju viete pou\u017e\u00edva\u0165.<\/span> To v\u00f4bec nie je \u017eiadna novinka, lebo v\u00e4\u010d\u0161ina mainstreamov\u00fdch jazykov ako je Java, C# alebo C++ to maj\u00fa tie\u017e. JavaScript m\u00e1 s\u00edce nieko\u013eko \u0161peci\u00e1lnych pr\u00edkazov, ktor\u00e9 so scopom umo\u017e\u0148uj\u00fa manipulova\u0165, ale tie sa pou\u017e\u00edvaj\u00fa dos\u0165 raritne. Tak\u017ee v\u00e4\u010d\u0161inou plat\u00ed z\u00e1kladn\u00e9 pravidlo, \u017ee ak ste v nejakom bloku k\u00f3du, tak m\u00e1te pr\u00edstupn\u00e9 v\u0161etky premenn\u00e9 definovan\u00e9 v rodi\u010dovsk\u00fdch blokoch, a k tomu samozrejme glob\u00e1lne premenn\u00e9. Autor toto naz\u00fdva lexik\u00e1lny scope, preto\u017ee sa definuje v \u010dase lexik\u00e1lnej anal\u00fdzy JavaScriptu, ke\u010f sa sp\u00fa\u0161\u0165a v prehliada\u010di.<\/p>\n<p>Closure je u\u017e trochu zauj\u00edmavej\u0161\u00ed. Kdesi som \u010d\u00edtal celkom akademick\u00fa pou\u010dku: \u201eClosure je schopnos\u0165 objektu nies\u0165 si so sebou kontext, v ktorom vznikol.\u201c P\u00e1\u010di sa mi, lebo znie tak m\u00fadro, ale po jej pre\u010d\u00edtan\u00ed ove\u013ea m\u00fadrej\u0161\u00ed \u010dlovek neostane. Tak\u017ee inak. Pred chv\u00ed\u013eou som p\u00edsal, \u017ee JavaScript pou\u017e\u00edva lexik\u00e1lny scope, kde pr\u00edstup k premennej je definovan\u00fd v \u010dase lexik\u00e1lnej anal\u00fdzy. To ist\u00e9 sa deje aj pri in\u00fdch jazykoch, ktor\u00e9 som spom\u00ednal vy\u0161\u0161ie. Tak kde je potom rozdiel? Rozdiel je v tom, \u017ee funkcie s\u00fa v JavaScripte tzv. first-class citizen. To je zase in\u00e9, pekn\u00e9 pomenovanie preto, \u017ee s funkciou m\u00f4\u017eete pracova\u0165 ako s nejak\u00fdm referen\u010dn\u00fdm typom (napr. objetkom) a m\u00f4\u017eete ju preposiela\u0165 z jednej \u010dasti k\u00f3du do druhej. Ke\u010f si ale predstav\u00edte, \u017ee funkciu zadefinovan\u00fa v jednej \u010dasti k\u00f3du prepo\u0161lete do inej a tam ju spustite, k ak\u00fdm premenn\u00fdm bude ma\u0165 pr\u00edstup? Ak sa teraz pozriete na t\u00fa pou\u010dku vy\u0161\u0161ie, tak v\u00e1s mo\u017eno odpove\u010f napadne. St\u00e1le bude ma\u0165 pr\u00edstup k premenn\u00fdm, ktor\u00e9 sa nach\u00e1dzaj\u00fa v mieste jej defin\u00edcie, nie vykonania. A to aj v pr\u00edpade, \u017ee bola s\u00fa\u010das\u0165ou nejak\u00e9ho objektu, ktor\u00fd sa u\u017e nepou\u017e\u00edva. K\u00fdm existuje niekde odkaz na met\u00f3du objektu, tak objekt so v\u0161etk\u00fdmi jeho premenn\u00fdmi je v pam\u00e4ti k dispoz\u00edcii aspo\u0148 pre t\u00fato funkciu. Znamen\u00e1 to teda, \u017ee JavaScrip pri vyhodnocovan\u00ed st\u00e1le pou\u017e\u00edva lexik\u00e1lny scope, aj ke\u010f do\u0161lo k presunu met\u00f3dy do in\u00e9ho prostredia<\/p>\n<p><span lang=\"sk-SK\">To je tak v r\u00fdchlosti zrekapitulovan\u00e9, \u010do je Scope a \u010do Closure. V knihe toho n\u00e1jdete omnoho viac aj s r\u00f4znymi \u0161peci\u00e1lnymi pr\u00edpadmi, ktor\u00e9 tieto z\u00e1kladn\u00e9 pravidl\u00e1 obch\u00e1<\/span><span lang=\"sk-SK\">d<\/span><span lang=\"sk-SK\">zaj\u00fa. Kniha je nap\u00edsan<\/span><span lang=\"sk-SK\">\u00e1<\/span><span lang=\"sk-SK\"> dobre v tom oh\u013eade, \u017ee do tejto celkom kopmplikovanej t\u00e9my sa pon\u00e1ra len ve\u013emi pomal<\/span><span lang=\"sk-SK\">y<\/span><span lang=\"sk-SK\">. Ne\u013eutujem, \u017ee som ju \u010d\u00edtal a u\u017e sa obhliadam po \u010fal\u0161\u00edch z ed\u00edcie <\/span><span lang=\"sk-SK\">\u201eYou dont know JS\u201c.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>Ke\u010f som pred nieko\u013ek\u00fdmi rokmi za\u010dal \u0161tudova\u0165 programovanie v JavaScripte, pam\u00e4t\u00e1m si, ako som v jednej knihe narazil prv\u00fdkr\u00e1t na pojem Closure. Autor hne\u010f na za\u010diatku tvrdil, \u017ee ak ste program\u00e1tor zo sveta objektov\u00e9ho programovania, budete ma\u0165 probl\u00e9m to pochopi\u0165 (\u010desi na to maj\u00fa v\u00fdborn\u00fd v\u00fdraz: \u201ep\u016fjde v\u00e1m z toho hlava kolem\u201c). No, mysl\u00edm \u017ee [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-72","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=72"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":163,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/72\/revisions\/163"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}