Smazaný obsah Přidaný obsah
{{Možná hledáte|programovací jazyk Java}}
wikifikace
Řádek 24:
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 efekty obrázků.
 
Jeho [[Syntaxe (programovací jazyk)|syntaxe]] (zápis [[Zdrojový kód|zdrojového textu]]) patří do rodiny jazyků [[C (programovací jazyk)|C]]/[[C++]]/[[Java (programovací jazyk)|Java]]. Ale JavaScript je od těchto jazyků zásadně odlišný, [[Sémantika programovacích jazyků|sémanticky]] (funkčně, pricipiálně) jde o jiný jazyk. Slovo Java je součástí jeho názvu pouze z marketingových důvodů. JavaScript byl v červenci [[1997]] standardizován asociací [[Ecma International|ECMA]] (European Computer Manufacturers Association) a v srpnu [[1998]] [[Mezinárodní organizace pro normalizaci|ISO]] (International Organization for Standardization). Standardizovaná verze JavaScriptu je pojmenována [[ECMAScript]] a z ní byly odvozeny i 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 prosinci 1995 jako doplněk k jazykům [[HyperText Markup Language|HTML]] a [[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 [[Internet]]u (tzv. na straně klienta), na rozdíl od ostatních jiných interpretovaných programovacích jazyků (např. [[PHP]] a [[Active Server Pages|ASP]]), které se spouštějí na straně [[server]]u ještě před stažením z Internetu. Z toho plynou jistá bezpečností omezení, JavaScript např. nemůže pracovat se soubory, aby tím neohrozil soukromí uživatele.
 
JavaScript je možné použít i 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 (javascriptový engine)|Rhino]], [[gcj]], [[Node.js]] a [[Apache HTTP Server|Apache]].
 
Kromě [[DHTML]] se JavaScript používá k psaní rozšíření pro mnohé aplikace, například [[Adobe Acrobat]].
Řádek 41:
==== 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é <codett>x</codett> 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 [[ObjektInstance (programování)třídy|objektu]] otestovat.
 
==== Objekty jako asociativní pole (objects as associative fields) ====
 
JavaScript je převážně objektově založený. Objekty jsou asociativními [[polePole (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: <codett>obj.x = 10</codett> a&nbsp;<codett>obj[“x“"x"] = 10</codett> 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í <codett>for…infor … in</codett> 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) ====
Řádek 54:
==== 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]]y a&nbsp;[[Funkce (programování)Podprogram|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í zavolá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 [[closureUzávěr (programování)|closures]]s – uzávěry.
 
=== Prototypové (prototype-based) ===
==== Prototypy (Prototypes) ====
 
Přestože JavaScript nedisponuje klasickým konceptem třída-instancetří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]]y 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 <codett>this</codett>. 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 <codett>Auto</codett>:
 
<source lang="JavaScript">
Řádek 87:
==== 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 <codett>this</codett>.
 
==== Dědičnost (Inheritance) ====
Řádek 93:
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 <codett>auto</codett>, v&nbsp;objektu je vložená také metoda <codett>vypisZnacku()</codett>. Technicky má v&nbsp;paměti každá instance této „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 105:
</source><br />
 
Systém dědičnosti nadřazených a podřazených tříd sice v JS neexistuje, ale pomocí prototypů ji lze úspěšně simulovat. Celý princip dědění spočívá v tvorbě nových prototypů. Máme-li třídu <codett>VesmirnyObjekt</codett>, třídu <codett>Planeta</codett> podřídíme tím, že přiřadíme konstruktoru planeta jako prototyp objekt <codett>VesmirnyObjekt</codett>:
<source lang="JavaScript">
function VesmirnyObjekt(soustava) {
Řádek 131:
==== 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 <codett>try</codett>, <codett>catch</codett> a&nbsp;volitelně <codett>finally</codett>. 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 148 ⟶ 149:
}
</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á [[Mozilla|Mozillou]]<ref>http://asmjs.org/ Homepage (anglicky)</ref>, která je určena pro výrazné zrychlení běhu javascriptových [[Aplikační software|aplikací]], podobně jako technologie NaCl a&nbsp;jazyk Dart od Google. Rychlost v současné době dosahuje na hodnoty jen asi o &nbsp;50% nižší, než kód generovaný [[překladač]]i<ref>{{Citace elektronického periodika
|periodikum příjmení1 = LinuxJelínek
| Expressjméno1 = Lukáš
|příjmení titul = JelínekAsm.js zrychluje
|jméno vydavatel = Lukášlinuxexpres.cz
| datum_vydání = 2013-12-23
| url = http://www.linuxexpres.cz/novinky/asm-js-zrychluje
| datum_přístupu = 2018-05-18}}</ref>, zejména původně napsaných pro hry z&nbsp;oblasti PC<ref>http://www.cnews.cz/epic-games-ve-spolupraci-s-mozillou-v-prohlizeci-zprovoznil-unreal-engine-4{{Citace Epicelektronického Games ve spolupráci s&nbsp;Mozillou v&nbsp;prohlížeči zprovoznil Unreal Engine&nbsp;4 (česky)periodika
| příjmení1 = Urban
</ref>, typicky napsané v&nbsp;jazyce [[C (programovací jazyk)|C]] nebo [[C++]].
| jméno1 = Petr
| titul = Epic Games ve spolupráci s Mozillou v prohlížeči zprovoznil Unreal Engine 4
| periodikum = Cnews.cz
| datum_vydání = 2014-03-13
| url = https://www.cnews.cz/epic-games-ve-spolupraci-s-mozillou-v-prohlizeci-zprovoznil-unreal-engine-4/
| datum_přístupu = 2018-05-18}}</ref>, typicky napsané v&nbsp;jazyce [[C (programovací jazyk)|C]] nebo [[C++]].
 
Prohlížeče, které tuto podmnožinu JavaScriptu podporují, jsou v&nbsp;současné době, [[Mozilla Firefox]], [[Google Chrome]], [[Opera (webový prohlížeč)|Opera]] a [[Microsoft Edge|Microsoft&nbsp;Edge]].<ref>{{Citace elektronického periodika
| autor1 = mbest
| titul = Chrome and Opera Optimize for Mozilla-Pioneered Asm.js
| periodikum = Future Releases
| url = https://blog.mozilla.org/futurereleases/2013/11/26/chrome-and-opera-optimize-for-mozilla-pioneered-asm-js/
| Chromedatum_přístupu and= Opera Optimize for Mozilla2018-Pioneered05-18
| Asm.jsjazyk = (anglicky)}}</ref><ref>http://www.linuxexpres.cz/novinky/asm-js-zrychluje Asm.js zrychluje (česky)
</ref><ref>{{Citace elektronického periodika
</ref><ref>https://blog.mozilla.org/luke/2015/02/18/microsoft-announces-asm-js-optimizations/ Microsoft announces asm.js optimizations</ref><ref>https://blogs.windows.com/msedgedev/2015/11/16/introducing-edgehtml-13-our-first-platform-update-for-microsoft-edge/ Introducing EdgeHTML 13, our first platform update for Microsoft Edge</ref>
| titul = Microsoft announces asm.js optimizations
| periodikum = Luke Wagner's Blog
| vydavatel = [[Mozilla Firefox]]
| datum_vydání = 2015-02-18
| url = https://blog.mozilla.org/luke/2015/02/18/microsoft-announces-asm-js-optimizations/
| datum_přístupu = 2018-05-18
| jazyk = anglicky}}</ref><ref>{{Citace elektronického periodika
| příjmení1 = Pflug
| jméno1 = Kyle
| titul = Introducing EdgeHTML 13, our first platform update for Microsoft Edge
| periodikum = [[Microsoft Windows]]
| datum_vydání = 2015-11-16
| url = https://blogs.windows.com/msedgedev/2015/11/16/introducing-edgehtml-13-our-first-platform-update-for-microsoft-edge/
| datum_přístupu = 2018-05-18
| jazyk = anglicky}}</ref>
 
== Podpora JavaScriptu ve webových prohlížečích ==
[[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 % (celosvětový průměr), od 0,25 % v&nbsp;Brazílii po 2 % v&nbsp;USA.<ref>[http://www.searchenginepeople.com/blog/stats-no-javascript.html{{Citace elektronického periodika
| příjmení1 = Hein
| jméno1 = Ruud
| titul = How Many Users Have JavaScript Disabled]</ref>
| vydavatel = searchenginepeople.com
| datum_vydání = 2010-12-14
| url = https://www.searchenginepeople.com/blog/stats-no-javascript.html
| datum_přístupu = 2018-05-18
| jazyk = anglicky}}</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.
Řádek 213 ⟶ 257:
 
=== Vestavěný scriptovací jazyk ===
* Většina rozšíření pro webové prohlížeče jsou implementováná použitím JavaScriptu, např. rozšíření [[Google Chrome|Chrome]], [[Safari (webový prohlížeč)|Safari]], [[Opera]] atd.
* Některé NoSQL datábáze jako je [[MongoDB]] nebo [[CouchDB]] akceptují dotazy napsané v JavaScriptu.
* [[Adobe Acrobat#Security|Acrobat and Adobe Reader]] podporují JavaScript v souborech typu PDF.
Řádek 221 ⟶ 265:
* Digitální software Apple Logic Pro X audio workstation umožňuje vytvořit vlastní MIDI efekty pluginy pomocí JavaScriptu.
* ECMAScript byl zahrnut v normě VRML97 pro skriptování uzlů souborů VRML.
* Herní engine [[Unity (herní engine)|Unity 3D]] podporuje upravenou verzi JavaScriptu pro skriptování pomocí Mono.<ref>{{Citace elektronické monografie
| url=http://unity3d.com/unity/workflow/scripting
| titul=Unity Scripting
Řádek 235 ⟶ 279:
* Maxwell Render poskytuje skriptovací engine ECMA standardu pro automatizaci úkolů.<ref>THINK! The Maxwell Render Resourcer Center, [http://think.maxwellrender.com/scripting_references-269.html Scripting References]</ref>
* Google Apps Script v tabulkách Google a Google Sites umožňuje uživatelům vytvářet vlastní vzorce, automatizovat opakující se úlohy a také komunikovat s ostatními produkty [[Google]] jako je [[Gmail]]. <ref>Google Apps Script, [http://www.google.com/google-d-s/scripts/scripts.html Welcome to Google Apps Script]</ref>
* Mnoho klientů [[Internet Relay Chat|IRC]], jako je ChatZille nebo XChat, používají JavaScript pro jejich scriptovací činnosti.
* Produkty SpinetiX používají SpiderMonkey JavaScript pro scriptování v SVG souborech.
 
=== Skriptovací engine ===
* Technologie Active Scripting od [[Microsoft]]u podporuje [[JavaScript]] jako skriptovací jazyk.<ref name="VersionInformation">{{Citace elektronické monografie | url=http://msdn.microsoft.com/en-us/library/s4esdbwz(v=VS.94).aspx | titul=Version Information (JavaScript) | vydavatel=Msdn.microsoft.com | datum přístupu=2013-05-26}}</ref>
* Programovací jazyk [[Java (programovací jazyk)|Java]] v 6. verzi představil balíček <tt>javax.script</tt>, který obsahuje implementaci JavaScriptového enginu [[Rhino (javascriptový engine)|Rhino]]. Java aplikace tak mohou hostit skripty, které přistupují k proměnným a objektům této aplikace, stejně jako webové prohlížeče, kde skripty mohou přistupovat k [[DOMDocument Object Model|objektovému modelu dokumentu]] webové stránky. <ref>{{Citace elektronické monografie | url=http://java.sun.com/javase/6/webnotes/index.html#scripting | titul=javax.script release notes | vydavatel=Java.sun.com | datum přístupu=2009-05-19}}</ref>
* Nástroj [[Qt (knihovna)|Qt]] C++ obsahuje modul <tt>QtScript</tt>, který interpretuje [[JavaScript]] stejně jako Java balíček <tt>javax.script</tt>.<ref>Nokia Corporation, [http://doc.qt.nokia.com/4.6/qtscript.html QtScript Module]</ref>
 
== Vývojové nástroje ==
Vzhledem k tomu, že při programování pro různé webové prohlížeče mohou nastat implementační rozdíly (zvláště v &nbsp;[[DOMDocument Object Model|objektovém modelu dokumentu]]), je vhodné mít přístup k [[debugger]]u v každém webovém prohlížeči, na které je aplikace zaměřena.<ref>{{Citace elektronické monografie | url=http://www.alistapart.com/articles/advanced-debugging-with-javascript/ | titul=Advanced Debugging With JavaScript | vydavatel=alistapart.com | datum vydání=2009-02-03 | datum přístupu=2010-05-28}}</ref>
 
Debuggery jsou dostupné pro [[Internet Explorer]], [[Mozilla Firefox|Firefox]], [[Safari (webový prohlížeč)|Safari]], [[Google Chrome]], [[Opera]] a [[Node.js]].<ref>{{Citace elektronické monografie | url=http://javascript.about.com/od/problemsolving/ig/JavaScript-Debugging/ | titul=The JavaScript Debugging Console | vydavatel=javascript.about.com | datum vydání=2010-05-28 | datum přístupu=2010-05-28}}</ref><ref>{{Citace elektronické monografie | url=http://www.javascript-debugger.com | titul=SplineTech JavaScript Debugger - an independent standalone JavaScript Debugger | vydavatel=javascript-debugger.com | datum vydání=2013-08-26 | datum přístupu=2013-08-26}}</ref><ref>{{Citace elektronické monografie | url=http://docs.strongloop.com/display/DOC/Debugging+with+Node+Inspector | titul=Debugging with Node Inspector | vydavatel=http://docs.strongloop.com/ | datum přístupu=2014-05-07}}</ref>
 
== Odkazy ==