<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code42 &#187; ecmascript</title>
	<atom:link href="http://code42.pl/tag/ecmascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Walka Dart vs JavaScript &#8211; nokaut podczas ważenia</title>
		<link>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/</link>
		<comments>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 22:47:04 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[dart]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[harmony]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1260</guid>
		<description><![CDATA[Myślałem, że nie napiszę nic o Darcie, bo cała historia z nim związana z początku nie wywoływała we mnie żadnych specjalnie negatywnych czy pozytywnych emocji. Dzięki Zbyszkowi Branieckiemu i Markowi Stępniowi trochę szerzej spojrzałem na temat, biorąc pod uwagę też historie o których, czy to z racji mojego krótkiego życia, czy braku wiedzy o pracach [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/' rel='bookmark' title='Wrocław wita JavaScript – Meet.JS i Wrocław GTUG'>Wrocław wita JavaScript – Meet.JS i Wrocław GTUG</a></li>
<li><a href='http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/' rel='bookmark' title='Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka'>Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Myślałem, że nie napiszę nic o Darcie, bo cała historia z nim związana z początku nie wywoływała we mnie żadnych specjalnie negatywnych czy pozytywnych emocji. Dzięki <a href="http://diary.braniecki.net/">Zbyszkowi Branieckiemu</a> i <a href="http://blog.marcoos.com/">Markowi Stępniowi</a> trochę szerzej spojrzałem na temat, biorąc pod uwagę też historie o których, czy to z racji mojego krótkiego życia, czy braku wiedzy o pracach komitetów i producentów przeglądarek, nie wiedziałem i&#8230; sami przeczytajcie. Załączam poniżej coś co miało stać się przydługim komentarzem na <a href="http://www.goldenline.pl/forum/2621108/czy-dart-to-nastepca-javascriptu-od-google">forum Goldenline</a>.</p>
<h2>Pożal się Google</h2>
<p>To co zrobiło Google, to żart. Cała historia z wewnętrznymi, nie do końca miłymi mailami z Google&#8217;a, które wyszły na światło dzienne, sam Dart i otoczka PR-owa jaką ma, to jedno wielkie nieporozumienie. Google się nie popisało i, moim skronym zdaniem, wyjdzie to tylko na dobre open webowi.</p>
<p>Wyobraźmy sobie, co by się stało gdyby Dart rzeczywiście powalał na kolana i miałby świetnie zaimplementowaną, super wydajną i dostępną out of the box w Chrome maszynę. Szybko znalazłoby się grono fan boy&#8217;ów, którzy bez zastanowienia zaczęliby pisać aplikacje &#8222;only for Chrome&#8221;, bądź &#8222;works best with Chrome&#8221;, z ewentualną, wątpliwej jakości, kompilacją do powolnego i starego JavaScriptu dla &#8222;gorszych przeglądarek&#8221;. (BTW. <a href="https://gist.github.com/1277224">hello world w Dartcie</a> skompilowany do JS to 17<strong>000</strong> linii kodu :D).</p>
<p><span id="more-1260"></span></p>
<p>Po chwili okazałoby się, że Google, wykorzystując swoją pozycję lidera na wielu rynkach, zaczyna (pośrednio &ndash; przez zadowolonych użytkowników) wymuszać na innych producentach implementację Darta. No dobra &ndash; wygrał, ale w czym problem, pytacie? W tym, że Google nie raczy podzielić się odpowiedniej jakości specyfikacją języka i Mozilla, MS, czy Opera zostają zmuszone do reverse engineeringu z Chrome&#8217;a. Brzmi jak głupia apokaliptyczna wizja? Problem w tym, że ten przypadek już mieliśmy z protokołem SPDY, ponieważ Mozilla została zmuszona przez Google do zgadywania jak on w szczegółach działa. Koniec końców, po wykonaniu nieprzyjemnej pracy, pozostali producenci i tak kończą z &#8222;gorszą&#8221; implementacją. Innymi słowy &ndash; wracamy do czasów wojny przeglądarek i nieczystych zagrań. W dodatku pieczę nad specyfikacją języka sprawuje Google i wcale nie mamy pewności, czy się nią podzieli.</p>
<p>Dalej brzmi to jak bajka? Ciekawostka &ndash; opublikowana &#8222;specyfikacja&#8221; (wczesny draft oczywiście) Darta ma 70 stron, a specyfikacja wiele razy mniej złożonego ES5 250 stron. I nie, nie z powodu wielkości fonta. Mówicie &ndash; są języki, które radzą sobie bez specyfikacji &ndash; Python, Ruby &ndash; i są świetne (ktoś wymienił PHP &ndash; strzał w stopę w tej dyskusji :D). Tak, ale implementuje je jeden producent. W webie to nie działa i nigdy nie działało. Chcecie żeby przeglądarki miały spójne implementacje, to nie cofajcie się teraz o krok wstecz (prawie jak cofać się do tyłu :P). Nie po to wielokrotnie straciliśmy włosy na głowie (a i twarz też, bo czasami głupio się przyznać &ndash; &#8222;jestem programistą JavaScript&#8221;), by zapominać czego nauczyła nas historia. Nie po to został włożony i nadal jest wkładany ogromny trud w to, by ujednolicić i dogłębnie dospecyfikować wykorzystywane przez nas technologie, byśmy teraz tę pracę skreślili i zaczęli od początku. W szczególności, że&#8230;<br />
<h2>Na poważnie, czyli z forkowaniem za pan brat</h2>
<p>&#8230; nie ma takiej potrzeby. Wiele osób, w tym i ja, narzeka na JavaScript. Niektórzy wciąż nie wiedzą ile naprawił ES5 ze strict modem, niektórzy też nie zdają sobie sprawy ile jeszcze problemów jest do rozwiązania. Większość jednak narzeka i moim zdaniem słusznie. Na szczęście trwają prace nad ES6 aka Harmony aka ES.next (w których oczywiście Google uczestniczy). O ile, co smutne, ale racjonalne, ES5 nie wprowadził żadnych (może poza strict modem) przełomowych zmian w JavaScriptcie, o tyle ES6 takie zmiany ma wprowadzić, włącznie z dużymi w składni (choć Marcoos mi ostatnio powiedział, że myślą o wydaniu pośrednim, bez zmian składniowych, stąd pośrednie nazwy &ndash; oby pomysł upadł &ndash; miejcie jaja, Panowie!).</p>
<p>Na pewno jednak ten właściwy ES6 zrywa ze wsteczną zgodnością. Jest więc pole do popisu i czas, by, jeśli ktoś się postara, niemal od nowa projektować pewne aspekty języka. Można mieć tylko jeden zarzut do Harmony &ndash; nic nie wiemy o planowanym terminie zakończenia prac. Jednym z argumentów zwolenników strategii Google jest to, że &#8222;nie chcieli czekać, aż się powolny komitet naprodukuje i jako największy gracz wzięli sprawy w swoje ręce&#8221;. Brzmi niemal przekonująco. Poza tym, że Darta też szybko w wersji stabilnej i szeroko dostępnej nie zobaczymy (jeśli w ogóle). W dodatku praktyka odległej wersji finalnych HTML5 i CSS3 pokazuje, że dzięki wczesnym prototypom częściowym możemy raz, że wiele poprawić jeszcze podczas prac nad specyfikacją, dwa że płynnie przejść pomiędzy wersjami i szybko z nowych ficzerów korzystać. Co prawda JavaScript, to nie CSS, gdzie możemy sobie pozwolić na graceful degradation, jednak gracze typu Google bez problemu mogą serwować inne źródła w zależności od zdolności przeglądarki (a i tak mówimy o kompilacji ES6 do ES3, bo polyfilli to nie będzie). W dodatku wiele osób pisze aplikacje w JavaScript na w miarę przewidywalne środowiska (intranet, komórki, serwer), gdzie problemu nie ma w ogóle.</p>
<p>Stąd przechodzę do pytania &ndash; dlaczego Google zamiast forkować istniejące rozwiązania, nie zdecydowało się na wczesną, testową implementację ES6 w V8 (choć zdaje się chodziły takie słuchy)? Dzięki temu mogłoby wpływać na prace komitetu (wprowadzać ficzery w V8 i pokazywać, że świetnie się przyjmują wśród developerów, bądź po prostu dobrze działają), przyspieszyć je i poprawić zawczasu wiele wątpliwych kwestii. Spotkałem się też z argumentem, że konkurencja jest przecież dobra. Owszem, mamy na szczęście kilku producentów i stosunkowo równomierny ich udział w rynku. Moim zdaniem to wystarcza, co widać choćby na przykładzie wcześniej przeze mnie wspomnianych HTML5 i CSS3 (kontrargument swoją drogą, to to, że wyścig rodzi kiepskie implementacje &ndash; vide koszmarne formsy).</p>
<p>Bawi mnie niezmiernie jeszcze jedna kwestia. Dart wcale nie jest fajny. Wygląda jak Java, jest toporny, nie ściągnie gawiedzi jak laska z cycem na wierzchu zwana CoffeeSkryptą (BTW. uroda z inteligencją w parze nie idzie &ndash; to może ten Dart taki zły nie jest? Małżeństwo z rozsądku? ;). Nie jest też wybitnie rewolucyjny, ani&#8230; odległy od ES6. Koncepcje, które znalazłem w Dartcie widywałem też w materiałach o ES6. Jego implementacja też póki co nie powala na ziemię pod względem wydajności, a był to przecież podobno jeden z powodów porzucenia JS. W dodatku pokazuje to jak wiele pracy jest do wykonania, by dogonić już wiele lat rozwijany engine V8. To jest kolejny powód dla którego nie rozumiem decyzji Google&#8217;a.</p>
<h2>Jest też plus</h2>
<p>Jest jednak jedna rzecz, która mi się podoba w Dartcie &ndash; szersza biblioteka standardowa (włączając w to sensowną implementację DOM-a). Uważam, że w tej chwili jednym z największych problemów JavaScriptu, jest brak ustandaryzowanych (mniej, lub bardziej formalnie) podstawowych narzędzi. Ja np. w najświeższym projekcie postanowiłem wykorzystać <a href="https://github.com/medikoo/deferred">deferred</a> i <a href="https://github.com/medikoo/es5-ext">es5-ext</a> skompilowane do niecommonjsowej postaci. Zastanawiałem się jednak, czy nie wolę underscore&#8217;a. Ale zaraz &ndash; deferred i tak korzysta z es5-ext, więc ten kod i tak załaduję (tutaj ukłon w kierunku Medikoo &ndash; na szczęscie es5-ext jest 100% zmodularyzowane, więc konfigurowalne). Potrzebowałem jeszcze czegoś do DOM-a. Z jQuery nie skorzystam, bo nie potrzebuję 90% (dosłownie!) tej biblioteki, w dodatku pokrywa mi się z deferred i trochę es5-ext, no i szukałem czegoś lekkiego. Trafiłem na xui.js, które okazało się niedopieszczone. Szukałem czegoś do single page apps &ndash; Backbone? Nieee&#8230; ktoś wymyślił, że dla XHR-a,  delegate&#8217;a i deferred (i czegoś jeszcze?) skorzysta z jQuery. Jeszcze gorzej chyba ze Spine.js, gdzie znalazłem jakoś z 5 odniesień do jQuery, ale zaszytych głęboko w kodzie, bez możliwości łatwej podmiany. Przy całym tym śmietniku idiotycznych decyzji twórców tych (i wielu innych) narzędzi, są myślące osobniki, które wyprodukowały takie mini biblioteki jak <a href="http://millermedeiros.github.com/crossroads.js/">Crossroads</a>, czy <a href="http://millermedeiros.github.com/js-signals/">js-signals</a>. Robiące dokładnie jedną rzecz i nie zawierające zbędnych zależności.</p>
<p>Żalę się generalnie, ale nie bez powodu. Dart rozwiązałby połowę moich problemów. Mamy i promise&#8217;y, i wygodniejszego DOM-a. Dużo więcej ciekawych rzeczy niestety nie znalazłem, ale początek jest dobry. Uważam, że to jest aspekt języka, na który powinny zwrócić uwagę osoby pracujące nad ES6. Wiem na pewno, że jeden problem zostanie rozwiązany &ndash; zostaną wprowadzone natywne moduły. Trochę martwi mnie ich rozbieżność w stosunku do CommonJS-owej wersji (i trochę niezrozumiała dla mnie decyzja o wprowadzeniu nowej składni), ale może uda się to zgrabnie rozegrać.</p>
<h2>Podsumowując</h2>
<p>Nie wierzę, a przynajmniej nie chcę wierzyć, w sukces Darta. Póki co niczym mnie nie zainteresował i nie zamierzam się w niego zagłębiać. Mam nadzieję, że byłaby to strata czasu.</p>
<p>Zauważyliście pewnie, że brakuje w treści linków do źródeł. Tak &ndash; nie chce mi się. Google w tym wypadku pomoże :). Poza tym, nie chcę być wyrocznią, nie chcę napisać pracy doktorskiej, nie chcę nikogo zniszczyć, wypunktowując go bezlitośnie. Co więcej, możliwe, że sam niedługo zmienię na co poniektóre tematy zdanie, bo i nie mam pełnej wiedzy o tym co się dzieje i co się stanie. Powyższa opinia rodziła się we mnie jednak już kilka tygodni, więc nie jest też pisana pod wpływem wielkich emocji. Może więc jest racjonalna :).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/' rel='bookmark' title='Wrocław wita JavaScript – Meet.JS i Wrocław GTUG'>Wrocław wita JavaScript – Meet.JS i Wrocław GTUG</a></li>
<li><a href='http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/' rel='bookmark' title='Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka'>Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Co lepiej wiedzieć o JavaScriptcie cz.1.: typy zasięgu i domknięcia</title>
		<link>http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/</link>
		<comments>http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 22:25:48 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[domknięcia]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[es6]]></category>
		<category><![CDATA[harmony]]></category>
		<category><![CDATA[scope]]></category>
		<category><![CDATA[zasięg]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=907</guid>
		<description><![CDATA[Istnieją takie aspekty języka, których w wielu przypadkach wpływ na działanie kodu jest wręcz niezauważalny, a przez to ich znajomość nie jest niezbędna do napisania nawet bardziej złożonych aplikacji. Zdarzają się jednak takie sytuacje, kiedy, widząc błąd, robimy okrągłe oczy, a z naszych gardeł wydobywa się głuche WTF i, jeśli nie jesteśmy świadomi ogromu swej [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
<li><a href='http://code42.pl/2009/03/18/konsola-firebuga-echowanie-javascriptu/' rel='bookmark' title='Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu'>Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu</a></li>
<li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Istnieją takie aspekty języka, których w wielu przypadkach wpływ na działanie kodu jest wręcz niezauważalny, a przez to ich znajomość nie jest niezbędna do napisania nawet bardziej złożonych aplikacji. Zdarzają się jednak takie sytuacje, kiedy, widząc błąd, robimy okrągłe oczy, a z naszych gardeł wydobywa się głuche <q>WTF</q> i, jeśli nie jesteśmy świadomi ogromu swej niewiedzy, pada po chwili: <q>Znalazłem błąd w silniku przeglądarki!</q>. Co gorsza, najczęściej na rozwiązanie takiego problemu potrzeba sporo czasu i nerwów.</p>
<p>Spośród <a href="http://code42.pl/2011/08/05/javascript-po-polsku/">listy tematów do opracowania</a> wybrałem pierwsze 3, które moim zdaniem zgrabnie się łączą. Są to <b>zasięg</b> (scope), <b>ho<u>i</u>sting</b> (widziałem tłumaczenie do <q>wyniesienie</q>, ale brzmi strasznie) oraz <b>deklaracje funkcji</b> (function declaration &ndash; dalej: FD) i <b>wyrażenia funkcyjne</b> (function expression &ndash; dalej: FE). Mam nadzieję, że rozjaśnienie tych tematów pozwoli zaoszczędzić komuś trochę czasu :).</p>
<p>Artykuł będzie składał się z dwóch części. Tę część poświęciłem typom zasięgu oraz domknięciom. Następna będzie dotyczyła (edit: już jest dostępna) <a href="http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/">hoistingu i funkcji</a>.</p>
<h2>Sprawdź się!</h2>
<p>Na początek niekrótki zestaw krótkich testów. Spróbuj rozpoznać co wydrukuje każdy <code>console.log</code>. Skrypt z wszystkimi pytaniami, <strong>wraz z odpowiedziami</strong> wrzuciłem na <a href="https://gist.github.com/1134905">Gista</a>.</p>
<h3>Cz.1.</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> a <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'1.1:'</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'1.2:'</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> c_fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
c_fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'1.3:'</span><span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><span id="more-907"></span></p>
<h3>Cz.2.</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> a_fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> a<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.1:'</span><span style="color: #339933;">,</span> a_fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.2:'</span><span style="color: #339933;">,</span> fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>a_fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    a <span style="color: #339933;">=</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.3:'</span><span style="color: #339933;">,</span> fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>a_fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.4:'</span><span style="color: #339933;">,</span> a_fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    b_i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> b_i <span style="color: #339933;">&lt;</span> b.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>b_i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    b<span style="color: #009900;">&#91;</span>b_i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> b_i<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.5:'</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Zasięg funkcyjny i blokowy</h2>
<p>Jeśli wychowałeś się na JavaScriptcie, pierwszy test nie powinien sprawić Ci żadnego problemu. Jeśli jednak jesteś programistą Javy, bądź języka C(|++|#), to mogłeś odpowiedzieć źle. Jaka jest różnica? JavaScript jest językiem o zasięgu funkcyjnym, zaś pozostałe o zasięgu blokowym.</p>
<p>Analogiczny kod napisany w C++ (dla przykładów 1.1 i 1.2, ponieważ 1.3 jest niewykonalny) zwróciłby odpowiednio <code>1.1: 1, 1.2: error: ‘b’ was not declared in this scope</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> a <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>a<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> a<span style="color: #008080;">;</span> <span style="color: #666666;">// -&gt; 1</span>
&nbsp;
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> b<span style="color: #008080;">;</span> <span style="color: #666666;">// -&gt; błąd kompilacji</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Jak widać, blok, bądź konstrukcja <code>for</code> powodują pojawienie się nowego zasięgu. Po wykonaniu się pętli <code>a</code> wciąż jest równe <code>1</code> (<a href="http://www.java2s.com/Tutorial/Cpp/0020__Language-Basics/Variableblockscope.htm">więcej przykładów dla C++</a>). Java zachowałaby się nieco inaczej, uniemożliwiając redefiniowanie zmiennej o tej samej nazwie, jednak ogólna zasada byłaby identyczna.</p>
<p>JavaScript za to, określając sobie zasięg zmiennej, nie zwraca uwagi na żadne bloki. Jedynym ograniczeniem dla niego jest funkcja. <strong>Każda zmienna zdefiniowana w funkcji jest widoczna w tej funkcji i w funkcjach zdefiniowanych w tej funkcji, ale nigdzie poza nią</strong>. Dzięki temu otrzymamy: <code>1.1: 10, 1.2: b</code>, lecz: <code>1.3: ReferenceError</code>.</p>
<p>Zostałem kiedyś zapytany, czy istnieje możliwość podejrzenia wewnętrznego scope&#8217;a funkcji. Odpowiedź jest na szczęście przecząca (przynajmniej wedle mojego stanu wiedzy). Tak ścisłe ograniczenie zasięgu pozwala nam bezwarunkowo zabezpieczyć kod przed ingerencją z zewnątrz. Stąd na pewno gdzieś już widziałeś konstrukcję:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
...
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Jest to samowykonująca się funkcja. Wszystko co zostanie zdefiniowane wewnątrz niej jest niedostępne z zewnątrz (o ile nie zostało zwrócone).</p>
<h2>Zasięg statyczny</h2>
<p>Napisałem, że zmienna zdefiniowana w funkcji jest widoczna w tej funkcji i <em>w funkcjach zdefiniowanych w tej funkcji</em>. Takie podejście nazywa się statycznym zasięgiem (druga nazwa to zasięg leksykalny &ndash; <a href="http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Lexical_versus_dynamic_scoping">lexical scoping</a>), z tego względu, że określenie zasięgu polega jedynie na analizie statycznego kodu programu. Przeciwstawnym podejściem jest dynamiczny zasięg, a więc scope funkcji określany jest w momencie jej wywołania, a nie definicji.</p>
<p>Przyjrzyjmy się drugiemu przykładowi do tej części:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> a_fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> a<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>fn<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.2:'</span><span style="color: #339933;">,</span> fn<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 1</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>a_fn<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Jak widać, mimo zadeklarowania <code>var a = 2</code> w miejscu wywołania funkcji <code>a_fn()</code> zostanie zwrócone <code>1</code>. Tak więc możemy powiedzieć, że funkcja zapamiętała otoczenie swojej definicji. Zachowanie takie nazywa się domknięciem, czyli jest to sławetny postrach początkujących &ndash; <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closure</a>. O domknięciach chciałbym napisać kiedyś osobny artykuł, ale dla utrwalenia jeszcze jeden przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> outer <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> inner <span style="color: #339933;">=</span> outer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
inner<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 2</span></pre></div></div>

<h3>Przez referencję, głupcze!</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    b_i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> b_i <span style="color: #339933;">&lt;</span> b.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>b_i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    b<span style="color: #009900;">&#91;</span>b_i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> b_i<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2.5:'</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 4</span></pre></div></div>

<p>To jest chyba najbardziej znany przykład na to, że zmienne zamykane są przez referencję, a nie przez wartość. Wszystkie cztery funkcje wskazują na tę samą zmienną <code>b_i</code> i są od niej zależne aż po swój kres. Dobrze o tym pamiętać, bo jest to źródłem wielu błędów.</p>
<p>Jeśli jednak chcemy aby funkcje zwracały odpowiednio: <code>0, 1, 2, 3</code>, to co zrobić aby naprawić powyższy przykład? Zastosować kolejne domknięcie, tym razem jednak przekazując naszą zmienną jako argument, ponieważ te przekazywane są przez wartość (tylko typy proste).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    b_i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> b_i <span style="color: #339933;">&lt;</span> b.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>b_i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    b<span style="color: #009900;">&#91;</span>b_i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> i<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span>b_i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 2</span></pre></div></div>

<h2>Zasięg blokowy w JavaScriptcie</h2>
<p>Życie z niedoskonałym zasięgiem funkcyjnym (czasem połączonym z domknięciami) bywa nieprzyjemne. W poprzednim przykładzie musieliśmy dodać nadmiarową funkcję, co oznacza zaciemnienie kodu oraz spadek wydajności. Tak samo musielibyśmy się zachować gdybyśmy chcieli aby pętla <code>for</code> mogła iterować po wartości, która nie przesłoniłaby nam innej, zdefiniowanej wcześniej.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
...
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
...
<span style="color: #660066;">console</span>.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 5! 10 zostało przesłonięte</span></pre></div></div>

<p>Twórcy EcmaScriptu szukali więc wyjścia i już w wersji EcmaScript 4 (trochę <a href="http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/">historii porzuconego standardu</a>) zamierzali wprowadzić słowo kluczowe <code>let</code> mające służyć deklarowaniu zmiennej o zasięgu lokalnym &ndash; blokowym. Standard (a w zasadzie jego zalążek) został niestety porzucony na kilka lat i w okrojonym stanie wróci pod nazwą EcmaScript 6 aka Harmony (mój kolejny pomysł na wpis :).</p>
<p>Okazuje się jednak, że część porzuconego EcmaScriptu 4 została zaimplementowana w silniku Firefoksa. Są to <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7">JavaScript 1.7</a> i <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8">JavaScript 1.8</a>. Zmienne lokalne są częścią wersji 1.7 i po przestawieniu silnika w odpowiedni tryb można z nich do woli korzystać. Co ciekawe silnik RingoJS domyślnie działa w wersji 1.8, co dawałoby mu ogromną przewagę nad silnikiem Node&#8217;a, gdyby nie jego słaba wydajność :).</p>
<p>Przykład wykorzystania <code>let</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript;version=1.8&quot;</span><span style="color: #339933;">&gt;</span>
    <span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        b_i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">;</span> b_i <span style="color: #339933;">&lt;</span> b.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>b_i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        let i <span style="color: #339933;">=</span> b_i<span style="color: #339933;">;</span>
        b<span style="color: #009900;">&#91;</span>b_i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> i<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 2</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; ReferenceError</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Ciekawym pytaniem na koniec jest, czy zasięg funkcyjny ma jakiś sens? Czy wraz z wejściem zmiennych lokalnych nie powinniśmy porzucić <code>var</code>?</p>
<p>Ciąg dalszy nastąpi&#8230;</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
<li><a href='http://code42.pl/2009/03/18/konsola-firebuga-echowanie-javascriptu/' rel='bookmark' title='Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu'>Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu</a></li>
<li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event</title>
		<link>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/</link>
		<comments>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/#comments</comments>
		<pubDate>Sun, 08 May 2011 21:14:04 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Różne]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[falsy values]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=937</guid>
		<description><![CDATA[Kto nie był w zeszłym roku na konferencji Front Trends ten, czytając świetne recenzje jakie dostała, na pewno tego żałował. Sam byłem w Warszawie i wiem, że dobrze zainwestowałem swój czas i pieniądze, bo to jedyne tego typu wydarzenie w Polsce, jakie pamiętam. Wystarczy spojrzeć na listę prelegentów, którzy wzięli udział w konferencji. Douglas Crockford, [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/29/javascript-na-jesien-2011/' rel='bookmark' title='JavaScript na jesień 2011'>JavaScript na jesień 2011</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://falsyvalues.com/" title="Falsy Values 2011 - A True JavaScript Event"><img src="http://code42.pl/wp-content/uploads/falsy_values.png" width="536" height="140" alt="Falsy Values 2011 - A True JavaScript Event"/></a></p>
<p>Kto nie był w zeszłym roku na konferencji <a href="http://front-trends.com/">Front Trends</a> ten, czytając świetne recenzje jakie dostała, na pewno tego żałował. Sam byłem w Warszawie i wiem, że dobrze zainwestowałem swój czas i pieniądze, bo to jedyne tego typu wydarzenie w Polsce, jakie pamiętam. Wystarczy spojrzeć na <a href="http://front-trends.com/speakers">listę prelegentów</a>, którzy wzięli udział w konferencji. <a href="http://crockford.com">Douglas Crockford</a>, <a href="http://tantek.com">Tantek Çelik</a>, <a href="http://www.quirksmode.org/">Peter-Paul Koch</a> to bez wątpienia gwiazdy, których przedstawiać nie trzeba. Jednak bardzo dobre wrażenie zrobili na mnie również mniej znani prelegenci, jak <a href="http://cjohansen.no">Christian Johansen</a>, <a href="http://mozilla.org">Zbigniew Braniecki</a> (jako moderator panelu dyskusyjnego), czy <a href="http://webreflection.blogspot.com">Andrea Giammarchi</a>.</p>
<p>Jedyny zarzut (poza drobnymi problemami organizacyjnymi i kilkoma odstającymi poziomem prelegentami), jaki słyszałem w stosunku do zeszłorocznej konferencji to zbyt małe nastawienie na JavaScript. W tym roku <a href="http://varjs.com">Damian Wielgosik</a> i <a href="http://czerski.info/">Paweł Czerski</a>, twórcy Front Trends, postanowili wyjść na przeciw krytykom i już za 2 tygodnie, w dniach <strong>18-20 maja w Warszawie</strong> odbędzie się <strong>konferencja i 2 dni warsztatów pod nazwą <a href="http://falsyvalues.com/">Falsy Values</a></strong>. Tym razem, z pewnością, będzie to &#8222;True JavaScript Event&#8221;. W dodatku obsada zapowiada się jeszcze ciekawiej i równiej. Nie dość, że gościć będą wszyscy wielcy z Front Trends (poza PPK-em), to spotkać będzie można również kilku nowych, dobrze znanych, developerów, m.in. <a href="http://dmitrysoshnikov.com">Dmitry&#8217;a Soshnikova</a>, <a href="http://perfectionkills.com">Juriy&#8217;a &#8222;kangax&#8221; Zaytseva</a> oraz <a href="http://pornel.net">Kornela &#8222;porneL&#8221; Lesińskiego</a>.</p>
<p><span id="more-937"></span></p>
<p><a href="http://falsyvalues.com/speakers.html" title="Prelegenci"><img src="http://code42.pl/wp-content/uploads/falsy_values_speakers.png" width="536" height="230" alt="Prelegenci: m.in. Douglas Crockford i Tantek Çelik"/></a></p>
<p>W chwili obecnej <strong>zakupić można jeszcze <a href="http://falsyvalues.com/registration.html">bilety wstępu</a></strong> (upoważniające również do udziału w konferencji) na wszystkie warsztaty poza jednymi prowadzonymi przez Tanteka Çelika. Do wyboru mamy więc node.js, wstęp do JavaScriptu, gry, ECMAScript 5, Test Driven Development i aplikacje desktopowe. Można zakupić też bilet jedynie na piątkową konferencję. Ceny wahają się w zależności od tematu warsztatów i długości (są jedno i dwudniowe) i wydaje mi się, że nie są wygórowane, w szczególności kiedy porównamy je z dotyczącymi podobnych eventów organizowanych za naszą zachodnią granicą.</p>
<p>Jeśli o mnie chodzi, to ze względu na studia pojawię się tylko w piątek na konferencji (dziękuję tutaj Damianowi za zaproszenie). Zapowiada się wspaniały dzień, ponieważ plan prelekcji jest wyśmienity. Wiem, że ani nie będę mógł się spóźnić (Douglas Crockford na początek), ani wcześniej wyjść (Tantek Çelik na koniec), ani nawet przysnąć w środku (Dmitry Soshnikov). W szczególności nie mogę doczekać się występu tego trzeciego, ponieważ będzie mówił o ECMAScript 6, a kto <a href="http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/">czytał mnie wcześniej</a>, wie, że interesuje mnie rozwój tego standardu.</p>
<p>Tak więc, <strong>do zobaczenia w Warszawie!</strong></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/29/javascript-na-jesien-2011/' rel='bookmark' title='JavaScript na jesień 2011'>JavaScript na jesień 2011</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka</title>
		<link>http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/</link>
		<comments>http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 00:39:45 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[delete]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[gramatyka języka]]></category>
		<category><![CDATA[literał obiektu]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[słowa kluczowe]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=734</guid>
		<description><![CDATA[Zauważyłem dzisiaj, że Opera wyrzuca błąd w kodzie, który pod nią testowałem. Okazało się (po dłuższej chwili szukania, bo wersja 10.63 jaką miałem zainstalowaną kompletnie nie trafia z linią wystąpienia błędu), że problem tkwił w użycia słowa delete w literale obiektu. Przykładowo: var obj = &#123; delete: 'eee?' &#125;; Słowo to jest słowem kluczowym, jednak [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin-left: 15px;"><img src="http://code42.pl/wp-content/uploads/opera.jpg" alt="Opera fail" width="200" height="364"/></p>
<p>Zauważyłem dzisiaj, że Opera wyrzuca błąd w kodzie, który pod nią testowałem. Okazało się (po dłuższej chwili szukania, bo wersja 10.63 jaką miałem zainstalowaną kompletnie nie trafia z linią wystąpienia błędu), że problem tkwił w użycia słowa <code>delete</code> w literale obiektu. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">delete</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'eee?'</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Słowo to jest słowem kluczowym, jednak nie mogłem znaleźć sensownego powodu (typu problem z jednoznacznością zapisu), który wymuszałby zarezerwowanie go również w takim kontekście. Kod ten działa pod Firefoksem i Google Chrome (również z wywołaniem <code>obj.delete</code>), byłem więc ciekaw kto ma rację. Nie ukrywam przy tym, że nie jestem miłośnikiem silnika JavaScript w Operze. Miewałem z nim problemy (i nie tylko ja) i nie przepadam też za całą przeglądarką. Kilka razy jednak okazało się, że to Opera poprawniej (a dokładnie bardziej bezwzględnie) traktuje błędy w kodzie HTML, więc nie byłem pewien rezultatu.</p>
<p>W celu rozwiązania zagadki sięgnąłem do <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">specyfikacji ECMAScript 5</a>.</p>
<p><span id="more-734"></span></p>
<h2>Zarezerwowane słowa</h2>
<p>Najpierw zbiór zarezerwowanych słów (7.6.1.1):</p>
<pre>ReservedWord ::
      Keyword
      FutureReservedWord
      NullLiteral
      BooleanLiteral</pre>
<p>Jak widać zbiór ten składa się ze słów kluczowych (głównie takich, które są wykorzystywane w tej chwili), przyszłych (takich które mogą być) oraz <code>null, true, false</code>.</p>
<p>Lista słów kluczowych obecnie używanych:</p>
<pre>Keyword :: one of
    instanceof        typeof
    break             do
    new               var
    case              else
    return            void
    catch             finally
    continue          for
    switch            while
    this              with
    debugger          function
    throw             default
    if                try
    delete            in</pre>
<p>Jak widać słowo <code>delete</code> występuje w tej liście. Nic dziwnego &ndash; w końcu ma specjalne znaczenie. Nic to jednak nie oznacza w kontekście obiektów.</p>
<p>Ciekawostka &ndash; na liście tej nie ma słowa <code>undefined</code>. Wydawałoby się, że być powinno, ponieważ podobne słowo <code>null</code> jest zarezerwowane. Okazuje się, że nie. Ma to związek z tym, że wartość <code>undefined</code> nie jest specjalnie chroniona i można zrobić z nią np. tak:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">typeof</span> undefined<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'undefined'</span>
undefined <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">typeof</span> undefined<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'number' sic!</span></pre></div></div>

<p>Nie testuj więc nigdy <code>val === undefined</code>, lepiej <code>typeof val === 'undefined'</code>. Koniec ciekawostki.</p>
<p>Przyjrzyjmy się teraz słowom zarezerwowanym z myślą o przyszłych pokoleniach:</p>
<pre>FutureReservedWord :: one of
    class             enum
    extends           super
    import            const
    export</pre>
<p>Dodatkowo w strict mode mamy:</p>
<pre>implements    let         private      public    yield
static        interface   package      protected</pre>
<p>Ciekawostka numer dwa. Jak widać zarezerwowane są słowa <code>private</code> i <code>protected</code>. Może się więc <a href="http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/">kiedyś doczekam właściwości chronionych</a> :). Choć z drugiej strony zapisałem się ostatnio na listę dyskusyjną poświęconą ECMAScript i panowie w komitecie strasznie tam nudzą, więc data pewnie bliska nie będzie.</p>
<p>Wszystkie wymienione wyżej słowa składają się na grupę słów zarezerwowanych. Teraz musimy się dowiedzieć jaką rolę pełnią przy opisie gramatyki literału obiektu i sposobach dostępu do jego właściwości.</p>
<h2>Identyfikatory</h2>
<p>Specyfikacja ECMAScript 5 wyszczególnia jeszcze dwie grupy, które będą nas interesować. identyfikatory (ang. Identifier) i nazwy identyfikatorów (ang. IdentifierName). Miałem tu problem z tłumaczeniem, ponieważ nie rozumiem w pełni znaczenia tych grup, tak więc przetłumaczyłem je najbardziej wprost jak się dało. Nazwy identyfikatorów to grupa składająca się z:</p>
<pre>IdentifierName ::
        IdentifierStart
        IdentifierName IdentifierPart</pre>
<p>Nie będę się rozwodził co wchodzi w skład tego zbioru. W skrócie powiem tylko, że znaki <code>$ _</code>, litery, unikodowe sekwencje (np. <code>\u0061 -> "a"</code>), oraz inne unikodowe znaki specjalne (Mn, Mc, Nd, Pc, Zwnj, Zwn) i cyfry (jednak obydwie grupy nie mogą wystąpić na początku). Tak więc nazwy identyfikatorów to wszelkie ciągi znaków, które spełniają powyższy warunek &ndash; w tym także nasze słówko <code>delete</code>.</p>
<p>Za to identyfikatory to:</p>
<pre>Identifier ::
        IdentifierName <strong>but not</strong> ReservedWord</pre>
<p>Czyli identyfikatorem zmiennej (12.2 &ndash; identyfikator zmiennej to Indentifier) nie może być nasze słowo <code>delete</code>, czy <code>var</code> (to w kontekście <a href="http://ferrante.pl/2010/12/21/quiz-javascript/">JavaScriptowego Quizu</a>, który opublikował dzisiaj Damian Wielgosik). To zrozumiałe, bo inaczej moglibyśmy napisać:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> <span style="color: #003366; font-weight: bold;">var</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">;</span></pre></div></div>

<p>I powinno mieć to jakieś znaczenie.</p>
<h2>Identyfikatory w literałach obiektów</h2>
<p>Wiemy już, że mamy dwie grupy &ndash; identyfikatory oraz identyfikatory plus zarezerwowane słowa, czyli nazwy identyfikatorów. Teraz pora na meritum. Z czego składają się literały obiektów (11.1.5)?</p>
<pre>ObjectLiteral :
      { }
      { PropertyNameAndValueList }
      { PropertyNameAndValueList , }
PropertyNameAndValueList :
      PropertyAssignment
      PropertyNameAndValueList , PropertyAssignment
PropertyAssignment :
      PropertyName : AssignmentExpression
      get PropertyName ( ) { FunctionBody }
      set PropertyName ( PropertySetParameterList ) { FunctionBody }
PropertyName :
      IdentifierName
      StringLiteral
      NumericLiteral
PropertySetParameterList :
      Identifier</pre>
<p>Przeanalizujmy to. Najpierw mamy literał obiektu (ObjectLiteral), który może być pusty, składać się z listy nazw właściwości i wartości, bądź listy nazw właściwości i wartości zakończonej przecinkiem (tutaj błąd IE6/7/8).</p>
<p>Następnie mamy konstrukcję, która jest &#8222;joinem&#8221; par nazwa właściwości i wartość oddzielonych przecinkami.</p>
<p>Następnie PropertyAssignment składa się z setera i getera oraz <code>PropertyName : AssignmentExpression</code>. Zaś PropertyName to&#8230; Tadam &ndash; IdentifierName, StringLiteral, NumericLiteral.</p>
<p>Jak już wiemy nazwy identyfikatorów zawierają również słowa kluczowe. Tak więc konstrukcja:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">delete</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'eee?'</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Powinna działać, a w Operze 10.63 i z tego co się dowiedziałem również najnowszej Operze 11 wyrzuca błąd:</p>
<pre>&gt;&gt;&gt; var obj = { delete: 'wtf' };
...
Syntax error at line 1 :
var obj = { delete: 'wtf' };
------------^
expected '}', got keyword 'delete'</pre>
<p>Identycznie zachowuje się dla pozostałych słów z grupy słów kluczowych. Tak więc jest to jednak błąd.</p>
<p>Nie będę tego już tutaj dowodził, ale dostęp do właściwości obiektu (11.2.1) również zezwala na użycie słów kluczowych po kropce, tak więc poprawną konstrukcją jest:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">obj.<span style="color: #000066; font-weight: bold;">delete</span><span style="color: #339933;">;</span></pre></div></div>

<p>Co Opera również uznaje za błąd.</p>
<p>Co ciekawe błąd (bądź nieścisłość) znalazłem też w <a href="https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words">Mozilla Developer Center</a>.</p>
<p>Również Safari nie jest wolne od błędu ze słowami kluczowymi. Nie mogę teraz sprawdzić, ale wydaje mi się, że słowo <code>class</code> narobiło mi ostatnio problemów. Kontekst był identyczny jak w przypadku Opery.</p>
<h2>Wnioski</h2>
<p>Mam nadzieję, że się nie pomyliłem nigdzie :) Czytanie specyfikacji proste nie jest i jeśli tak się zdarzyło, że coś namotałem proszę o komentarze.</p>
<p>Tak więc jeśli jesteśmy pewni, że piszemy kod jedynie pod Google Chrome, bądź Firefoksa, to możemy używać w obiektach jako nazw właściwości dowolnych ciągów, ponieważ tak mówi specyfikacja. Niestety to rzadki przywilej, chyba że piszemy np. aplikacje desktopowe, serwerowe, bądź jesteśmy Google. Lepiej więc wystrzegać się wszelkich słów kluczowych &ndash; włącznie z tymi zarezerwowanymi na przyszłość.</p>
<p>Jednocześnie należy pamiętać, że żadne słowo kluczowe nie może być nazwą zmiennej. Choć to akurat jest prostsze do zapamiętania. Tutaj również warto wystrzegać się słów kluczowych zarezerwowanych z myślą o przyszłości.</p>
<p class="image_credits">Zdjęcie autorstwa: <a href="http://www.flickr.com/photos/christopherpeterson/">David Ortez</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</title>
		<link>http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/</link>
		<comments>http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 17:56:24 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[obiektowy javascript]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[standard]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=597</guid>
		<description><![CDATA[autor: Bernt Rostad&#8217;s JavaScript, mimo swojej pozornej prostoty, jest językiem o wielkich możliwościach. Przykładem tego są choćby biblioteki jakie w nim powstały &#8211; prototype, MooTools, czy jQuery. Moim zdaniem jego najważniejszą cechą jest elastyczność, która warunkuje (i warunkowana jest przez) wiele składowych &#8211; niezliczona ilość sposobów tworzenia obiektów, możliwość rozbudowywania już istniejących (nawet wbudowanych) oraz [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2011/01/08/delegacja-i-funkcje-generyczne-w-javascript/' rel='bookmark' title='Delegacja i funkcje generyczne w JavaScript'>Delegacja i funkcje generyczne w JavaScript</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin-left: 15px;"><img src="http://code42.pl/wp-content/uploads/protected-grail.jpg" alt="Piwo Holy Grail"/> autor: <a href="http://www.flickr.com/photos/brostad/">Bernt Rostad&#8217;s</a></p>
<p>JavaScript, mimo swojej pozornej prostoty, jest językiem o wielkich możliwościach. Przykładem tego są choćby biblioteki jakie w nim powstały &ndash; <a href="http://www.prototypejs.org/">prototype</a>, <a href="http://mootools.net/">MooTools</a>, czy <a href="http://jquery.com/">jQuery</a>. Moim zdaniem jego najważniejszą cechą jest elastyczność, która warunkuje (i warunkowana jest przez) wiele składowych &ndash; niezliczona ilość sposobów  <a href="http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/">tworzenia obiektów</a>, możliwość rozbudowywania już istniejących (nawet wbudowanych) oraz ich modyfikacji, operowania funkcjami, kontekstem, literały, scope, domknięcia, itd, itd. Dzięki tym cechom w JavaScriptcie, nawet mimo jego niecodziennemu paradygmatowi dziedziczenia prototypowego, można zapisać niemal każdą konstrukcję jaka w tych czasach jest możliwa do osiągnięcia w popularnych językach. Czy aby na pewno?</p>
<p>Otóż, nie. I jedną z najbardziej drażniących mnie w JavaScriptcie rzeczy jest brak modyfikatorów dostępu do właściwości obiektu. Rzecz jasna można uzyskać <a href="http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/#h-elementy-programowania-obiektowego">właściwości prywatne</a>, jednak właściwości chronionych, najbardziej potrzebnych w wielu przypadkach, nie sposób wystrugać. Dla ścisłości &ndash; przez właściwość chronioną (protected) mam na myśli taką, która jest niedostępna z zewnątrz, jednakże w przypadku dziedziczenia dostępna jest dla klas pochodnych. Np (ależby było pięknie):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Parent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">protected</span> <span style="color: #003366; font-weight: bold;">var</span> secured <span style="color: #339933;">=</span> <span style="color: #3366CC;">'haha'</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//byłoby pięknie :)</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Parent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">secured</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; undefined</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> Child <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getSecured</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> secured<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Child.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Parent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Child<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getSecured</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'haha'</span></pre></div></div>

<p><span id="more-597"></span></p>
<p>Ktoś może powiedzieć, że po prostu są niepotrzebne. Że nie umiem programować w tym paradygmacie. Możliwe. Nie znam stanowiska <a href="http://www.crockford.com/">Douglasa Crockforda</a> i żałuję że go o to nie spytałem (a miałem taką możliwość dzięki konferencji <a href="http://front-trends.com/">Front-Trends 2010</a> &ndash; przy okazji &ndash; <a href="http://ferrante.pl">Damian</a> organizuje już następną <a href="http://falsyvalues.com/teaser/">Falsy Values</a> (jak zawsze świetna nazwa :)). Domyślam się jednak, że on również uważa, że dostępne możliwości są wystarczające.</p>
<p>Mi jednak nigdy nie wystarczały. Może i z powodu niewiedzy oraz przyzwyczajeń, ale fakt jest faktem i kombinować trzeba. Podjąłem kilka prób, z czego jedna z nich zachowała się nawet na <a href="https://github.com/Reinmar/ideas/blob/master/klass/test1.html">Githubie</a> i wygląda obiecująco. Nie mam jednak czasu jej dokończyć. Poza tym to zawsze będą tylko marne atrapy, które gdzieś ograniczać będą tę wychwalaną przeze mnie elastyczność języka.</p>
<h2>ECMAScript 5 na pomoc</h2>
<p>Nim jednak o samym ES5, kilka słów o jego poprzedniku ES4. W latach kiedy jeszcze nie interesowałem się JavaScriptem na tyle by zagłębiać się w kwestie jego rozwoju, trwały prace nad czwartą wersją standardu. Niewiele już potrafię znaleźć informacji o pracach komitetu, który ma wyjątkowo zagmatwaną stronę i strukturę. Mogę się też mylić w kilku kwestiach, bo podczas wyszukiwania tych informacji czułem się jak archeolog. W każdym razie najciekawszym dokumentem jest <a href="http://www.ecmascript.org/es4/spec/overview.pdf">ECMAScript 4<sup>th</sup> Edition &#8211; Language Overview</a>. Już po szybkim rzucie oka na jego zawartość widać, że zmiany miały być przełomowe. Klasy, dziedziczenie klasowe, interfejsy, kontrola typów, definicje typów, szablony, przestrzenie nazw, pakiety, więcej konstrukcji zaczerpniętych z języków funkcyjnych (lokalny scope (let), lambdy, wielokrotne zwracane wartości), generatory, iteratory, strict mode i wiele, wiele innych (nawet typ liczbowy związany z pieniędzmi). A wszystko to przy zachowaniu dotychczasowych możliwości. Moim zdaniem, jeśli standard nie zostałby zepsuty na etapie implementacji, to JavaScript byłby bliski mojemu ideałowi.</p>
<p>Historia potoczyła się jednak inaczej. Teoria spiskowa mówi, że Microsoft wstrzymał prace komitetu, ponieważ nie chciał dopuścić do zbytniego rozwoju JavaScriptu wobec rozwijanych przez siebie technologii. Nie mi oceniać czy to prawda, w każdym razie projekt został porzucony (<a href="http://ejohn.org/blog/ecmascript-harmony/">trochę szczegółów</a>). W tej chwili z listy funkcjonalności, które wymieniłem dostępnych jest w Firefoksie tylko kilka, aczkolwiek są to ciekawe rzeczy. Zostały one zawarte w czymś co nazwano <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7">JavaScript 1.7</a> i <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8">JavaScript 1.8</a>.</p>
<p>Z popiołów ES4 wykluła się piąta wersja standardu, która rok temu została zatwierdzona (w tej chwili kończona jest wersja ES5.1 zawierająca poprawki). Wraz z nadejściem <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8.5">Firefoksa 4</a> wprowadzone przez nią funkcjonalności będą dostępne na zadowalającym poziomie  w minimum trzech przeglądarkach (w Chrome&#8217;ie już zostały udostępnione, tak samo chyba w Operze 11), a według trochę wątpliwego (brak wspomnienia o ważnym strict mode) <a href="http://samples.msdn.microsoft.com/ietestcenter/#javascript">IE Test Center</a> nawet w czterech. Można więc uznać, że standard został pomyślnie wdrożony.</p>
<h2>Dwie twarze nowego standardu</h2>
<p>Zaznaczam od razu, że to co napiszę poniżej jest jedynie moją opinią i w dodatku dość świeżą, ponieważ nie dane mi było jeszcze dokładnie przemyśleć część możliwości jakie daje ECMAScript 5. Jest jednak kilka, których wpływ na język jest dla mnie jasny. Są to natywny obiekt <code>JSON</code>, strict mode poprawiających niezliczoną ilość niedociągnięć JavaScriptu oraz metody <code>Function.prototype.bind()</code>, <code>Object.keys()</code> i związane z tablicami (<code>Array.isArray()</code>, czy <code>Array.forEach()</code>). Nie będę się rozpisywał na ten temat &ndash; polecam <a href="http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/">artykuł Johna Resiga</a> oraz odświeżony Mozilla Developer Center (<a href="https://developer.mozilla.org/en/JavaScript/Strict_mode" title="Strict mode">tu</a>, <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys" title="Object.keys()">tu</a>, <a href="https://developer.mozilla.org/En/Using_native_JSON" title="native JSON">tu</a> i <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array" title="Array">tu</a>). Z jednej strony to mało, szczególnie porównując to z listą, którą zamieściłem wcześniej, z drugiej strict mode sam w sobie jest przełomowy. Niby zmienia mało zauważalne zachowania, ale przyczynia się do ogromnej poprawy jakości kodu pisanego w JavaScriptcie.</p>
<p>Jednocześnie ECMAScript 5 wprowadza wiele rzeczy, co do których jestem przekonany słabiej bądź w stopniu wręcz ujemnym. Większość z nich znajduje się na liście <a href="https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.8.5">nowych funkcjonalności w JavaScript 1.8.5</a> oraz w <a href="http://ejohn.org/blog/ecmascript-5-objects-and-properties/">drugim artykule Johna Resiga</a>. W skrócie &ndash; są to metody i konstrukcje rozszerzające możliwości obiektów. I o ile konstrukcje <a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/get">getterów</a> i <a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/set">setterów</a> uważam za przyzwoite, a nawet bardzo ciekawe, to rozwinięcie możliwości obiektów, co jest drugą częścią standardu, uważam za co najmniej brzydkie i dodatkowo mało przydatne.</p>
<p>W wielkim skrócie w tej chwili zyskujemy możliwość zamykania i zamrażania obiektów. Dodatkowo możemy zmieniać cechy ich atrybutów (czy są wyliczane podczas pracy z <code>for in</code>, modyfikowalne oraz czy ich cechy można zmieniać). Wszystko to prowadzi do sytuacji kiedy możemy tworzyć tzw. domoidy, czyli obiekty, które będą zachowywały się jak <a href="http://ajaxian.com/archives/ecmascript-5-changes-to-javascript">natywne DOMowe</a>. Wszystko spoko, fajnie mieć takie możliwości, ale nie jest to killer feature jak niektórzy twierdzą. I nawet jeśli już wpadnie mi do głowy, że mogę zablokować możliwość zmiany wartości właściwości obiektu, to&#8230; to jest ohydne:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Object.<span style="color: #660066;">defineProperty</span><span style="color: #009900;">&#40;</span>obj<span style="color: #339933;">,</span> <span style="color: #3366CC;">'value'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
	value<span style="color: #339933;">:</span> <span style="color: #3366CC;">'something'</span><span style="color: #339933;">,</span>
	writable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
	enumerable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
	configurable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nie jestem też przekonany co do doboru domyślnych wartości tych cech &ndash; wszystkie są równie <code>false</code> (tak więc w powyższym przykładzie możemy pominąć <code>writable: false</code>). Wszystkie metody które zostały wprowadzone do edycji cech atrybutów są tak samo toporne. Autorzy pomysłów czerpali chyba z pierwszej części nazwy języka JavaScript. Wydaje mi się, że postąpiono tak ze względu na wsteczną zgodność. Uważam, że mniejszym złem byłoby jednak wprowadzenie równolegle cukru składniowego (polskie określenie jest jak zawsze drętwe :), bo te metody okaleczają język. Pocieszający jest fakt, że według starego <a href="http://ejohn.org/blog/ecmascript-harmony/">artykułu Johna Resiga o ECMAScript Harmony</a> jest to tylko wstęp do głębszych zmian:</p>
<blockquote><p>This means a couple things: First, you can forget a lot of what you learned about ECMAScript 4, previously. Many of the complicated concepts contained in the language have been tossed. Instead there is a considerable amount of effort going in to making sure that new features will be easily duplicable through other means.</p>
<p>For example, ECMAScript 3.1 provides a new method – called Object.freeze() – which allows you to pass in an object and “freeze” it, preventing it from being modified any further. This is a subset of the functionality that is needed to implement classes in ECMAScript 4 (classes are immutable).</p>
</blockquote>
<h2>Święty Graal</h2>
<p><img src="http://code42.pl/wp-content/uploads/protected-kitten.jpg" alt="Kitten"/></p>
<p>To by było na tyle wstępu :). Pora przejść do meritum tego wpisu. Kiedy pierwszy raz usłyszałem o cechach <code>writable</code> i <code>enumerable</code>, to pomyślałem, że jestem zbawiony. Właściwość będzie nieedytowalna i &#8222;niewyświetlalna&#8221; z &#8222;zewnątrz&#8221;, a ze &#8222;środka&#8221; będę mógł nią operować. Nic bardziej mylnego &ndash; z dość oczywistych powodów atrybut ten jest niezmienialny z każdego punktu. Bo jak odróżnić w JavaScriptcie &#8222;środek&#8221; od &#8222;zewnątrz&#8221;?</p>
<p>Trochę więc się podłamałem. Tyle nowych możliwości, ale właściwości chronionej obiektu, który może stać się pełnoprawnym prototypem swojego potomka nie da się uzyskać. W zasadzie jestem podłamany dalej, jednak kilka dni temu myśląc o getterach i setterach wpadłem na pewien pomysł. Od razu zaznaczam, że prawdopodobnie i tak nic nie wyjdzie z tej próby :). Że jest brzydka i nie wiem jeszcze czy da się opakować w coś ładniejszego. Że nie wiem też czy próba pozwala na kolejne dziedziczenie. W każdym razie. <a href="http://pacman.mulabs.org/ts/protected.js">Proof of concept właściwości chronionej w JavaScriptcie</a>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #3366CC;">&quot;use strict&quot;</span><span style="color: #339933;">;</span>
&nbsp;
Object.<span style="color: #660066;">extend</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>obj_orig<span style="color: #339933;">,</span> obj_new<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> obj_new<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> g <span style="color: #339933;">=</span> obj_new.__lookupGetter__<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			s <span style="color: #339933;">=</span> obj_new.__lookupSetter__<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>g <span style="color: #339933;">||</span> s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>g<span style="color: #009900;">&#41;</span>
                obj_orig.__defineGetter__<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> g<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span>
                obj_orig.__defineSetter__<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> s<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span>
             obj_orig<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> obj_new<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> obj_orig<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
Object.<span style="color: #660066;">clone</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> Object.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> obj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> Animal <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> species<span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> age<span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> constructor <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		species <span style="color: #339933;">=</span> s<span style="color: #339933;">;</span>
		age <span style="color: #339933;">=</span> a<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	constructor<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getSpecies</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> species<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getAge</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> age<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sayHello</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'Hello'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.__access <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		get species<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">return</span> species<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		set species<span style="color: #009900;">&#40;</span>val<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			species <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		get age<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">return</span> age<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		set age<span style="color: #009900;">&#40;</span>val<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			age <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		<span style="color: #003366; font-weight: bold;">super</span><span style="color: #339933;">:</span> constructor
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> Kitten <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> parent <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Animal<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> that <span style="color: #339933;">=</span> Object.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>
		Object.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>
			Object.<span style="color: #660066;">clone</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> parent.__access
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> parent
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//clone this?</span>
	Object.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> parent<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	that.<span style="color: #003366; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Kitten'</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">setAge</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>val<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		that.<span style="color: #660066;">age</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">killedByGod</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		that.<span style="color: #660066;">age</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Who cares? It<span style="color: #000099; font-weight: bold;">\'</span>s dead.'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Kitten.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Animal<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//for the instanceof purpose only</span></pre></td></tr></table></div>

<p>Oraz użycie:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> animal <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Animal<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Dog'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'animal.age: '</span> <span style="color: #339933;">+</span> animal.<span style="color: #660066;">age</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; undefined</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'animal.getSpecies(): '</span> <span style="color: #339933;">+</span> animal.<span style="color: #660066;">getSpecies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'Dog'</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> kitten <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Kitten<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0.5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten.getSpecies(): '</span> <span style="color: #339933;">+</span> kitten.<span style="color: #660066;">getSpecies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'Kitten'</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten.getAge(): '</span> <span style="color: #339933;">+</span> kitten.<span style="color: #660066;">getAge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 0.5</span>
kitten.<span style="color: #660066;">setAge</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten.getAge(): '</span> <span style="color: #339933;">+</span> kitten.<span style="color: #660066;">getAge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 1</span>
&nbsp;
kitten.<span style="color: #660066;">killedByGod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten.getAge(): '</span> <span style="color: #339933;">+</span> kitten.<span style="color: #660066;">getAge</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; 'who cares?'</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten.age: '</span> <span style="color: #339933;">+</span> kitten.<span style="color: #660066;">age</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//-&gt; undefined</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'kitten instanceof Animal: '</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>kitten <span style="color: #000066; font-weight: bold;">instanceof</span> Animal<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Przykład działania w Google Chrome:</p>
<p><a href="http://code42.pl/wp-content/uploads/protected-result.png"><img src="http://code42.pl/wp-content/uploads/protected-result.png" alt="Przykład działania powyższego programu w Chrome"/></a></p>
<p>Co o tym sądzicie? Da się coś wystrugać?</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2011/01/08/delegacja-i-funkcje-generyczne-w-javascript/' rel='bookmark' title='Delegacja i funkcje generyczne w JavaScript'>Delegacja i funkcje generyczne w JavaScript</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</title>
		<link>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/</link>
		<comments>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 13:21:06 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[obiektowy javascript]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=456</guid>
		<description><![CDATA[Opublikowane na licencji CC przez Trufflepig. Do tego czteroczęściowego (jak zapowiem, to może napiszę :) artykułu natchnęło mnie szkolenie z zaawansowanego JavaScriptu które, w miniony weekend, zorganizował we Wrocławiu Damian Ferrante Wielgosik. Już na początku chciałbym mu podziękować za wiedzę, którą się podzielił, ponieważ przed szkoleniem byłbym wstanie napisać tylko część tego artykułu. JavaScript to [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
<li><a href='http://code42.pl/2011/01/08/delegacja-i-funkcje-generyczne-w-javascript/' rel='bookmark' title='Delegacja i funkcje generyczne w JavaScript'>Delegacja i funkcje generyczne w JavaScript</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p class="top_img" style="text-align:right"><img src="http://pacman.mulabs.org/ts/oojs-1.jpg" alt="Gąsienica" style="display:block; margin-left:auto" />Opublikowane na licencji CC przez <a href="http://www.flickr.com/photos/trufflepig/">Trufflepig</a>.</p>
<p>Do tego czteroczęściowego (jak zapowiem, to może napiszę :) artykułu natchnęło mnie szkolenie z zaawansowanego JavaScriptu które, w miniony weekend, zorganizował we Wrocławiu <a href="http://ferrante.pl/">Damian Ferrante Wielgosik</a>. Już na początku chciałbym mu podziękować za wiedzę, którą się podzielił, ponieważ przed szkoleniem byłbym wstanie napisać tylko część tego artykułu.</p>
<h2>JavaScript to dziwoląg</h2>
<p>Tego nie da się ukryć. JavaScript należy do wąskiej grupy języków z rodziny <a href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScriptu</a> (JS, <a href="http://en.wikipedia.org/wiki/ActionScript">ActionScript</a>, <a href="http://en.wikipedia.org/wiki/E4X">E4X</a>), którą cechuje to, że ich obiektowość oparta jest na <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">prototypach</a>. Oznacza to, że w JavaScriptcie nie istnieje pojęcie klasy. Nie oznacza to jednak tego, że w JavaScriptcie nie da się programować obiektowo z wykorzystaniem np. konkretyzacji, dziedziczenia, czy właściwości prywatnych. Da się. Co więcej &mdash; da się uzyskać dużo więcej funkcjonalności klasycznego języka obiektowego, choć, o czym na sam koniec, niekoniecznie jest po co.</p>
<h2>Obiekt</h2>
<p>W języku z obiektowością klasową wypada zacząć od definicji klasy. Tak przynajmniej zaczynali autorzy książek, które czytałem. W przypadku JavaScriptu mielibyśmy jednak pewien problem, bo klas tutaj nie ma. Trzeba więc zacząć od utworzenia obiektu. Oto najprostszy:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">typeof</span> obj<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;object&quot;</span></pre></div></div>

<p><span id="more-456"></span></p>
<p>Tak, to w JavaScriptcie jest najprostszy obiekt. Zadeklarowany w przykładzie jest pusty i dziedziczy po obiekcie <code>Object</code>. Możemy sprawdzić to za pomocą poniższego kodu (jak działa i co to znaczy, o tym później):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.__count__<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 0, działa tylko w Firefoksie</span>
obj.__proto__.<span style="color: #660066;">constructor</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object()</span></pre></div></div>

<p>Obiekt możemy również utworzyć za pomocą konstruktora <code>Object()</code>. Nie jest to jednak sposób polecany, ponieważ&#8230; zmienną <code>Object</code> można nadpisać. Lepiej pozostać przy literałach obiektów, które są bezpieczniejsze i ładniejsze.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Object<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object</span>
Object <span style="color: #339933;">=</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj2 <span style="color: #339933;">=</span> Object<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt;  TypeError: Object is not a constructor</span></pre></div></div>

<h2>Właściwości obiektu</h2>
<p>Nic nam jednak z pustego obiektu. Pora dodać do niego dane i metody. Możemy skorzystać ze składni literału obiektu:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	text<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Jestem obiektem'</span><span style="color: #339933;">,</span>
	saySth<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bądź stworzyć pusty obiekt i dodać mu właściwości:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Jestem obiektem'</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">saySth</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W obu przypadkach efekt będzie ten sam. Kiedy wywołamy <code>obj.saySth();</code> dostaniemy alerta z tekstem <q>Jestem obiektem</q>.</p>
<p>Jeszcze słowo wtrącenia o literałach. Trzeba uważać na przecinek po ostatniej właściwości. Firefox i chyba wszystkie normalne przeglądarki trzymają się specyfikacji <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">ECMAScript 5  pkt 11.1.5</a> (bądź to specyfikacja trzyma się tych przeglądarek ;), a kochany IE6, który zawsze musi być inny (&#8222;inny nie znaczy gorszy&#8221; w tym wypadku nie działa ;) trzyma się specyfikacji <a href="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf">ECMAScript 3 pkt 11.1.5</a>. Tak więc przecinek po ostatniej właściwości zostanie zaakceptowany przez przeglądarki z rodziny normalnych, zaś IE6 wywali cichaczem błąd. Nie wiem co prawda jak sprawa wygląda w IE7 i IE8, ale radzę po prostu tego przecinka nie stawiać. Koniec dygresji.</p>
<p>W Javie, czy PHP metoda obiektu jest czymś zupełnie innym niż jego właściwość. W JavaScriptcie metoda jest po prostu funkcją przypisaną do właściwości obiektu. Widać to najlepiej w trzeciej linii ostatniego przykładu: <code>obj.saySth = function () {};</code>. Wynika to z tego, że w JavaScriptcie funkcja też jest obiektem. Dzięki temu możemy ją przypisywać do zmiennych, zwracać w innych funkcjach, czy&#8230; wywoływać na niej metody. Ta właściwość JavaScriptu jest naprawdę potężna i myślę, że język ten sporo teraz zyskał w oczach osób lubiących Rubiego, Pythona, czy jakiś język funkcyjny :).</p>
<h3 id="h-uwaga-na-this">Uwaga na <code>this</code></h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">typeof</span> obj.<span style="color: #660066;">saySth</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function&quot;</span>
<span style="color: #003366; font-weight: bold;">var</span> sayNothing <span style="color: #339933;">=</span> obj.<span style="color: #660066;">saySth</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">typeof</span> sayNothing<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function&quot;</span>
sayNothing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert undefined</span></pre></div></div>

<p>Z pierwszych trzech linii widać, że możemy sobie dowolnie operować funkcją. Czwarta może być zaskoczeniem. Dlaczego <code>this.text === undefined</code>? Zauważcie, że funkcja <code>sayNothing</code> nie została wywołana w kontekście obiektu <code>obj</code>, tylko w kontekście&#8230; no właśnie &mdash; czego? Żeby to sprawdzić dodajmy dwie linie kodu do poprzednich przykładów:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Jestem globalnym scopem'</span><span style="color: #339933;">;</span>
sayNothing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert &quot;Jestem globalnym scopem&quot;</span></pre></div></div>

<p>Teraz widać, że funkcja <code>sayNothing();</code> wywołana jest w globalnym kontekście. Możemy ją także wywołać w odpowiednim kontekście używając metody <code>call()</code> działającej na funkcji (tak jak pisałem wcześniej &mdash; funkcja też jest obiektem, więc ma też swoje metody):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">sayNothing.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert &quot;Jestem obiektem&quot;</span></pre></div></div>

<p>Więcej na ten temat u Ferrante w <a href="http://ferrante.pl/2010/02/02/this-w-javascript/">&#8222;this&#8221; w JavaScript</a>.</p>
<h3>Jeszcze trochę o obiektach</h3>
<p>Do właściwości obiektu możemy się również dostać za pomocą operatora <code>[]</code>, czyli w taki sposób jak do elementów tablicy. Jest to przydatne kiedy chcemy uzyskać właściwość, której nazwa trzymana jest w zmiennej:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> a<span style="color: #339933;">:</span> <span style="color: #3366CC;">'A'</span><span style="color: #339933;">,</span> b<span style="color: #339933;">:</span> <span style="color: #3366CC;">'B'</span><span style="color: #339933;">,</span> m<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'M'</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
obj<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;A&quot;</span>
<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'b'</span><span style="color: #339933;">;</span>
obj<span style="color: #009900;">&#91;</span><span style="color: #000066;">name</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;B&quot;</span>
obj<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'m'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;M&quot;</span></pre></div></div>

<p>Po właściwościach obiektu można też iterować za pomocą konstrukcji <code>for (i in obj)</code>. Trzeba jednak uważać, bo, w zależności od tego jakim obiektem dysponujemy, możemy dostać niespodziewane (przynajmniej na razie) rezultaty. Póki co jednak wystarczy nam:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> a<span style="color: #339933;">:</span> <span style="color: #3366CC;">'A'</span><span style="color: #339933;">,</span> b<span style="color: #339933;">:</span> <span style="color: #3366CC;">'B'</span><span style="color: #339933;">,</span> c<span style="color: #339933;">:</span> <span style="color: #3366CC;">'C'</span><span style="color: #339933;">,</span> d<span style="color: #339933;">:</span> <span style="color: #3366CC;">'D'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #000066; font-weight: bold;">in</span> obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'obj['</span> <span style="color: #339933;">+</span> i <span style="color: #339933;">+</span> <span style="color: #3366CC;">'] = '</span> <span style="color: #339933;">+</span> obj<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Obiekty można też zagłębiać. Jest to własność oczywista, ale wypada dla jasności o niej wspomnieć.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	obj<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		obj<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
			hidden<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Zonk'</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">obj</span>.<span style="color: #660066;">obj</span>.<span style="color: #660066;">hidden</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;Zonk&quot;</span></pre></div></div>

<h2>Co dalej?</h2>
<p>Samym obiektem programista żyć nie może. Klas jednak w JavaScripcie nie uświadczymy, trzeba więc wymyślić coś innego. Z pomocą przyjdą nam konstruktory obiektów, ale zrobią to dopiero w następnej części :).</p>
<p>Poza tym w trzeciej części mam zamiar napisać o prototypach, czyli JavaScriptowym dziedziczeniu. W czwartej chciałbym zebrać wszystko do kupy, pokazać może jakieś wzorce i napisać kilka uwag o programowaniu w JavaScriptcie. W zasadzie to uwagi mam już napisane, bo zacząłem od końca :D.</p>
<p><ins>Druga część wpisu &ndash; <a href="http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/">Obiektowy JavaScript cz.2. &ndash; klasa sama w sobie</a></ins>.</p>
<p>Artykuł został także opublikowany na moim <a href="http://blog.koszulinski.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/">prywatnym blogu</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
<li><a href='http://code42.pl/2011/01/08/delegacja-i-funkcje-generyczne-w-javascript/' rel='bookmark' title='Delegacja i funkcje generyczne w JavaScript'>Delegacja i funkcje generyczne w JavaScript</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

