JavaScript

**JavaScript** on Netscape'i loodud objektorienteeritud programmeerimiskeel, mida peamiselt kasutatakse koos HTML'i ja CSS'iga, et veebisaite teha. JavaScript on ECMAScripti standardiga defineeritud keele ülemhulk.

Hoolimata nimest pole JavaScriptil kuigi palju ühist Javaga. Mõlemad keeled jagavad küll C-st pärit süntaksit ja on objektorienteeritud, kuid nende erinevused on suuremad kui sarnasused.

## Ajalugu

JavaScripti lõi Brendan Eich Netscape'is. Algselt kandis keel nimetust Mocha, siis LiveScript ja lõpuks JavaScript. Esimene JavaScripti toega veebibrauser oli 1995. aasta septembris välja lastud Netscape Navigator 2.0 (siis veel LiveScript). 1996. aasta augustis lisas Microsoft JavaScriptiga ühilduva keele JScript veebibrauserisse Internet Explorer 3.0.

JavaScripti standardiseeris Ecma International 1997. aasta juunis nime ECMAScript all. ECMAScript keskendub vaid keeleomadustele, aga JavaScript lisaks ka veebikeskkonnale.

Aastal 2010 on JavaScripti versiooniks 1.8.1. Viimastel aastatel on saanud JavaScripti areng uue tõuke tänu Ajax tehnoloogia tähelepanu saamisega.

## Ülevaade

Paljud peavad JavaScripti ülilihtsaks keeleks, mille abil saab lehele väikseid efekte lisada. Tegelikult pakub JavaScript laialdasi võimalusi väheste, kuid võimsate keelevahenditega.

* Keel on läbivalt objektorienteeritud: peaaegu kõik andmetüübid (numbrid, stringid, massiivid, funktsioonid) on objektid.
* Keeles on vaid üks numbriline andmetüüp: 64 bitine ujukomaarv. Täisarvutüüp puudub.
* Puuduvad klassid, objektide konstrueerimine ja ka pärilikkus toimub prototüüpide põhjal kasutades konstruktorfunktsioone.
* Objektid on lihtsad nimi-väärtus paaride kogud nagu Perli ja Ruby paisktabelid või Pythoni sõnaraamatud.
* Toetatud on kõrgemat järku funktsioonid ja sulundid.
* Puudub sisendi ja väljundi kontseptsioon, sest skriptimiskeelena on mõeldud jooksma teiste programmide sees.

Kõige laialdasemalt kasutatakse JavaScripti veebilehtedel. Seda peetakse koguni maailma populaarseimaks programmeerimiskeeleks. Kuid brauserid pole JavaScripti ainuke keskkond.

Väljaspool veebi on JavaScript kasutusel näiteks Adobe Readeris (JavaScript PDF-failides) ja Adobe Photoshopis. Arendamisel on OpenOffice.org-i makrode kirjutamise võimalus JavaScriptiga. Iga rakendus pakub enda sisseehitatud objekte, mille abil saab operatsioone teha (brauserites on selline objekt window).

## Süntaks

JavaScripti süntaks pärineb suuresti C-st, millest on üle võetud if- ja switch-tingimuslaused, for- ja while-tsüklid ja -operaatorid. Javast pärinevad throw- ja try-catch-konstruktsioonid erindite viskamiseks ja püüdmiseks.

### Hello world

Hello world on programm, mis avab dialoogiakna:


```javascript
alert("Hello world");
```


Alternatiivne variant, mis kirjutab teksti otse veebilehele:


```javascript
document.write("Hello world");
```


### Objektid ja massiivid

Massiivide loomiseks saab kasutada eraldi literaali:


```javascript
var myArray = [2, 3, 5, 7, 11];
```


Samuti objektide jaoks:


```javascript
var myObject = {name: "John", age: 15};
```


Nii massiivide kui ka harilike objektide liikmetele pääseb ligi C-st tuttava konstruktsiooniga:


```javascript
myArray[1]; // tagastab 3
myObject["name"]; // tagastab "John"
```


Lisaks saab nimekujulistele liikmetele ligi punkt-notatsiooniga:


```javascript
myObject.name; // tagastab "John"
myArray.length; // tagastab 5 (massiivi pikkuse)
```


JavaScripti objektide ja massiivide süntaksil põhineb JSON (*JavaScript Object Notation*) andmevahetusvorming, mida kasutatakse ohtralt koos Ajaxiga.

### Funktsioonid

Funktsioone luuakse funktsiooniliteraali abil:


```javascript
function factorial(n) {
    if (n > 1) {
        return n * factorial(n-1);
    } else {
        return 1;
    }
}
```


Funktsioonile saab panna nime, nagu näites on tehtud, kuid saab kasutada ka anonüümseid funktsioone. Viimaseid on hea anda parameetritena kõrgemat järku funktsioonidele. Näiteks järgmise koodiga sorteeritakse massiivi kasutades võrdlemiseks anonüümset funktsiooni:


```javascript
[4,7,1,3,6].sort(function(a, b) {
    return a > b ? 1 : (a < b ? -1 : 0);
});
```


Üks levinud anonüümsete funktsioonide kasutus on kohalike muutujate globaalsesse nimeruumi sattumise vältimine. Selleks mähitakse kogu kood ühe suure anonüümse funktsiooni sisse, mis kohe käivitatakse:


```javascript
(function(){
    // ...kogu kood siia...
})();
```


### Konstruktorfunktsioonid ja prototüübid

Kui on vaja luua mitu sarnaste omadustega objekti, luuakse esmalt konstruktorfunktsioon, mille prototype atribuut määrab ära loodavate objektide jagatud tunnused:


```javascript
function Person(name) {
    this.name = name;
}
Person.prototype = {
    greet: function(person) {
        alert("Hello " + person.name + ", my name is " + this.name);
    }
};
```


Seejärel saab new-operaatori abil luua objekte, mis viitavad konstruktorfunktsiooni Person prototüübile:


```javascript
var john = new Person("John");
var mary = new Person("Mary");
john.greet(mary); // väljastab: Hello Mary, my name is John
mary.greet(john); // väljastab: Hello John, my name is Mary
```


Siiani näeb kõik välja nagu klassipõhises objektorienteeritud programmeerimises. Kuid Person pole siiski klass, vaid hoopis dünaamilisem kooslus. Näiteks võime Personi prototüüpi jooksvalt täiendada ning kõik muudatused kajastuvad automaatselt selle konstruktoriga loodud objektides:


```javascript
Person.prototype.age = 25;
john.age; // tagastab: 25
mary.age; // tagastab: 25
```


Objektid aga võivad prototüübis defineeritud välju üle kirjutada:


```javascript
john.age = 82;
john.age; // nüüd 82
mary.age; // endiselt 25
Person.prototype.age; // endiselt 25
```


Või luua uusi välju:


```javascript
john.nationality = "Estonian";
john.nationality; // tagastab: "Estonian"
mary.nationality; // tagastab: undefined
```


### Kaasamine veebilehele

JavaScripti kaasamiseks HTML-dokumenti kasutatakse -elementi:


```html
<script type="text/javascript">
  document.write('Terekest!');
</script>
```


Alternatiivne variant on linkida -elemendi abil eraldi JavaScripti faili:


```html
<script type="text/javascript" src="script.js"></script>
```


Enamasti kaasatakse JavaScript lehele tavalise lähtekoodi kujul. Mahukamaid faile minimeeritakse, et vähendada allalaaditavat andmehulka ja kiirendada veebilehe laadimist.

Mitte kõik brauserid ei toeta JavaScripti ja ka nendel, mis toetavad, saab selle välja lülitada. Kuna pole garanteeritud, et leheküljel olev JavaScript lehe avanedes käivitub, saab kasutada JavaScripti nii, et see üksnes täiustab ilma JavaScriptitagi toimivat lehekülge.

## Turvalisus

Sageli lülitavad kasutajad brauseril JavaScripti toe välja. Seda tehakse peamiselt turvalisuse pärast. Veebilbrauser lubab skriptile küll õige vähe. Muuhulgas keelab see kohalikule kettale ligipääsu, väliste koodide käivitamise, ligipääsu dokumentidele, mis ei asu samas serveris, ligipääsu külastatud lehtede nimekirjale (selle hoolimata lubab eelnevalt külastatud lehtedele tagasi suunata), kõvakettalt faili üleslaadimist, kui kasutaja ise ei ole failinime esitanud, ja sulgeda akent, mida pole avanud Javascripti (selleks küsitakse kasutajalt luba).

## Silumine

Arendamisel tekivad tavaliselt raskused erinevate brauserite toega. Tihti ei puuduta see keeleomadusi, vaid väljendub erinevate objektide omaduste ja funktsioonide näol. Programmeerimise hõlbustamiseks on välja töötatud mitmesuguseid silumisvahendeid:
*Firefox: Lisa Firebug ja vanem Venkman.
*Internet Explorer: Microsoft Script Debugger. Lisaks aitab kaasa ka Internet Explorer Developer Toolbar.
*Opera: Dragonfly (sisseehitatud).
*Safari: Web Inspector (sisseehitatud).
*Google Chrome: Developer tools (sisseehitatud).

## Viited

## Välislingid

* JavaScriptist
* Jaagup Kippari koostatud õppematerjal
* Peter-Paul Koch'i koduleht, kus muuhulgas on teemaks JavaScript
* Simon Willison'i lühiloengu slaidid
* Ülikontsentreeritud süntaksi kokkuvõte
* W3C kooli JavaScripti käsiraamat 
* Mozilla pakutav dokumentatsioon
* Objektorienteeritust lahtiseletav veebileht