Pređi na sadržaj

JavaScript

S Vikipedije, slobodne enciklopedije
Javaskript
Snimak ekrana Javaskript izvornog koda
Originalni nazivengl. JavaScript
Izgovara seDžavaskript ili Javaskript
Modelskriptni, objektno-orijentisani (prototipni), imperativni, funkcionalni i vođen događajima
Pojavio se4. decembar 1995.; pre 29 godina (1995-12-04)[1]
Autor(i)Brendan Ajk
Dizajner(i)Netskejp, Mozila Fondacija, Ecma International
Aktuelna verzijaECMAScript 2016[2]
Datum aktuelne verzije17. jun 2016.; pre 8 godina (2016-06-17)
Sistem tipovadinamički
ImplementacijeV8, JavaskriptKor, SpiderMonkey, Chakra
UticajiLua, Scheme, Perl, Self, Java, Se, Pajton, AWK, HyperTalk
Uticao naActionScript, AtScript, CoffeeScript, Dart, JScript .NET, LiveScript, Objective-J, Opa, Perl 6, QML, TypeScript,
Veb-sajthttps://developer.mozilla.org/en-US/docs/Web/JavaScript

Javaskript ili Džavaskript (engl. JavaScript) je dinamičan, slabo tipiziran i interpretiran programski jezik visokog nivoa. Standardizovan je po EKMASkript specifikaciji jezika. Pored HTML-a i CSS-a, Javaskript je jedna od tri vodeće tehnologije za definisanje sadržaja na Vebu; većina veb-sajtova koristi Javaskript a svi moderni veb-čitači ga podržavaju bez potrebe za instaliranjem dodataka. Kombinovan sa HTML jezikom i CSS-om Javaskript čini DHTML (Dynamic HTML).[3] Javaskript je jezik zasnovan na prototipovima sa funkcijama prvog reda, što ga čini jezikom višestruke paradigme koji podržava objektno-orijentisani,[4] imperativni i funkcionalni način programiranja. Sadrži API za rad sa tekstom, nizovima, datumima i regularnim izrazima, ali ne i ulazno/izlazne funkcionalnosti, kao što su povezivanje, skladištenje podataka ili grafičke funkcionalnosti, za šta se oslanja na okruženje u kome se izvršava.

Iako se na prvi pogled može reći da Javaskript ima određene sličnosti sa programskim jezikom Java, kao što su naziv, sintaksa i standardne biblioteke, oni su dva potpuno različita programska jezika koja se značajno razlikuju u svom dizajnu. Na programski jezik Javaskript najviše su uticali jezici kao što su Self i Scheme.[5] Javaskript se pored Veba koristi i u drugim okruženjima, kao što su PDF dokumenti, Veb-čitači za specifične veb-sajtove (engl. site-specific browsers) i desktop vidžeti (engl. widget). Nove i znatno brže Javaskript virtuelne mašine i platforme zasnovane na njima, popularizovale su Javaskript za izradu veb aplikacija na serverskoj strani. Na klijentskoj strani, programeri najčešće implementiraju Javaskript kao interpretirani jezik, ali sve više novijih veb-čitača obavlja just-in-time kompajliranje. Javaskript se još koristi i za razvoj video igara, desktop i mobilnih aplikacija kao i u mrežnom programiranju na serverskoj strani sa izvršnim okruženjima kao što je Node.js.

JS pripada OO paradigmi, jer programer ne definiše samo tip podataka, nego i vrstu operacija (funkcija) koje se mogu primeniti na strukture podataka. Na ovaj način, struktura podataka postaje objekat koji uključuje i podatke i funkcije. Pored toga, programeri mogu da prave odnose između jednog i drugog objekta. Na primer, objekti mogu da naslede karakteristike od drugih objekata.[3] Skriptni je jezik, jer se sastoji od serije komandi koje se očitavaju u interpreteru, a da se prethodno ne kompajlira sadržaj. Odnosno ne prevodi se u mašinski jezik, nego se komande direktno „čitaju” iz koda (izvornog koda ili bajtovskog koda). Zbog ove karakteristike JavaScript se izvršava na strani korisnika (client side), tj. na računaru na kojem je pokrenut sadržaj sa Javaskriptom. Sam po sebi, HTML dozvoljava posetiocu da pošalje podatke ka serveru na obradu. Nažalost, ako ti podaci nisu validni ceo proces se mora ponoviti sve dok se ne unesu validni podaci. Ovo je jedan od osnovnih razloga nastanka Javaskripta koji proverava verodostojnost podataka na klijentovom pregledaču i tako olakšava posao na vebu.[3]

Javaskript je najpopularniji skriptni jezik na Internetu kojeg podržavaju svi poznatiji pregledači (Internet Explorer, Mozilla Firefox, Netscape, Opera, Safari). Neke primene JS su:

  • Javaskript daje HTML dizajnerima alat za programiranje - HTML autori obično nisu programeri, ali Javaskript je skriptni jezik sa veoma jednostavnom sintaksom.
  • Javaskript može da dinamički unese kod u HTML stranu,
  • Javaskript može da reaguje na događaje - Javaskript može da se podesi tako da se izvrši kad se nešto desi, npr. kad se strana učita ili kad korisnik klikne na HTML element,
  • Javaskript može da pročita ili ispiše HTML elemente - Javaskript može da pročita i da promeni sadržaj HTML elementa,
  • Javaskript može da se koristi za proveru ispravnosti unetih podataka - Javaskript može da se koristi za proveru ispravnosti podataka unetih u formu, da proveri ispravnost podataka pre nego što se pošalju serveru,
  • Javaskript može da se koristi za detektovanje brauzera korisnika - u zavisnosti od brauzera, učitava se strana specijalno dizajnirana za taj brauzer,
  • Javaskript može da se koristi za kreiranje kukija - Javaskript može da se koristi za čuvanje i vraćanje informacija o računaru posetioca, itd.

Istorijat

[uredi | uredi izvor]

Počeci u Netskejpu

[uredi | uredi izvor]

Godine 1993, Nacionalni centar za superkompjuterske aplikacije (engl. National Center for Supercomputing Applications - NCSA), koji je deo Univerziteta u Ilinoisu, objavio je Mozaik, prvi popularni grafički veb-čitač, koji je odigrao značajnu ulogu u razvoju Veba koji je u to vreme bio na samom začetku. 1994. godine u Mauntin Vjuu, u Kaliforniji, osnovana je kompanija pod nazivom Mozaik Komjunikejšn, koja je zaposlila većinu autora originalnog veb-čitača Mozaik kako bi razvili Mozaik Netskejp. Kasnije će se ispostaviti da ovaj veb-čitač neće imati nikakve sličnosti sa originalnim Mozaikom. Interni naziv za ovaj veb-čitač bio je "Mozila", što je značilo "ubica Mozaika" engl. Mosaic killer, jer je cilj kompanije bio da zameni Mozaik kao najpopularniji veb-čitač na svetu. Prva verzija veb-čitača, Mozaik Netskejp 0.9, objavljena je krajem 1994. godine. Za samo četiri meseca ovaj veb-čitač je već zauzeo tri četvrtine tržišta veb-čitača i postao je najpopularniji veb-čitač devedesetih godina 20. veka. Kako bi izbegli probleme sa autorskim pravima sa NCSA, veb-čitač je iste godine dobio nov naziv, Netskejp navigator, a kompanija Netskejp Komjunikejšn.

U ovoj kompaniji su na vreme shvatili da bi Veb trebalo da postane dinamičniji. Osnivač kompanije, Mark Andresen, tvrdio je da HTML-u treba prateći jezik koji veb dizajneri i programeri mogu lako da koriste za sklapanje komponenti kao što su slike i dodaci, čiji bi se kod pisao direktno u HTML kodu veb stranice. Kako bi uopšte započeli sa radom, kompanija Netskejp Komjunikejšn je morala da sarađuje sa kompanijom San Majkrosistems da bi u ovaj veb-čitač ugradili njihov statični programski jezik Javu i time se borili sa konkurentskom kompanijom Majkrosoft za veću naklonost korisnika i usvajanje veb tehnologija i platformi.[6] Odlučeno je da se kreira programski jezik komplementaran Javi, sa sličnom sintaksom, što je u startu značilo odbacivanje podrške za druge programske jezike kao što su Perl, Pajton, TCL ili Scheme. Kako bi odbranili ideju Javaskripta u odnosu na ponudu konkurenata, kompanije je bio potreban prototip. Ajk je napisao prototip budućeg programskog jezika za 10 dana, u maju 1995. godine.

Iako je razvijan pod kodnim nazivom Moka, jezik je zvanično nazvan Lajvskript prilikom prvog objavljivanja beta verzija Netskejp navigatora 2.0, septembra 1995. godine, ali je ubrzo preimenovan u Javaskript[1] sa objavljivanjem Netskejp navigatora 2.0 beta 3 verzije, u decembru iste godine.[7] Konačan izbor imena je izazvao konfuziju kod korisnika jer je stvoren utisak da je ovo još jedna varijanta programskog jezika Java, a sam izbor imena je okarakterisan kao marketinški trik Netskejpa kako bi se Javaskript predstavio kao najnoviji veb programski jezik.

Često se javlja pogrešno tumačenje da je na razvoj Javaskripta bitno uticao veb skriptni jezik C-- razvijen od strane kompanije Nombas (ovaj skriptni jezik ne treba mešati sa kasnije razvijenim jezikom C--, 1997. godine]).[8][9] U prilog tome ide i činjenica da Brendan Ajk nije nikad čuo za C-- pre nego što je kreirao LajvSkript.[10] Nombas je obezbeđivao ugrađene skriptne veb stranice Netskejpu, iako koncept skriptnih veb stranica nije bio nov, kao što se može videti u veb-čitaču ViolaWWW.[11] Kasnije je kompanija Nombas odlučila da u svom proizvodu SkriptIz, C-- zameni Javaskriptom i učestvovala je u standardizaciji EKMASkripta kroz TC39 grupu.[12]

Javaskript na serverskoj strani

[uredi | uredi izvor]

U decembru 1995. godine, ubrzo nakon objavljivanja Javaskripta za veb-čitače, kompanija Netskejp je predstavila i implementaciju ovog jezika za servere kroz Netskejp enterprajz server (engl. Netscape Enterprise Server).

Od sredine 2000-ih, objavljeno je nekoliko serverskih Javaskript implementacija, među kojima najpoznatiji Node.js (2009. godine).[13]

Prihvatanje Javaskripta od strane Majkrosofta

[uredi | uredi izvor]

Majkrosoft je 1996. godine predstavio svoje skriptne jezike, VBSkript i JSkript. JSkript, obrnuta implementacija Netskejpovog Javaskripta, bila je deo Internet Eksplorera 3. JSkript je takođe bio dostupan i kao serverska implementacija skriptnog jezika u Internet Informacionom Serveru. Internet Eksplorer 3 je po prvi put doneo podršku za CSS i različite HTML dodatke, ali se vodilo računa o tome da svaka implementacija bude značajno različita od one u Netskejp navigatoru.[14][15] Ove razlike su otežavale dizajnerima i programerima da prave veb-sajtove koji bi funkcionisali u oba veb-čitača, što je dovelo do pojave logoa "najbolji prikaz u Netskejpu" i "najbolji prikaz u Internet Eksploreru" koji su obeležili početne godine borbe među veb-čitačima.[16] Javaskript je počeo da stiče reputaciju prepreke višeplatformskom i standardizovanom Vebu. Programeri su se prihvatili zadatka da pokušaju da prave veb-sajtove koji će raditi u oba najpoznatija veb-čitača iako većina nije imala vremena za to.[14] Objavom Internet Eksplorera 4, Majkrosoft je predstavio koncept dinamičkog HTML-a, ali su razlike u implementaciji jezika i različiti vlasnički objektni modeli dokumenata predstavljali prepreke za širu primenu Javaskripta na Vebu.[14]

Standardizacija

[uredi | uredi izvor]

U novembru 1996. godine, Netskejp je standardizovao Javaskript kako bi ostale kompanije koje razvijaju veb-čitače mogle da ga implementiraju u svojim proizvodima. To je dovelo do zvaničnog objavljivanja specifikacije jezika EKMASkript koja je objavljena u prvoj verziji EKMA-262 standarda u junu 1997. godine, čija je najpoznatija implementacija upravo Javaskript. EkšnSkript i JSkript su takođe poznate implementacije EKMASkripta sa dodacima.

Proces standardizacije je nastavljen u ciklusima, objavljivanjem EKMASkripta 2 u junu 1998. godine, koji donosi određene promene kako bi se prilagodio ISO/IEC 16262 međunarodnom standardu. Sa objavljivanjem je nastavljeno u decembru 1999. godine sa EKMASkriptom 3, koji predstavlja osnovu za Javaskript kakav danas znamo. Razvoj originalnog EKMASkripta 4, koji je vodio Valdemar Horvat (tada zaposleni u Netskejpu, danas u Guglu), počeo je 2000. godine i na samom početku je izgledalo kao da Majkrosoft učestvuje u tome pa je čak i implementirao neke karakteristike u njihov JSkript .NET jezik.

Vremenom je bilo jasno da Majkrosoft ne namerava da sarađuje niti da implementira Javaskript u InternetEksploreru, iako nisu imali dostojnu alternativu već samo parcijalno završenu implementaciju .NET serverske strane. Zbog toga je do 2003. godine razvoj EKMASkripta 4 bio zapostavljen.

Sledeća bitna godina za Javaskript bila je 2005, koju su obeležila dva velika istorijska događaja bitna za razvoj Javaskripta. Prvo su se Brendan Ajk i Mozila pridružili EKMA Internašonal kao neprofitni članovi i započet je rad na EKMASkriptu za XML (E4X), EKMA-357 standardu, koji je potekao od Majkrosoftovih bivših zaposlenih koji su sad radili za BEA Sistems. To je dovelo do zajedničkog rada sa kompanijom Makromedija (koju je kasnije kupio Adobi Sistems), koji su primenili E4X u svom EkšnSkriptu 3 (EkšnSkript 3 je bio fork originalnog EKMASkripta 4).

Zajedno sa Makromedijom ponovo je otpočet razvoj EKMASkripta 4 sa ciljem standardizacije komponenti iz EkšnSkripta 3. Na kraju ovog procesa, Adobi Sistems je objavio EkšnSkript virtuelnu mašinu verzije 2, kodnog naziva Tamarin, kao projekat otvorenog koda. Međutim, Tamarin i EkšnSkript 3 su bili značajno različiti od onoga čemu Javaskript teži, što su obe strane uvidele tokom 2007. i 2008. godine.

Na tržištu je vladao haos među različitim igračima. Daglas Krokford, tada zaposleni u Jahu-u, udružio se sa Majkrosoftom 2007. godine kako bi se suprotstavio EKMASkript 4 standardu, što je dovelo do razvoja EKMASkript 3.1 standarda. Iako razvoj EKMASkript 4 standarda nikad nije dovršen, on je bitno uticao na naredne verzije.[17]

Dok se sve ovo dešavalo, zajednice otvorenog koda i programera su nastavile na razvoju revolucionarnih mogućnosti sa Javaskriptom. Napor zajednice je dobio zamajac 2005. godine kada je Džesi Džejms Garet osmislio koncept Ajaksa i opisao skup tehnologija, gde je oslonac bio na Javaskriptu, koje se koriste za kreiranje veb aplikacija kod kojih se podaci mogu učitavati u pozadini, bez potrebe da se cela stranica učita, što je dovelo do razvoja još dinamičnijih aplikacija. Sve ovo je dovelo do perioda preporoda u korišćenju Javaskripta, predvođenog bibliotekama otvorenog koda i zajednicama koje su se formirale oko njih, sa bibliotekama kao što su Prototajp, džejKveri, Dodžo Tulkit, MuTuls i druge.

U julu 2008. godine, razdvojene strane su se sastale u Oslu. To je dovelo do eventualnog dogovora početkom 2009. godine, da se EKMASkript 3.1 standard preimenuje u EKMASkript 5 i da se jezik unapredi prateći agendu poznatiju kao Harmoni (engl. Harmony). EKMASkript 5 je konačno objavljen u decembru 2009. godine.

U junu 2011. godine, EKMASkript 5.1 je objavljen kako bi se u potpunosti izjednačio sa trećim izdanjem ISO/IEC 16262 međunarodnog standarda. EKMASkript 2015 je objavljen u junu 2015. godine. Trenutna verzija EKMASkript 2016 je objavljena u junu 2016. godine.[18]

Kasniji razvoj

[uredi | uredi izvor]

Javaskript je postao jedan od najpopularnijih programskih jezika na Vebu. Međutim, na samom početku jezik nije bio na dobrom glasu među programerima profesionalcima, zbog toga što su mu, između ostalog, ciljna publika bili veb autori i ostali "amateri".[19] Sa pojavom Ajaksa Javaskript se vraća u centar pažnje i postaje atraktivan za sve više programera. Rezultat toga je umnožavanje obimnih frejmvorka i biblioteka, poboljšana Javaskript rutina programiranja i povećano korišćenje Javaskripta izvan veb-čitača, što je u direktnoj korelaciji sa značajnim razvojem serverskih Javaskript platformi.

U januaru 2009. godine, predstavljen je projekat KomonJS (engl. CommonJS) sa ciljem standardizacije zajedničkih biblioteka, uglavnom za Javaskript razvoj izvan veb-čitača.[20]

Sa porastom jednostraničnih aplikacija i naprednih Javaskript sajtova, povećano je njegovo korišćenje od strane kompajlera kako za dinamičke tako i za statičke programske jezike.

Zaštitni znak

[uredi | uredi izvor]

"Javaskript" je zaštitni znak Orakl korporacije.[21] Koristi se pod licencom za tehnologiju koju je osmislila i implementirala kompanija Netskejp Komjunikejšn i njeni naslednici kao što je Mozila fondacija.[22]

Karakteristike

[uredi | uredi izvor]

Navedene karakteristike su zajedničke za sve EKMASkript implementacije, osim ako nije eksplicitno drugačije navedeno.

Univerzalna podrška

[uredi | uredi izvor]

Svi moderni veb čitači podržavaju Javaskript sa ugrađenim interpreterima.

Imperativni i strukturirani

[uredi | uredi izvor]

Javaskript podržava veći deo strukturirane sintakse programskog jezika C (npr. if iskaze, while petlje, switch iskaze, do while petlje, i dr.). Delimičan izuzetak je opseg promenljivih: Javaskript je u originalu podržavao samo funkcionalni opseg promenljivih pomoću deklaracije var. EKMASkript 2015 donosi ključnu reč let za blokovski opseg, tako da sada Javaskript podržava funkcionalni i blokovski opseg. Kao i C, Javaskript pravi razliku između iskaza i izraza. Još jedna bitna razlika u odnosu na C je i automatsko umetanje kraja naredbe odnosno karaktera tačka-zarez, pa nije potrebno eksplicitno naglašavati kraj naredbe sa znakom tačka-zarez.[23]

Dinamični

[uredi | uredi izvor]
Kucanje
Kao i većina skriptnih jezika, Javaskript je jezik sa dinamičnom proverom kucanja; tip je povezan sa svakom vrednošću pre nego sa svakom izrazom. Na primer, ukoliko imamo neku promenljivu koja je vezana za broj, ta ista promenljiva kasnije može biti vezana za string.[24] Javaskript podržava različite načine provere tipa objekta.
Provera prilikom izvršavanja
Javaskript sadrži eval koja može da izvršava iskaze u obliku stringova u vreme izvršavanja.

Prototipni (objektno-orijentisani)

[uredi | uredi izvor]

Javaskript je skoro u potpunosti objektno zasnovan skriptni jezik. U Javaskriptu, objekat predstavlja asocijativni niz, naglašen pomoću prototipa; svaki ključ u obliku niza karaktera predstavlja naziv svojstva objekta za koji postoji dva sintaksna način za definisanje takvog naziva; notacija sa tačkom, engl. dot notation (obj.x = 10) i notacija sa zagradama, engl. bracket notation (obj['x'] = 10). Svojstvo se može dodati ili obrisati za vreme izvršavanja koda. Većina svojstava objekta (ili bilo kog svojstva koje pripada lancu nasleđivanja prototipa objekta) se može nabrojati korišćenjem for...in petlje. Javaskript sadrži ograničen broj ugrađenih objekata, kao što su Date i Function.

Prototipovi
Javaskript koristi prototipove u slučajevima u kojima drugi objektno-orijentisani programski jezici koriste klase za nasleđivanje.[25] Pomoću prototipova u Javaskriptu je moguće simulirate mnoge karakteristike klasa.[26]
Funkcije kao konstruktori objekata
Funkcije osim svoje glavne funkcije, imaju i ulogu konstruktora objekata. Dodavanjem prefiksa new ispred poziva funkcije, kreira novu instancu prototipa, nasleđujući svojstva i metode konstruktora (uključujući i svojstva Object prototipa).[27] EKMASkript 5 sadrži metodu Object.create, koja omogućava eksplicitno kreiranje instance bez automatskog nasleđivanja Object prototipa (starija okruženja mogu dodeljivati prototipu vrednost null).[28] Svojstvo prototype konstruktora određuje koji objekat se koristi kao interni prototip novog objekta. Nove metode se mogu dodati izmenom prototipa funkcije koja se koristi kao konstruktor. Konstruktori dostupni u samom Javaskriptu, kao što su Array i Object, takođe imaju svoje prototipove koji mogu da se izmene. Iako moguća, izmena Object prototipa nije dobra praksa zbog toga što većina objekata u Javaskriptu nasleđuje metode i svojstva iz Object prototipa i potencijalno ne očekuju njegovu izmenu.[29]
Funkcije kao metode
Za razliku od većine objektno-orijentisanih jezika, u Javaskriptu ne postoji razlika između definisanja funkcija i definisanja metoda. Najčešće, razlika postoji kod pozivanja funkcije; kada se funkcija poziva kao metoda objekta, njena lokalna ključna reč this se vezuje za taj objekat prilikom pozivanja.

Funkcionalni

[uredi | uredi izvor]

Funkcija je prve klase i može se tretirati kao objekat. Kao takva, funkcija može da sadrži svojstva i metode, kao što je .call() i .bind().[30] Ugnježdena funkcija je funkcija koja se definiše unutar druge funkcije. Ovakva funkcija se kreira svaki put kada se pozove nadređena funkcija. Dodatno, svaka nadređena funkcija formira leksički blok; Leksički blok nadređene funkcije (uključujući konstante, lokalne promenljive i vrednosti argumenata) postaju sastavni deo svakog objekta podređene funkcije, čak i nakon završetka izvršavanja nadređene funkcije.[31] Javaskript podržava i anonimne funkcije.

Delegirani

[uredi | uredi izvor]

Javaskript podržava implicitno i eksplicitno delegiranje.

Funkcije kao uloge (Traits i Mixins)
Javaskript podrazumevano podržava različite funkcije implementirane u vidu uloga (engl. Roles)[32] i paterna kao što su Traits[33][34] i Mixins.[35] Ovakva funkcija definiše dodatno ponašanje barem jedne metode vezane za ključnu reč this unutar tela funkcije. Uloga se nakon toga eksplicitno dodeljuje pomoću call ili apply naredbe objektima koji treba da sadrže dodatno ponašanje koje se ne deli kroz lanac prototipova.
Kompozicija objekata i nasleđivanje
Iako eksplicitna delegacija zasnovana na funkcijama pokriva kompoziciju objekata u JavaSkript-u, implicitna delegacija se već obavlja svaki put kada se lanac prototipova proširuje kako bi, npr. pronašli metodu koja je potencijalno povezana ali ne i u direktnoj vezi sa objektom. Kada se metoda jednom pronađe, ona se poziva u kontekstu objekta. Na ovaj način je nasleđivanje u JavaSkrupt-u pokriveno automatizmom delegacije koji se vezuje za svojstva prototipa u okviru funkcija u konstruktoru.

Ostale karakteristike

[uredi | uredi izvor]
Izvršno okruženje
JavaSkript se najčešće oslanja na izvršno okruženje (npr. Veb pretraživač) kak obi obezbedilo objekte i metode pomoću kojih skripte vrše interakciju sa okruženjem (npr. Objektni model dokumenta veb stranice). Takođe se na izvršno okruženje oslanja i da bi obezbedili mogućnost uključivanja skripti (npr. pomoću HTML script elementa). Ovo nije osobina samog programskog jezika, iako je zajednička karakteristika mnogih JavaSkript implementacija.
JavaSkript obrađuje poruke iz reda jednu po jednu. Pre nego što učita novu poruku, JavaSkript poziva funkciju vezanu za ovu poruku, čime se kreira okvir pozivnog steka (argumenti funkcije i lokalne promenljive). Pozivni stek se širi i raste u zavisnosti od potreba funkcije. Pre samog izvršavanja funkcije, kada je stek prazan, JavaSkript nastavlja sa obradom sledeće poruke u redu. To se još naziva i petljom događaja (engl. event loop) i opisuje kao "skok na završetak" jer je svaka poruka u potpunosti obrađena pre nego što se u obzir uzme sledeća poruka. Bez obzira na to, model konkurentnosti programskog jezika definiše da petlja događaja ne blokira samo izvršavanje: ulazno/izlazne operacije programa se odvijaju putem događaja i povratnih funkcija. To znači, na primer, da JavaSkript može da obradi klik mišem dok čeka da upit nad bazom podataka vrati traženu informaciju.[36]
Varijativne funkcije
Funkciji može biti prosleđen neograničen broj argumenata. Funkcija im pristupa putem formalnih parametara ili kroz lokalni arguments objekat. Varijativne funkcije se takođe mogu kreirati i pomoću bind metode.
Niz i literali objekata
Kao i kod mnogih programskih jezika, nizovi i objekti (asocijativni nizovi u drugim jezicima) se mogu kreirati pomoću skraćene sintakse. Zapravo, ovi literali formiraju bazu JSON formata podataka.
Regularni izrazi
JavaSkript takođe podržava regularne izraze na način sličan onome u programskom jeziku Perl, koji pruža preciznu i snažnu sintaksu za manipulaciju tekstom koja je dosta naprednija od ugrađenih funkcija znakovnih nizova.[37]

Specifični dodaci proizvođača

[uredi | uredi izvor]

Razvojem JavaSkript programskog jezika upravlja Mozila Fondacija, dok se nove funkcionalnosti periodično dodaju jeziku. Međutim, samo određeni pokretači JavaSkript-a podržavaju ove nove funkcionalnosti:

  • geter i seter funkcije (podržavaju ih Veb-kit, Gecko, Opera[38], ActionScript i Rhino)[39]
  • uslovne catch klauzule
  • protokol iteratora (preuzeto iz Pajtona)
  • površni generatori-potprogrami (preuzeto iz Pajtona)
  • proširivanje nizova i generator izraza (preuzeto iz Pajtona)
  • odgovarajući opseg bloka pomoću ključne reči let
  • uništavanje nizova i objekata (ograničen oblik slaganja obrasca)
  • precizni izrazi funkcija (function(args) expr)
  • ECMAScript za XML (E4X), dodatak koji omogućava podrazumevanu XML podršku za ECMAScript (nije podržano u Mozila Fajerfoksu od verzije 21[40])

Vanila Javaskript

[uredi | uredi izvor]

Pojam Vanila Javaskript ili Vanila JS se odnosi na Javaskript koji nije proširen nekim frejmvorkom ili dodatnim bibliotekama. Skript napisan Vanila Javaskriptom je čist Javaskript kod.

Strukture podataka

[uredi | uredi izvor]

Primitivni tipovi

[uredi | uredi izvor]

Brojevi: sve vrednosti su predstavljene kao realni brojevi (64 bita, IEEE 754 standard). U slučaju prekoračenja (overflow) generiše se +/- Infinity.[41] U slučaju potkoračenja (underflow) generiše se 0/ "negative zero". Deljenje nulom ne rezultira greškom osim u slučaju 0/0 – tada se generiše NaN. Infinity i NaN su globalne promenljive koje se mogu samo čitati.

Stringovi su nepromenljive sekvence 16-bitnih vrednosti, uglavnom Unikodnih karaktera i moraju biti pod dvostrukim ili jednostrukim navodnicima ("string", '123str45', "vise reci", ...). Takođe, bitno je zapamtiti da indeksi kreću od nule, a ne od jedinice.[41] String može sadržati i HTML kodove, kao i sledeće specijalne tekst oznake:

  • \t - tabulator
  • \n - nova linija
  • \r - povratak na početak reda
  • \b - jedno slovo unazad
  • \f - form feed

Logički (bulov) tip: true/false.

Specijalne vrednosti

[uredi | uredi izvor]

null - predstavlja nedostajuću vrednost (jezička ključna reč);[41]
undefined - predstavlja nedostajuću vrednost (globalna promenljiva koja se može samo čitati); dobija se kao rezultat pristupa svojstvima ili elementima niza koji ne postoje ili kao rezultat funkcija koje nemaju return.[41] Ovo je možda malo zbunjujuće, ali bitno je zapamtiti da je undefined sam po sebi (nedefinisan) tip, a null je objekat.

Objekti

[uredi | uredi izvor]

Objekti su sve preostalo, odnosno, neuređena kolekcija imenovanih vrednosti (svojstava). Oni su dinamičke prirode i za razliku od primitivnih tipova prenose se po referenci, a ne po vrednosti. Svaki put kada se interpreter pokrene ili se učita nova strana u pregledaču, kreira se nešto što se zove globalni objekat i na nivou njega se definišu i inicijalizuju svojstva tipa undefined, NaN, globalne funkcije tipa isNaN(), parseInt(), konstruktori kao što su Date(), Array(), String(),..., globalni objekti ko što su Math, JSON,... Rezervisana reč kojom se u globalnom opsegu može referisati na ovaj objekat je this. Na nivou pregledača to je Vindous objekat koji se može referisati sa window.[41]

Neki bitniji objekti su:[41]

  • Funkcije - objekti koji sadrže kod koji treba izvršiti,
  • Array - nizovi, tj. uređena kolekcija numerisanih vrednosti,
  • Date - objekti za rad sa datumima i vremenom,
  • RegExp - objekat za rad sa regularnim izrazima i
  • Error - objekat koji predstavlja sintakse greške i greške u izvršavanju

Funkcije

[uredi | uredi izvor]

U programiranju se često dolazi u situaciju u kojoj se deo programa ponavlja na više različitih mesta. Postoji potreba da se taj deo programa izdvoji i da se poziva po potrebi. To se ostvaruje pomoću funkcija. Funkcije predstavljaju potprograme koji uglavnom vraćaju rezultat nekog izračunavanja. Vraćanje rezultata nije obavezno.[42] Da bi se koristila funkcija, ona se mora deklarisati. Deklaracija obavezno sadrži ključnu reč function. Posle nje se može navesti naziv funkcije, a onda obavezno zagrade unutar kojih se može navesti lista formalnih argumenata. Konačno, obavezno se navode vitičaste zagrade unutar kojih se može navesti telo funkcije, odnosno njene naredbe.[42]

  function nazivFunkcije(formalni parametri){
      ...naredbe unutar funkcije
      return rezultat;
  }

Minimalna deklaracija funkcije bi bila:[42]

  function() {}

Naredbe unutar funkcije se ne izvršavaju dok se funkcija ne pozove. Poziv funkcije se obavlja jednostavno navođenjem naziva funkcije i, obavezno, zagrada unutar kojih se može navesti lista argumenata.[42]

  nazivFunkcije(stvarni parametri)
Parametri funkcije
[uredi | uredi izvor]

Prilikom deklaracije funkcije može se navesti lista parametara. Lista parametara je obično spisak promenljivih.

  function zbir(a, b){
     var rezultat = a + b;
  }

U navedenom primeru a i b su lokalne promenljive u funkciji. Funkcija uzima prosleđene parametre, u ovom slučaju dva broja i vraća njihov zbir. Funkcija kao parametar može uzimati neke vrednosti ili reference na objekte. U programu mogu nesmetano postojati istoimene promenljive dokle god su u različitom lokalnom opsegu.[42]

Formalni parametri su oni koji se navode u deklaraciji funkcije i koji se koriste kada se piše telo funkcije. Stvarni argument su konkretne vrednosti koje se navode. Pri pozivu funkcije bitno je da parametri imaju vrednosti.

  zbir(5, 2);
  zbir(x, y*4);

U klasičnom programiranju važi da se stvarni i formalni parametri moraju poklopiti po broju, tipu i redosledu. Javaskript dozvoljava odstupanje od ovog pravila. To znači da je dozvoljeno da se navede više stvarnih argumenata nego što je predviđeno (vrednosti viškova se ignorišu), ili da ih ima manje (u funkciji će nedostajući parametri imati vrednost undefined). Pošto Javaskript nije strogo tipiziran jezik, ne postoji način da se programer natera da koristi tačno određene tipove pri pozivu funkcije. To što je ovakva praksa dozvoljena ne znači da je poželjna.[42]

Vrednost funkcije
[uredi | uredi izvor]

Unutar funkcije se na jednom ili više mesta može navesti naredba return, posle koje se navodi vrednost koja se vraća kao rezultat funkcije. Važno je naglasiti da čim se u izvršavanju funkcije naiđe na naredbu return, funkcija prekida sve i ostale naredbe će biti ignorisane.[42]

  function zbir(a, b){
    var rezultat = a + b;
    return rezultat;
  }

Vrednost funkcije se može koristiti unutar izraza.

  var p = zbir(a-10, zbir(c*2,b)/2);

Primer funkcije koja računa kvadrat broja

  function kvadratBroja(x){
     return x*x;
  } 
  ---
  x = kvadratBroja(5);   /* poziv funkcije */
  document.write("Kvadrat od 5 je " + x); //u HTML dokumentu ispisuje vrednost
  ---
  Kvadrat od 5 je 25

Nizovi

[uredi | uredi izvor]

Javaskript Array objekat je globalni objekat koji se koristi kao konstruktor za kreiranje nizova.[43]

 //kreiranje niza
 var niz=[1, 2, 3, "Soldier of fortune"];
 //ili
 var novi_niz=new Array(4, 5, "I can't make you love me");
  
 var n=niz.length; // u promenljivu n upisujemo dužinu niza
 var prvi=niz[0]; // prvi sadrži 1, tj. prvi element niza
 var poslednji=niz[niz.length-1]; //poslednji sadrži "Soldier of fortune", tj. poslednji element niza
  
 //for je kolekcijski
 niz.forEach(function (item index array)){
     console.log(item, index);
 }); 
 /*1 0
   2 1
   3 2
   "Soldier of fortune" 3*/
 
 //dodavanje elementa na kraj niza
 var kraj=niz.push("Tears in heaven"); // niz: [1, 2, 3, "Soldier of fortune", "Tears in heaven"]
 
 //brisanje elementa sa kraja niza
 var poslednji=niz1.pop(); //niz: [1, 2, 3, "Soldier of fortune"]
 
 //brisanje elementa sa pocetka niza
 var prvi=niz1.shift(); //niz: [2, 3, "Soldier of fortune"]
 
 //dodavanje na početak niza
 var novi_niz=niz1.unshift("Wish you were here"); //niz: ["Wish you were here", 2, 3, "Soldier of fortune"]
 
 //pronalaženje pozicije na kojoj se element nalazi
 var pozicija=niz1.indexOf(2); //1
 
 //brisanje elementa koji se nalazi na zadatoj poziciji
 var niz1_bez_dvojke=niz1.splice(pos, 1); //niz: ["Wish you were here", 3, "Soldier of fortune"]
 
 //pravljenje kopije niza
 var kopija=niz1.slice();
 
 //kreiranje višedimenzionih nizova
 var visedimenzioni_niz=[
 ["Ali", "sreca", "je", "uvek", "bila", "tamo"],
 ["gde", "je", "neko", "umeo", "da", "voli"],
 ["i", "ziveo", "za", "svoja", "osecanja"]];
 
 //pristupanje elementima
 var element=visedimenzioni_niz[1][5]; //"voli"
 var prvi_element=visedimenzioni_niz[0]; //["Ali", "sreca", "je", "uvek", "bila", "tamo"]
 
 //primer
 var vrednost=[];
 for (x=0; x<10; x++){
    vrednost.push([2**x, 2*x**2])
 };
 console.table(vrednost.join('\n'));
 /*"0,0
    1,2
    4,8
    9,18
    16,32
    25,50
    36,72
    49,98
    64,128
    81,162"*/

Sintaksa:

[element0, element1, ..., elementN]
new Array(element0, element1[, ...[, elemntN]])
new Array(duzinaNiza)

Neki najčešće korišćeni metodi:[43]

  • metodi koji menjaju niz:
    • Array.prototype.copyWithin() - kopira sekvencu elemenata niza u niz
    • Array.prototype.pop() - skida poslednji element iz niza i vraća taj element
    • Array.prototype.push() - dodaje jedan ili više elemenata na kraj niza i vraća novu dužinu niza
    • Array.prototype.reverse() - obrće elemente niza
    • Array.prototype.shift() - uklanja prvi element iz niza i vraća taj element
    • Array.prototype.sort() - sortira niz u mestu (koristi konstantnu količinu dodatnog prostora) i vraća sortirani niz
    • Array.prototype.splice() - dodaje i/ili uklanja elemente niza
    • Array.prototype.unshift() - dodaje jedan ili više elemenata na početak niza i vraća novu dužinu niza
  • metodi koji ne menjaju niz:
    • Array.prototype.concat() - vraća novi niz nastao spajanjem dva niza ili niza i neke vrednosti
    • Array.prototype.includes() - određuje da li niz sadrži odgovarajući element i vraća true ako sadrži, a false ako ne sadrži
    • Array.prototype.indexOf() - vraća indeks prvog pojavljivanja elementa ili -1 ako element nije pronađen
    • Array.prototype.join() - spaja sve elemente niza u string
    • Array.prototype.lastIndexOf() - vraća indeks poslednjeg pojavljivanja elementa ili -1 ako element nije pronađen
    • Array.prototype.slice() - izvlači deo niza i vraća novi niz
    • Array.prototype.toString() - vraća string reprezentaciju niza

Date metodi omogućavaju vraćanje i postavljanje vrednosti datuma (godine, mesece, dane, sate, minute, sekunde i milisekunde).[44]

Get metode
[uredi | uredi izvor]
Metoda Opis[44]
getDate() Vraća dan kao broj (1-31)
getDay() Vraća dan u nedelji kao broj od (0-6)
getFullYear() Vraća četiri cifre koje predstavljaju godinu (yyyy)
getHours() Vraća sat (0-23)
getMilliseconds() Vraća milisekundu (0-999)
getMinutes() Vraća minut (0-59)
getMonth() Vraća mesec (0-11)
getSeconds() Vraća sekundu (0-59)
getTime() Vraća vreme

Primer getDay() metode

  <script>
  var d = new Date();
  document.getElementById("demo").innerHTML = d.getDay();
  </script>
Set metode
[uredi | uredi izvor]
Metoda Opis[44]
setDate() Postavlja dan kao broj (1-31)
setFullYear() Postavlja godinu (opciono mesec i dan)
setHours() Postavlja sat (0-23)
setMilliseconds() Postavlja milisekundu (0-999)
setMinutes() Postavlja minut (0-59)
setMonth() Postavlja mesec (0-23)
setSeconds() Postavlja sekundu (0-59)
setTime() Postavlja vreme

Primer setFullYear() metode

 <script>
 var d = new Date();
 d.setFullYear(2020, 0, 14);
 document.getElementById("demo").innerHTML = d;
 </script>

RegExp

[uredi | uredi izvor]

RegExp konstruktor kreira objekat tipa regularni izraz za odgovarajući patern.[45] Sintaksa literala i konstruktora: /pattern/flags

new RegExp(pattern[, flags])
gde je obrazac tekst regularnog izraza, a opcije ako su navedene mogu imati bilo koju kombinaciju sledećih vrednosti:
  • g - globalna pretraga
  • i - ignoriši veličinu slova
  • m - više linija
  • u - tretira patern kao niz unikodnih karaktera
  • y - sticky[45]
 //kreiranje regularnog izraza
 /ab+c/i;
 new RegExp('ab+c', 'i');
 new RegExp(/ab+c/, 'i');
 
 var re='/\w+';
 var re=new RegExp("\\w+");
karakteri značenja[45]
. Odgovara svakom karakteru osim: \n, \r, \u2028 ili \u2029. U karakterskoj klasi tačka gubi specijalno značenje, tj. odgovara baš tački
\d Odgovara svim ciframa, tj. ekvivalentno je sa [0-9]
\D Odgovara svakom karakteru koji nije cifra, tj. ekvivalentno je sa [^0-9]
\w Odgovara svim malim i velikim slovima, ciframa i donjoj crti, tj. ekvivalentno je sa [a-zA-Z_]
\s Odgovara belini, tj. ekvivalentno je sa [\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
\S Odgovara svakom karakteru koji nije belina, tj. ekvivalentno je sa [^\f\n\r\t\v\u00a0\u1680\u180e\u2000

\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

\t Odgovara horizontalnom tabu
\r Odgovara carriage return karakteru
\v Odgovara vertikalnom tabu
\f Odgovara form feed karakteru
[\b] Odgovara backspace karakteru (ne treba mešati sa \b)
\0 Odgovara Nul karakteru
\cX Odgovara kontrolnom karakteru u stringu, gde je X neko slovo od A do Z
\xhh Odgovara karakteru sa dve heksadecimalne cifre
\uhhhh Poklapa se sa UTF-16 kodnom jedinicom (hhhh-četiri heksadekadne cifre)
\u{hhhh} ili \u{hhhhhh} Poklapa se sa znakom sa unikodnom vrednošću U+hhhh ili U+hhhhhh
\ Oduzima specijalno značenje karakterima
sidra značenje[45]
^ Označava početak reči
$ Označava kraj reči
\b Označava granicu reči
operatori značenje[45]
* Nula ili više puta
+ Jednom ili više puta
? 0 ili 1 put
{n} Tačno n puta
{n, } n ili više puta
{n, m} najmanje n puta i najviše m puta
tvrdnje značenja[45]
x(?=y) odgovara x-y samo ako iza x sledi y
x(?!y) odgovara x-y samo ako iza x ne sledi y

Greške

[uredi | uredi izvor]

Svaki od pregledača ima svoj podrazumevani način reagovanja na greške, npr. Fajerfoks i Kroum upisuju greške u log datoteku, dok recimo Internet Eksplorer i Opera generišu obaveštenja za korisnika. Zbog udobnosti rada korisnika potrebni su mehanizmi koji bi omogućili rukovanje s greškama.[46]

Greške se mogu obrađivati u okviru try-catch bloka: ovakve greške pregledači smatraju primećenim pa ne reaguju na njih.

  try{
  ...
  }catch(error){
  ...
  }

Tipovi grešaka koji mogu da se jave:

  • Error - osnovni tip greške (svi ostali se nasleđuju) ima svojstvo message sa opisom greške i svojstvo name kojim se određuje tip greške. Pregledači interno obogaćuju ovaj objekat, pa npr. Fajerfoks ima i svojstva fileName sa imenom datoteke u kojoj se javila greška, lineNumber koji sadrži liniju greške i stack koji sadrži stack trace.[46]
  • EvalError - greška koja se generiše pri radu sa eval() funkcijom koja izvršava Javaskript kod zapisan u vidu niske i prosleđen kao argument, npr. eval("var a,b,c;a=5;b=10;c=a+b"). Ovu funkciju treba koristiti uz oprez ukoliko postoji mogućnost da njen argument postane maliciozni kod koji može da ugrozi podatke i aplikaciju. Uz sve to, eval() se nešto sporije izvršava jer eksplicitno poziva JS interpreter.[46]
  • RangeError - greška koja se generiše kada vrednost koja se navodi nije u skupu ili opsegu dozvoljenih vrednosti, npr. a=new Array(-20)[46]
  • ReferenceError - javlja se u slučajevima kada se referiše na nepostojeću promenljivu[46],

npr. a=x;, dok x ne postoji

  • SyntaxError - obično se javlja kada se prosledi sintaksno neispravan kod funkciji eval(); u svim ostalim slučajevima sintaksne greške automatski prekidaju izvršavanje Javaskript koda[46]
  • TypeError - tip greške koji se najčešće javlja i to kada je promenljiva neodgovarajućeg tipa ili kada se pokušava sa pristupom metodi koja ne postoji[46]
  • URIError - greška koja se javlja kao posledica korišćenja funkcija encodeURI() i decodeURI() na URI argumentima koji su pogrešnog formata. Funkcija encodeURI() samo vrši URI kodiranje, kodiraju se svi specijalni karakteri(%HH) osim rezervnih karaktera: ;,/?:@&=+$# slova i karaktera: _ . ! ~ * ' ( )[46]

decodeURI() - inverzna funkcija funkciji encodeURI()

Greške se generišu sa throw.

 function test(x){
  if(typeof x != "number")
      throw new TypeError(...);
  if(x<conditions.MIN_VALUE || x>conditions.MAX_VALUE)
      throw new RangeError(...);
  return true;
 }

Sa instanceof se može utvrditi kojeg je tipa greška koja se pojavila i u skladu sa tim preduzeti odgovarajući skup akcija.[46]

 try{
      var="abc"
      test(x) 
  }catch(error){
      if(error instanceof TypeError){
       .....
      }
      else
           if(error instanceof RangeError){
            .....
            }
           else{
                   console.log(error.message)
           }
 }

Mogu se kreirati i vlastiti objekti koji nasleđuju klasu Error[46]

  function myError(message){
    this.message=message;
    this.name="myError";
  }
  
  myError.prototype=new Error();

U kodu ...throw new myError("my message");

Upisivanje u centralizovani log sistem (na strani servera): svaki put kada se greška javi može se generisati AJAX poziv koji sadrži tip greške i poziv greške; tako se lakše može pratiti ponašanje aplikacije na strani klijenata.[46]

 //image pings tj. slanje zahteva preko img objekta
   function logerror(type,message){
   var img=new Image();
   img src="log.php?type="+encodeURIComponent(type)+"&message="+encodeURIComponent(message);   
   }
   u kodu
   ...
   catch(error){
       if(error instanceof SyntaxError){
           logerror("syntax","Description:"+error.message);
           }
           ...
   }

Image pings je jednosmerni vid komunikacije između klijenta i servera koji zaobilazi pravilo istog porekla (može se komunicirati između raznorodnih domena).

  • često se koriste za praćenje korisničkih klikova
  • mana im je što ne postoji mogućnost slanja samo GET zahteva, i što ne postoji mogućnost obrade serverskog tekstualnog odgovora.[46]

STRICT MODE[46]

  • pojavio se sa ECMA5 standardom
  • podržavaju ga svi aktuelni pregledači
  • omogućava strožu kontrolu grešaka bilo globalno bilo na nivou pojedinačnih funkcija
  • u striktni mod se ulazi navođenjem "use strict"; niske
  • ideja je da se spreče sve greške preko kojih može interpretator da pređe (silently falls)

Sintaksa

[uredi | uredi izvor]

U ovom delu se razmatraju najosnovnije stvari bez kojih je nemoguće bilo šta kreirati vezano za Javaskript. Tu se pre svega misli na Javaskript sintaksu, tipove promenljivih, operatore itd.

Unos JS koda u HTML dokument

[uredi | uredi izvor]

Postoje dve mogućnosti: pisanjem direktno u HTML kod ili smeštanjem u poseban fajl (ekstenzija .js) koji se potom poziva u HTML dokumentu. Oba načina su pravilna i ne postoji razlika u radu skripta. Pozivanje spoljašnjeg fajla je dobro u slučajevima kada se jedna ista skripta koristi u više stranica.[47] Brauzer čita HTML stranicu i prikazuje elemente onako kako oni nailaze. Kada naiđe na skript u stranici, obavlja se njegovo izvršavanje pre nego što se nastavi čitanje ostalih elemenata (tekst, slike...).[47]

Primeri

Javaskript pisan u HTML dokumentu:

 <html>
   <body>
     <script type="text/javascript">
       document.write("Ovo je moj prvi JavaScript!");
     </script>
   </body>
 </html>

Javaskript pozvan iz posebnog fajla:

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

Postoje različiti načini pozivanja Javaskript koda, tj. različita mesta gde se on može smestiti u stranici. Prvi način je da se Javaskript kod stavi u <head> sekciji, dok je drugi način smeštanje unutar <body> sekcije dokumenta. Kod prvog načina skripta se učitava odmah, još pre učitavanja čitave stranice, dok se kod drugog načina skripta izvršava čim brauzer naiđe na nju. Moguće je postaviti neograničen broj skripti u stranici, bilo da se radi o prvom ili drugom slučaju.[47]

Komentari

[uredi | uredi izvor]

Komentari se koriste radi lakšeg snalaženja u kodu, i kao podsetnici. To je način za ostavljanje napomena tokom programiranja, čime se olakšava rad na kodu.[47] Razlikujemo dva tipa komentara:

  • jednolinijski
 //ovo je komentar
  • višelinijski
 /*ovo je dugačak višelinijski
   JavaScript komentar*/

Promenljive

[uredi | uredi izvor]

Javaskript kao i ostali programski jezici, koristi promenljive da bi zapamtio vrednosti, tako da se one kasnije mogu koristiti u drugim delovima programa. Imena promenljivih mogu da počinju velikim slovima (A - Z), malim slovima (a - z), ili donjom crtom (_). Preostali karakteri mogu da se sastoje od malih i velikih slova, donje crte, ili cifara od 0 do 9. Takođe, bitno je napomenuti da Javaskript razlikuje mala i velika slova. Javaskript za razliku od nekih drugih programskih jezika ne zahteva specificiranje tipa vrednosti promenljive, on to čak i ne dozvoljava. Ista promenljiva može da se koristi za smeštanje različitih tipova vrednosti u njoj, kao što su stringovi, celi brojevi, realni brojevi (3.14) ili logičke vrednosti. Javaskript interpretator automatski konvertuje tip podataka koji se nalazi u promenljivoj. Stringovi se moraju navoditi pod navodnicima, dok ostali tipovi to ne zahtevaju.[48] Za deklarisanje promenljivih koristi se ključna reč var:[47]

 var ceo_broj=3;
 var realan_broj=3.14;
 var string="Hello world";
 var logicka_promenljiva=true;

Moguće je deklarisati i praznu promenljivu.

 var x;

Postoje dve vrste promenljivih:

  • lokalne - vidljeve su samo u bloku u kom su deklarisane
  • globalne - vidljive su u celom programu

Ako se promenljiva deklariše u okviru neke funkcije bez ključne reči var, smatra se da je ta promenljiva globalna, tj. vidljiva je u celom kodu.[47]

 function primer1(){
    a=1;
 }
 
 var b=a+2;

Dakle, a je globalna i moguće joj je pristupiti.

 var a=1;
 
 function primer2(){
   var b=a+2;
 }

I u ovom primeru je moguće pristupiti promenljivoj a jer je globalna. Međutim, u sledećem primeru to neće biti moguće, jer se a smatra lokalnom promenljivom.

 function primer3(){
   var a=1;
 }
 
 var b=a+2;

Operatori

[uredi | uredi izvor]

Operatori u Javaskriptu predstavljaju simbole, koji označavaju određenu operaciju ili relaciju i koje povezuju jedan ili više operanada u jedan izraz (aritmetički, logički...). Za celobrojne tipove te operacije uključuju aritmetičke, relacijske i logičke operacije. Podržani su i operacije koje se primenjuju nad pojedinačnim bitovima celobrojnih vrednosti. Operatori se dele na osnovu svoje parnosti tj. broja operanada na koje se primenjuju. Unarni operatori deluju samo na jedan operand i mogu biti prefiksni kada se navode ispred operanda i postfiksni kada se navode nakon operanda. Binarni operandi imaju dva operanda i obično su infiksni tj. navode se između svojih operanada. Postoji i ternarni operator koji se primenjuje na tri operanda.

Prioritet i asocijativnost operatora

[uredi | uredi izvor]

Izrazi mogu da obuhvataju više operatora i zagrade i koriste se da bi odredile kojim redosledom ih treba primenjivati. Postoje konvencije koje omogućavaju izostavljanje zagrada. Jedna od osnovnih takvih konvencija je prioritet operatora koji definiše kojim redosledom će se dva različita operatora primenjivati kada se nađu u istom, nezagrađenom izrazu. Naki od osnovnih principa u definisanju prioriteta:

  1. Unarni operatori imaju veći prioritet u odnosu na binarne.
  2. Postfiksni unarni operatori imaju veći prioritet u odnosu na prefiksne unarne operatore.
  3. Aritmetički operatori imaju prioritet u odnosu na relacijske koji imaju prioritet u odnosu na logičke operatore.
  4. Operatori dodele imaju veoma nizak prioritet.

Druga važna konvencija je asocijativnost operatora koja definiše kojim redosledom će se izračunavati dva ista operatora ili operatora istog prioriteta kada se nađu uzastopno u istom, nezagrađenom izrazu. Obično se razlikuju leva asocijativnost, kada se izraz izračunava sleva nadesno, i desna asocijativnost, kada se izraz izračunava zdesna nalevo. Većina operatora ima levu asocijativnost (najznačajniji izuzeci su prefiksni unarni operatori i operatori dodele).

Aritmetički operatori

[uredi | uredi izvor]

Aritmetički operatori se koriste za izvršavanje aritmetičkih operacija. Aritmetički operatori imaju veći prioritet od relacijskih (operatori poređenja), koji imaju veći prioritet od logičkih operatora.[49]

Operator Opis
+ unarni plus i sabiranje
- unarni minus i oduzimanje
* množenje
/ deljenje
% moduo
++ inkrementiranje
-- dekrementiranje
** stepen

Unarni + je ekvivalentan pozivu Number() konstruktora, tj. pretvara svoj operand u brojni tip. Unarni - radi isto to i nakon toga negira vrednost. Unarni - se uglavnom koristi kada želimo da koristimo negativne brojeve. Binarni + se može koristiti i za konkatenaciju stringova.

 1 + 2 // rezultat: 3
 true + 1 // rezultat: 2
 false + false // rezultat: 0
 5 + "foo" // rezultat: "5foo"
 false + " hope"// rezultat: "false hope"
 "Wonderful" + " tonight" // "Wonderful tonight"

Operator inkrementiranja povećava vrednost operanda za 1, a dekrementiranja smanjuje za 1. Ovi operatori mogu biti prefiksni i postfiksni. Prefiksni operator inkrementiranja uveća vrednost operanda i vrati je, a postfiksni operator inkrementiranja prvo vrati vrednost operanda, pa je tek onda uveća. Slično je i sa dekrementiranjem.

 var a=3
 document.write(++a) //postavlja a na 4 i upisuje 4
 var b=3
 document.write(b++) //upisuje 3 i postavlja b na 4
 document.write(b) //upisuje 4
 
 document.write(--a) //postavlja a na 3 i upisuje 3
 document.write(b--) //upisuje 4 i postavlja b na 3
 document.write(b) //upisuje 3

Stepenovanje

 2**2 //rezultat: 4
 (-2)**2 //rezultat: 4
 2**3 //rezultat: 8
 2**3**2 //rezultat: 512
 2**(3**2) //rezultat: 512
 (2**3)**2 //rezultat: 64
 10**-1 //rezultat: 0.1
 3**2.5 //rezultat: 15.588457268119896

Operator dodele

[uredi | uredi izvor]

Vrednosti promenljivama dodeljuju se korišćenjem operatora dodele. Najčešći operator dodeljivanja je znak jednako “=”. Operator dodele može se pisati zajedno sa binarnim aritmetičkim operatorima.[50]

Simbol Značenje
= // dodeljuje vrednost promenljive ili izraza s desne strane promenljivoj s leve strane (x=y;)
+= // sabira dve promenljive (x = x + y;) i dodeljuje zbir promenljivoj s leve strane
-= // oduzima dve promenljive (x = x - y;) i dodeljuje razliku promenljivoj s leve strane
*= // množi dve promenljive (x = x * y;) i dodeljuje proizvod promenljivoj s leve strane
/= // deli dve promenljive (x = x / y;) i dodeljuje količnik promenljivoj s leve strane
%= // celobrojno deli dve promenljive (x = x % y;) i dodeljuje ostatak pri deljenju promenljivoj s leve strane

Operatori poređenja

[uredi | uredi izvor]

Operatori poređenja upoređuju vrednosti dve promenljive ili izraza. Svaki izraz u kome se koriste operatori poređenja ima logičku vrednost: ako je izraz tačan, ima logičku vrednost True, a ako je netačan logičku vrednost False.[51]

Simbol Značenje
== // vraća vrednost true ako su promenljive jednake (x == y)
=== // vraća vrednost true ako promenljive iste vrednosti i istog tipa
!= // vraća vrednost true ako promenljive nisu jednake (x != y)
> // vraća vrednost true ako je promenljiva s leve strane veća od promenljive s desne strane (x > y)
< //vraća vrednost true ako je promenljiva s leve strane manja od promenljive s desne strane (x < y)
>= //vraća vrednost true ako je promenljiva s leve strane veća ili jednaka od promenljive s desne strane (x >= y)
<= //vraća vrednost true ako je promenljiva s leve strane manja ili jednaka od promenljive s desne strane (x <= y)
 5==8 //vraca false
 Za vrednosti promenljivih x=5, y="5" vršimo sledeća poređenja:
 x==y //vraća true
 x===y //vraća false
 5!=8 //vraća true
 5>8 //vraća false
 5<8 //vraća true
 5>=8 //vraća false
 5<=8 //vraća true

Logički operatori

[uredi | uredi izvor]

Logički operatori primenjuju se nad istinitosnim vrednostima, koje se predstavljaju korišćenjem brojevnih vrednosti. Ukoliko je broj jednak 0, onda je njegova logička vrednost jednaka 0 (netačno), a inače je njegova logička vrednost jednaka 1 (tačno). Rezultat izračunavanja tačno nije proizvoljna vrednost različita od nula, već isključivo jedan. Postoje sledeći logički operatori:[52]

  • && - logički AND vraća vrednost true ako su oba izraza true
  • || - logički operator OR vraća vrednost true ako je barem jedan izraz true
  • ! - logički operator NOT vraća vrednost true ako je izraz false odnosno false ako je izraz true
 x=6,y=3
 (x<10 && y>1) //je true
 (x === 5 || y === 5) //je false
 !(x == y) //je true

Uslovni operator

[uredi | uredi izvor]

Uslovni operator ispituje da li je uslov ispunjen (vrednost true), ako jeste dodeljuje vrednost nakon upitnika, u suprotnom dodeljuje vrednost nakon dvotačke.[53]

 poruka = (email == "Da") ? "Primio si poštu." : "Nema pošte.";

Ukoliko je vrednost promenljive email jednaka “Da” dodeljujemo promenljivoj poruka vrednost “Primio si poštu.”, u suprotnom dodeljujemo joj vrednost “Nema pošte.”.

Bitovski operatori

[uredi | uredi izvor]

Bitovski operatori se koriste za rad sa pojedinačnim bitovima (1 i 0), koji se mogu primenjivati samo na celobrojne argumente.[54]

  • ~ - bitovska negacija - invertuje svaki bit argumenta
  • & - bitovska konjunkcija - vrši konjunkciju pojedinačnih bitova dva argumenta
  • | - bitovska disjunkcija - vrši disjunkciju pojedinačnih bitova dva argumenta
  • ^ - bitovska ekskluzivna disjunkcija - vrši ekskluzivnu disjunkciju pojedinačnih bitova dva argumenta
  • << - levo pomeranje (šiftovanje) - vrši pomeranje bitova prvog argumenta ulevo za broj pozicija koji je naveden kao drugi argument
  • >> - desno pomeranje (šiftovanje) - vrši pomeranje bitova prvog argumenta udesno za broj pozicija koji je naveden kao drugi argument

Unarni operator ~ ima najveći prioritet i desno asocijativan je. Prioritet operatora pomeranja je najveći od svih binarnih bitovskih operatora. Nakon toga sledi & koji ima veći prioritet od ^ koji ima veći prioritet od |. Ovi operatori imaju levu asocijativnost.[54]

 x=5 & 1 // 5&1=(0101)&(0001)=(0001) pa je razultat 1
 x=5|1   // 5|1=(0101)|(0001)=(0101) pa je razultat 5
 x=~5 // 5=0101 bitovski ~5=1010 sto je 10
 x=5^1  // (0101)^(0001)=(0100) pa je rezultat 4
 x=5 << 1 // 5=0101 a kada 5 siftujemo za jedan ulevo dobijamo 1010 sto je 10
 x=5 >> 1 // 5=0101 a kada 5 siftujemo za jedan udesno dobijamo 0010 sto je 2

Jednostavniji primeri

[uredi | uredi izvor]

Promenljive se u Javaskriptu definišu sa ključnom reči var.[55]

var x; // дефиниција променљиве x. Почетна вредност ове променљиве је недефинисана (eng. undefined).
var y = 2; // дефиниција променљиве у и додела вредности 2.

Komentari se u Javaskript-u pišu na sledeći na sledeći način.

// кратак коментар у једној линији.
/*
     Дугачак, документацијски коментар.
     Написан у више линија.
*/
/*Коментар /* не сме бити угњежден. */Ово је синтаксна грешка*/

Za ispis teksta na ekranu, koristi se objekat console. U primeru je dato ispisivanje teksta Zdravo Svete.

console.log("Zdravo Svete.");

Iskazi if, else i else if

// if исказ се користи ради активирања одређених наредби ако је одређени услов задовољен.

function funkcija4(){
  var boja = prompt("Koju boju najviše voliš?")
  if (boja == "rozu") {
       alert("Verovatno si žensko");
      }
  }
// else исказ се извршава онда када if услов није задовољен.

function funkcija2() {
  var broj = prompt("Unesite bilo koji broj!")
    if (broj <= 10) {
            alert("Uneli ste broj manji od 10");
        }
    else alert("Uneli ste broj veći od 10") 
    }
// else if исказ је веома користан јер дозвољава да се наведе више од једног услова.

var visitor= "";
if (visitor == "Drago" {
document.write("Pozdrav Drado...");
}
 else if (visitor == "Miloje") {
      document.write("Pozdrav Miloje...");
}
else if(visitor == "Laki") {
      document.write("Pozdrav Laki...");
}
else {
      document.write("Pozdrav posetioče...");
}

Jednostavna rekurzivna funkcija koja računa faktorijel.

function factorial(n) {
    if (n == 0) {
        return 1;
    }
    return n*factorial(n - 1);
}

Primer anonimne funkcije

var displayClosure = function() {
    var count = 0;
    return function () {
        return ++count;
    };
}
var inc = displayClosure();
inc(); // враћа 1
inc(); // враћа 2
inc(); // враћа 3

Napredniji primer

[uredi | uredi izvor]

Ovaj uzorak koda prikazuje razne Javaskript funkcije.

function LCMCalculator(x, y) {
    var checkInt = function (x) {
        if (x % 1 !== 0) {
            throw new TypeError(x + " is not an integer");
        }
        return x;
    };
    this.a = checkInt(x)
    this.b = checkInt(y);
}
LCMCalculator.prototype = {
    constructor: LCMCalculator,
    gcd: function () { 
        var a = Math.abs(this.a), b = Math.abs(this.b), t;
        if (a < b) {
            t = b;
            b = a;
            a = t;
        }
        while (b !== 0) {
            t = b;
            b = a % b;
            a = t;
        }
        this['gcd'] = function () {
            return a;
        };
        return a;
    },
    lcm : function () {
        var lcm = this.a/this.gcd()*this.b;
        this.lcm = function () {
            return lcm;
        };
        return lcm;
    },
    toString: function () {
        return "LCMCalculator: a = " + this.a + ", b = " + this.b;
    }
};
function output(x) {
    document.body.appendChild(document.createTextNode(x));
    document.body.appendChild(document.createElement('br'));
}

[[25, 55], [21, 56], [22, 58], [28, 56]].map(function (pair) {
    return new LCMCalculator(pair[0], pair[1]);
}).sort(function (a, b) {
    return a.lcm() - b.lcm();
}).forEach(function (obj) {
    output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());
});

Kontrola toka

[uredi | uredi izvor]

Kontrole toka omogućavaju tok programa željenom putanjom u skladu sa određenim uslovima.

Osnovne kontrole toka u Javaskriptu su veoma slične osnovnim kontrolama toka u višim programskim jezicima. Osim njih, postoje i kontrole toka specifične samo za Javaskript jezik.

If-else naredba

[uredi | uredi izvor]

Omogućava izvršavanje određenog bloka instrukcija, ako je zadati uslov ispunjen.[56]

 Sintaksa :
   if(logički izraz) 
     blok1;
   [else 
     blok2;]

if...else naredba je proširenje if naredbe. If naredba omogućuje izvršavanje nekog koda ukoliko je uslov zadovoljen, a ukoliko nije neće se izvršiti ništa.[56]

Ako se želi napisati da ukoliko uslov u if izrazu nije zadovoljen, da se izvrši neki drugi kod onda koristi se if...else naredba. Višestruke if…else naredbe se mogu ugnezditi, da bi se napravila else if naredba.[56]

  if(logički izraz1)
     blok1;
  else if(logički izraz2)
     blok2;
  else if(logički izraz3)
     blok3;
     . . .  
  else if(logički izrazN)
     blokN;

Kako jedna if-else naredba može da sadrži više naredbi, te naredbe se grupišu zagradama { }. Generalno je dobra praksa da se uvek koriste zagrade.[56]

 if(logicki izraz1)
 {
   blok1;
 }
 else 
 {
   blok2;
 }

Ternarni operator

[uredi | uredi izvor]

Switch naredba upoređuje izraz u zagradi sa vrednostima u slučajevima, ako je izraz jednak nekoj od vrednosti u slučaju tada se izvršavaju naredbe u okviru njega.[57]

 Sintaksa:
   logičkiIzraz ? izraz1 : izraz2;

gde je izraz logički_izraz bilo koji izraz čiji rezultat je vrednost logičkog tipa. Ako je rezultat izraza true, onda se izvršava izraz1, u suprotnom izraz2.

Switch naredba

[uredi | uredi izvor]
 Sintaksa:
 switch (izraz){
   case vrednost1:
      //Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu1
       [break;]
   case vrednost2:
      //Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu2
       [break;]
   case vrednost3:
     //Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscu3
       [break;]
      ...
   case vrednostN:
     //Naredbe koje se izvršavaju ako se izraz poklopi sa vrednoscuN
       [break;]
 }

Do...while naredba

[uredi | uredi izvor]

Do...while naredbom se kreira petlja koja izvršava naredbe dok je uslovna naredba tačna. Uslov se testira nakon izvršenja naredbe, što znači da se naredba mora izvršiti bar jednom.[58]

 Sintaksa:
 do
   Naredba
 while(uslov);

While naredba

[uredi | uredi izvor]

While naredbom se kreira petlja u kojoj se izvršavaju naredbe dok je uslov tačan. Uslov se testira pre izvršavanja naredbe.[59]

 Sintaksa :
   while(uslov)
   { naredba
    }

For naredba

[uredi | uredi izvor]

For ciklus se zapisuje tako da se iza ključne reči for, zapišu u zagradama tri opciona izraza međusobno odvojena tačka-zarezom, a iza njih naredba koja čini telo petlje.[60]

 Sintaksa:
 for ( izraz1opcion ; izraz2opcion ; izraz3opcion )

Izraz1 se tipično koristi za inicijalizaciju brojača, izraz2 za uslov, a izraz3 za inkrementaciju. Naravno ovi izrazi su opcioni, tako da se mogu i izostaviti u zavisnosti od problema.

For…in naredba

[uredi | uredi izvor]

Koristi se za obilazak kolekcije, tj. za obavljanje određenih radnji nad svim elementima kolekcije.[61]

 Sintaksa:
 for( x in kolekcija){
    ...
 }

x promenljiva kojoj se u svakoj iteraciji dodeljuje vrednost, kolekcija u kojoj se vrši obilazak.

For...of naredba

[uredi | uredi izvor]

Koristi se za obilazak iterabilnog objekta (uključujući niz, mapu, string…), pozivajući posebnu iteraciju i izvršavajući naredbe za svaki član objekta.[62]

 Sintaksa:
  for ( x of object){
   naredbe
  }

Break naredba

[uredi | uredi izvor]

Ova naredba zaustavlja pokrenutu petlju. I nastavlja program na narednoj komandi posle tela petlje.[63]

 Sintaksa:
  break[labela];

Labela opciona i vezana sa labelom naredbi u petlji.

Continue naredba

[uredi | uredi izvor]

Ova naredba zaustavlja izvršavanje petlje na trenutnoj iteraciji i nastavlja njeno izvršavanje na sledećem iteriranom elementu[64]

 Sintaksa :
  continue[labela];

Labela opciona i vezana sa labelom naredbi u petlji. Continue naredba ne zaustavlja izvršavanje kao break već u slučaju while petlje proverava ponovo uslov, a u slučaju for petlje ide na naredbu iteracije.

Import naredba

[uredi | uredi izvor]

Import naredba se koristi za uvođenje funkcija, objekta… iz drugih fajlova iz skripta.[65]

Export naredba

[uredi | uredi izvor]

Export naredba se koristi za izvoz funkcija, objekata u druge fajlove.[66]

Klase su posebne “funkcije” koje se definišu u telu programa. Jedan od načina definisanja klase je korišćenjem deklaracije klase. Da bi se deklarisala klasa koristi se ključnu reč class nakon čega sledi ime klase, zatim u zagradama telo klase.[67]

 class Poligon {
   Constructor(height,width){
     this.height=height;
     this.width=width;
    }
 }

Glavna razlika između deklaracije funkcije i deklaracije klase je u tome što klasu mora prvo da se deklariše pa onda da joj pristupimo, inače će se javiti greška (Reference Error). Klase, kao i funkcije, mogu biti anonimne. Znači, moguće ih je navesti i bez konkretnog naziva, kao i praviti referencu na klasu.

 var KlasaRef = class {
    ...
 }
 var NovaKlasa = class extends KlasaRef {
   ...
 }

Takođe, klase je moguće i prosleđivati kao parametar ili vraćati kao vrednost funkcije. Funkcija koja prima klasu kao parametar, onda kreira novu klasu koja nasleđuje zadatu klasu i koju onda vraća bi izgledala ovako:

 function kreator (klasa) {
   return class extends klasa {
     ...
   }
 }

Takvu funkciju bismo mogli da upotrebimo da kreiramo novu nasleđenu klasu na osnovu nje ili čak da direktno definišemo objekat:

 class xx extends kreator(class {...});
 var obj = new xx();

...ili

 var obj = new (kreator(class {...}))();

Geteri i seteri

[uredi | uredi izvor]

Ukratko, geteri i seteri su funkcije koje služe za napredno definisanje svojstva. One praktično predstavljaju „prvu liniju odbrane” svojstva, tačnije sprečavaju programere da pristupaju svojstvima kao „golim” podacima.[67] Geter je funkcija koja obezbeđuje čitanje svojstva. Šta god da radi, na kraju mora pomoću direktive return da vrati vrednost koja onda predstavlja vrednost svojstva.[67] Slično, seter je funkcija koja se poziva kada se zadaje vrednost svojstva. Ova funkcija mora imati jedan parametar koji predstavlja zadatu vrednost.[67] Negde „u pozadini” se ta vrednost beleži - najčešće u nekom svojstvu objekta, koje se ne „eksponira”. Naravno, Javaskript nema mehanizam kojim bi se svojstvo zaista sakrilo, tako da je u pitanju prosto konvencija - dogovor.

 class Klasa {
   constructor(params) {
    this._skriveno_svojstvo = početna_vrednost;
  }
  get svojstvo() {
    return this._skriveno_svojstvo;
  }
  set svojstvo(vrednost) {
    this._skriveno_svojstvo = vrednost;
  }
  ...
  }

Kada se svojstvo definiše na ovakav način, koristi se kao i bilo koje „obično” svojstvo.

  var objekat = new Klasa(params)
  var citanje = objekat.svojstvo;
  objekat.svojstvo = nova_vrednost;

Prototipsko nasleđivanje

[uredi | uredi izvor]

Objekti u Javaskriptu imaju ugrađeni mehanizam nasleđivanja kroz takozvano prototipsko nasleđivanje. To je poseban stil objektno-orijentisanog programiranja koji čak nije ni jedinstven za Javaskript. Prototipsko nasleđivanje se zasniva na delegiranju. Svaki objekat ima svoja svojstva i metode, ali i posebnu vezu ka roditeljskom objektu koji onda predstavlja njegov prototip od koga nasleđuje svojstva i metode. Suvišno je reći - i taj roditeljski objekat takođe ima svoj prototip i tako dalje. Kada se pristupa npr. određenom metodu objekta, ako ga objekat nema, on se „traži” u njegovom prototipu, pa u prototipu prototipa i tako sve do kraja lanca.[68]

Konstruktor

[uredi | uredi izvor]

Konstruktor je posebni metod koji se koristi da bi se inicijalizovao objekat kreiran u klasi. U klasi može postojati samo jedan konstruktor inače program će javiti da postoji greška.

Extends

[uredi | uredi izvor]

Extends je ključna reč koja se koristi kod nasleđivanja klasa.

Static

[uredi | uredi izvor]

Static je ključna reč koja definiše statičku metodu klase. Statičke metode mogu biti pozvane bez konstruisanja njihove klase.

Veb programiranje

[uredi | uredi izvor]

Osnovni domen primene Javaskript programskog jezika jeste veb programiranje. Pre nego što pregledač učita stranicu, mora da napravi DOM i CSSOM stabla. Pregledač analizira fajl, zapravo analizira bajtove i od njih pravi karaktere, zatim grupisanjem karaktera pravi tokene, od tokena čvorove, a od čvorova objekte.[69] HTML etikete se transformišu u Objektni model dokumenta (DOM), a CSS etikete u CSS objektni model (CSSOM). DOM i CSSOM su nezavisne strukture i njihovim spajanjem nastaje render drvo, koje se zatim koristi za izračunavanje osobina svakog vidljivog elementa, npr. veličina elementa, boja pozadine itd. Optimizacija svakog od ovih koraka je od ključne važnosti za postizanje optimalnih performansi pregledanja. DOM opisuje sadržaj, a CSSOM opisuje stil koji se primenjuje. Render drvo sadrži samo čvorove potrebne za prikazivanje stranice i vodi računa o rasporedu i tačnoj veličini svakog objekta.[70] Prilikom kreiranja render stabla, pregledač otprilike radi sledeće:

  • Kreće od korena DOM stabla i posećuje svaki vidljivi čvor
    • Neki čvorovi nisu vidljivi (npr. skript etiketa, meta tagovi itd.) i njih ne prikazuje u DOM drvetu jer nisu vidljivi na stranici
    • Neki čvorovi su sakriveni preko CSS-a (display: none) i oni se, takođe, ne prikazuju u DOM drvetu
  • Za svaki vidljivi čvor pregledač pronalazi odgovarajuća CSSOM pravila i primenjuje ih
  • Prikazuje vidljive čvorova sa sadržajem i stilizuje ih[70]

Pregledač stranu koju treba da prikaže tretira kao document, i elementima DOM stabla može se pristupiti pomoću document.getElemenstByTagName(). Metod .getElementsByTagName() vraća niz elemenata sa tagom koji mu prosledimo. Slični metodi su .getElementById(), .getElementsByClassName() i .getElementsByName(). Od prethodne verzije JS elementima je moguće pristupiti pomoću document.querySelector() koji dohvata samo prvi element koji se podudara sa prosleđenim CSS selektorom ili document.querySelectorAll() koji dohvata sve elemente koji se podudaraju sa prosleđenim selektorom. Ukoliko se želi da se dođe do HTML sadržaja nekog elementa, to radimo pomoću metoda .innerHTML. Pomoću metoda .textContent ispisuje se tekstualni sadržaj nekog elementa, a novi element se pravi pomoću .createElement(). Na primer:

 var p=document.createElement("p");
 //atributu title dodeljujemo vrednost Napravljen pomocu JS-a
 p.setAttribute("title", "Napravljen pomocu JS-a");
 //pravimo cvor koji sadrzi Zdravo svima
 var text=document.createTextNode("Zdravo svima");
 //da bi ovaj cvor bio vidljiv potrebno je da ga nadovezemo na p
 p.appendChild(text);
 //medjutim, ovo i dalje nije vidljivo jer nismo sve to nadovezali na body
 document.body.appendChild(p);

Pomoću ovog mehanizma mogu se kreirati svi elementi (npr. neuređenu/uređenu listu), ali sve to se može uraditi i samo pomoću HTML-a i CSS-a. Ono što Javaskript razlikuje od HTML-a i CSS-a jeste činjenica da JS podržava i akcije, odnosno, događaje koji se realizuju kada se klinke ne neki element ili se stranica zatvori itd. To je pokazano na sledećem primeru:[71]

 <!DOCTYPE html>
 <html>
  <head>
    <title>  Pridruživanje događaja </title>
    <meta charset='UTF-8'>    
    <style type='text/css'>
        .dugme{
            width: 200px;
            height: 50px;
            line-height: 50px;
            text-align: center;
            background-color: green;
            color: white;
        }
        .dugme:hover{
            cursor: pointer;
            background-color: blue;
        }
    </style>
  </head>
  
  <body>
    <input type='button' id='dugme' value='klik za pregled poruke' onclick='prikazi_poruku()'> 
    <br />
    <br />
    <div class='dugme' id='moderno_dugme'> klik za pregled poruke </div>;
    <br />
    
    <!-- 
        this prilikom ovog navodjenja predstavlja ceo input element pa se moze pristupiti svim njegovim svojstvima - u ovom slucaju se funkciji prikazi prosledjuje tekuci tekstualni sadrzaj elementa 
    -->
    Unesite tekst (kada element izgubi fokus prikazace se njegov sadrzaj):
    <br />
    <input type='text' id='unos1' onblur='prikazi(this.value)'>
    <br />
    
    /*Preporuka je da script tag uvek pisemo na kraju body sekcije jer zelimo da imamo DOM drvo u celosti kreirano pre nego sto
    izvrsimo neke manipulacije*/
    <script type='text/javascript'>
        /*  Ovakav nacin pridruzivanja podrazumeva postojanje odgovarajućih atributa na nivou elementa.
            Neki od atributa koji postoje su: 
            onclick - definiшe sta se dogadja kada korisnik klikne na povrsinu elementa 
            onchange - definise sta se dogadja kada korisnik promeni vrednost npr. input elementa ili select    
                        elementa
            onfocus - definise sta se dogadja kada element dobije fokus (kada se korisnik pozicionira bilo misem bilo tab tasterom na ovo polje)
            onblur - definise sta se dogadja kada element izgubi fokus
            onhover - definise sta se dogadja kada se predje preko povrsine elementa
            onkeydown - definise sta se dogadja kada korisnik pritisne taster na tastaturi (spust tastera)
            onkeyup - definise sta se dogadja kada korisnik pusti pritisnuti taster na tastaturi 
            .....
            .....
        */        
        function prikazi_poruku(){
            //window je objekat koji predstavlja ceo prozor pregledaca
            window.alert("Poruka!");
        }
        
        /*  Ovakav nacin pridruzivanja zahteva pristup elementu i definisanje odgovarajuceg svojstva - vrednost 
            svojstva je funkcija pa postojanje omotaca sprecava da se funkcija izvrsi odmah nakon pridruzivanja 
        */
        var moderno_dugme=document.querySelector('#moderno_dugme');
        moderno_dugme.onclick=function(){
            window.alert("Poruka!");
        }
 
        function prikazi(tekst){
            window.alert("Novi sadrzaj je: " + tekst);
        }
    </script>
      
  </body>  
 </html>

U nastavku slede neki jednostavniji primeri primene JSa kroz veb programiranje.[72]

Primer kalkulatora[72]

 <!DOCTYPE html>
 <html>
   <head>
     <title>Kalkulator</title>
   </head>
   <body>
     a: <input type="text" id="a" onkeyup="izracunaj()">
     <br />
     b: <input type="text" id="b" onkeyup="izracunaj()">
     <br />
     rez: <output id="rez" for="a b"></output>
     <br />
     <!-- I nacin:
     <input type="button" value="+" onclick="izracunaj('+')">
     <input type="button" value="-" onclick="izracunaj('-')">
     <input type="button" value="*" onclick="izracunaj('*')">
     <input type="button" value="/" onclick="izracunaj('/')">
     <input type="button" value="koren" onclick="izracunaj('koren')"> -->
     <!-- II nacin: -->
     <select id="operacija" onchange="izracunaj()">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
        <option value="koren">koren</option>
     </select>
     <br />
     <span id="greska"></span>
 
     <script type="text/javascript">
     function izracunaj(){
        var a = document.getElementById("a");
        var b = document.getElementById("b");
        var op = document.getElementById("operacija").value
        var rez = document.getElementById("rez");
        var err = document.getElementById("greska");
        a1 = parseInt(a.value);
        b1 = parseInt(b.value);
        if(isNaN(a1) || isNaN(b1)){
           if(isNaN(a1))
               a.focus();
           else
               b.focus();
 
           err.textContent = "Neispravni argumenti!";
           return;
        }
        else{
           switch(op){
             case '+':
                  rez.value = a1 + b1;
                  break;
             case '-':
                  rez.value = a1 - b1;
                  break;
             case '*':
                  rez.value = a1 * b1;
                  break;
             case '/':
                  if(b1 == 0){
                     err.textContent = "Deljenje nulom!";
                     b.focus();
                     return;
                  }
                  else
                     rez.value = (a1 / b1).toPrecision(2);
                  break;
             case 'koren':
                  if(a1 < 0){
                     err.textContent = "Vrednost ne sme biti negativna!";
                     a.focus();
                     return;
                  }
                  else
                     rez.value = Math.sqrt(a1);
                  break;
           }
        }
        err.innerHTML = "Sve je ok!";
     }
     </script>
   </body>
 </html>

Godišnja doba[72]

 <!DOCTYPE html>
 <html>
   <head>
     <title>Godisnja doba></title>
     <style type="text/css">
       img{
          height: 200px;
          width: 200px;
       }
     </style>
   </head>
   <body>
      <img src='prolece.jpg' alt="prolece">
      <br />
      <input type="button" value="napred" onclick="napred()">
      <input type="button" value="nazad" onclick="nazad()">
      <input type="button" value="start slideshow" onclick="slideshow()" id="slide">
      <script type="text/javascript">
         window.slike = new Array("prolece.jpg", "leto.jpg", "jesen.jpg", "zima.jpg");//ovo je globalno
         var i = 0;//ovo je takodje globalno
         var elem = document.getElementsByTagName("img")[0];
         var timer;
 
         function napred(){
            i = (i + 1) % slike.length;
            elem.src = slike[i];
            elem.alt = slike[i];
         }
 
         function nazad(){
            if(i - 1 == -1)
               i = slike.length - 1;
            else
               i = i - 1;
            elem.src = slike[i];
            elem.alt = slike[i];
         }
 
         function slideshow(){
            timer = setInterval("napred()", 1000);
            var elem = document.getElementById("slide");
            elem.value = "stop slideshow";
            elem.onclick = stopslideshow;
         }
 
         function stopslideshow(){
            clearInterval(timer);
            var elem = document.getElementById("slide");
            elem.value = "start slideshow";
            elem.onclick = slideshow;
         }
      </script>
   </body>
 </html>

Generisanje karaktera[72]

 <!DOCTYPE html>
 <html>
   <head>
     <meta charset='UTF-8'>
     <title>Captcha</title>
   </head>
   <body>
     <input type="checkbox" id="malaSlova"> mala slova
     <br />
     <input type="checkbox" id="velikaSlova"> velika slova
     <br />
     <input type="checkbox" id="cifre"> cifre
     <br />
     duzina <input type="text" id="duzina">
     <br />
     <br />
     <input type="text" id="captcha" readonly>
     <br />
     <input type="button" value="generisi" onclick="generisi()">
 
     <script type="text/javascript">
        function generisi(){
           var karakteri = '';
           var malaSlova = document.getElementById("malaSlova");
           var dozvoljena_slova="abcdefghijklmnopqrstuvwxyz";
           
           if(malaSlova.checked == true)
                 karakteri += dozvoljena_slova;
 
           var velikaSlova = document.getElementById("velikaSlova");
           if(velikaSlova.checked == true)
                 karakteri += dozvoljena_slova.toUpperCase();
 
           var cifre = document.getElementById("cifre");
           var dozvoljene_cifre="0123456789";
           if(cifre.checked == true)
                 karakteri += dozvoljene_cifre;
 
           var n = parseInt(document.getElementById("duzina").value);
           if(isNaN(n) || n <= 0 || karakteri == ""){
                 console.log("Nekorektan unos!");
                 return;
           }
 
           var captcha = Array();
           for(var i = 0; i < n; i++){
                 var indeks = Math.floor(Math.random() * karakteri.length);
                 captcha[i] = karakteri.charAt(indeks);
           }
           document.getElementById("captcha").value = captcha.join('');
        }
     </script>
   </body>
 </html>

Pogađanje reči[72]

 <!DOCTYPE html>
 <html>
   <head>
      <meta charset='UTF-8'>
      <title>Pogadjanje reci</title>
   </head>
   <body>
      trenutna rec:<br />
      <input type="text" id="trenutnaRec">
      <br />
      slovo:<br />
      <input type="text" id="slovo">
      <br />
      broj pokusaja:<br />
      <input type="text" id="brojPokusaja" readonly>
      <br />
      <input type="button" value="zameni" onclick="zameni()" id="zameni">
 
      <script type="text/javascript">
         window.tacnaRec = "programiranje";	
 
         window.trenutnaRecNiz = new Array();
         for(var  i = 0; i < window.tacnaRec.length; i++)
                window.trenutnaRecNiz[i] = "*";
         document.getElementById("trenutnaRec").value = window.trenutnaRecNiz.join("");
 
         window.brojPokusaja = 0;
         document.getElementById("brojPokusaja").value = window.brojPokusaja;
 
         window.brojPogodaka = 0;
 
         function zameni(){
            var slovo = document.getElementById("slovo").value.trim();//izdvajamo slovo i usput izbaucjemo vodece beline
            if(slovo.length != 1){
                 window.alert("Morate uneti slovo!");
                 return;
            }
 
            for(var i = 0; i < window.tacnaRec.length; i++){
                 if(window.tacnaRec.charAt(i) == slovo){
                     window.trenutnaRecNiz[i] = slovo;
                     window.brojPogodaka++;
                 }
            }
 
            window.brojPokusaja++;
 
            document.getElementById("trenutnaRec").value = window.trenutnaRecNiz.join("");
 
            document.getElementById("brojPokusaja").value = window.brojPokusaja;
            document.getElementById("slovo").value = "";
 
            if(window.brojPogodaka == window.tacnaRec.length){
                  window.alert("Cestitamo!");
                  return;
            }
 
            if(window.brojPokusaja > 8){
                  window.alert("Potrosili ste sve pokusaje.");
                  document.getElementById("zameni").disabled = true;
                  return;
            }
         } 
      </script>
   </body>
 </html>

Neke Javaskript biblioteke:

  • jQuery - biblioteka čija je svrha da olakša upotrebu Javaskripta na veb stranicama. Slogan ove biblioteke je „piši manje, uradi više”
  • AJAX (asynchronous JavaScript and XML) - grupa međusobno povezanih tehnika za razvoj veba korišćenih na klijentskoj strani za pravljenje sinhronih i asinhronih veb aplikacija
  • Angular JS - strukturalni okvir za kreiranje dinamičkih veb stranica
  • Modernizr - Javaskript biblioteka koja detektuje „Html5” i Css3 svojstva u korisničkom brauzeru.

Upotreba u internet stranicama

[uredi | uredi izvor]

Najčešća upotreba Javaskript-a je dodavanje dinamičnosti HTML stranicama na klijentskoj strani. Skripte se uključuju u HTML stranice i vrše interakciju sa objektnim modelom dokumenata (engl. Document Object Model). Neki od primera upotrebe Javaskript-a su:

  • Učitavanje određenog dela stranice ili dostavljanje podataka serveru preko AJAKSA (engl. AJAX) bez ponovnog osvežavanja cele stranice (na primer društvena mreža vam omogućava ažuriranje novog statusa bez osvežavanja cele stranice).
  • Animiranje elemenata na stranici, čineći ih vidljivim i nevidljivim, menja elementima veličinu, pomera njihov sadržaj.
  • Ubacivanje interaktivnog sadržaja (na primer video klipova, animacija, video igrica, audio sadržaja...)
  • Validacija unetog sadržaja unutar formi, kako bi bili sigurni da su ispravni podaci poslati serveru.

Internet pretraživač je najčešće okruženje za izvršavanje Javaskript koda. Internet pretraživači obično prave host objekte za predstavljanje objektnog modela dokumenata u Javaskript-u. Pored internet pretraživača, Javaskript kod se može izvršiti i na serveru.[73]

Jednostavna skripta

[uredi | uredi izvor]

Ispod je minimalistički primer internet stranice koja koristi Javaskript i objektni model dokumenata.

<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>Minimal Example</title>
<body>
<h1 id="header">Ovo je Javaskript</h1>

<script>
    document.body.appendChild(document.createTextNode('Zdravo Svete!'));

    var h1 = document.getElementById('header');
    h1 = document.getElementsByTagName('h1')[0];
</script>

<noscript>Vaš pretraživač ne podržava Javaskript ili je trnutno isključen.</noscript>
</body>
</html>

Kompatibilnost

[uredi | uredi izvor]

S obzirom da Javaskript kod može da se izvrši u različitim okruženjima, važan deo testiranja koda je i provera da li Javaskript kod radi na više različitih pretraživača.

Interfejs objektnog modela dokumenata za manipulaciju sa internet stranicama nije deo Ekmaskript standarda odnosno samog Javaskript-a, već je definisan posebnim standardom. U praksi, implementacija internet pretraživača se razlikuje u standardima, i samim tim ne izvršava svaki pretraživač Javaskript kod isto.

Da bi se ove razlike anulirale, Javaskript programeri mogu da pokušaju da napišu kod koji će se u većini pretraživača izvršavati isto. Ako se ne izvrši, moguće je napisati kod koji proverava prisustvo određenih funkcija pretraživača.[74] U nekim slučajevima, dva pretraživača mogu izvršiti istu funkciju ali sa različitim ishodom. Tako da programer može praktično otkriti šta pretraživač radi i shodno tome izmeniti svoju skriptu kako bi je pretraživač izvršio na odgovarajući način.[75][76]

Osim toga, skripte ne mogu da rade za određene korisnike. Na primer korisnik može da:

  • Koristi stari ili redak internet pretraživač sa nepotpunom ili neobičnom podrškom za objektni model dokumenata.
  • Koristi PDA (engl. personal digital assistant) ili pretraživač na mobilnom telefonu koji ne može da izvrši Javaskript kod.
  • Da ima onemogućeno izvršavanje Javaskript-a kao meru predostrožnosti.

Kako bi pomogli ovim korisnicima, programeri mogu da naprave internet stranice koje degradiraju pretraživače da ne koriste Javaskript. Konkretno, strana bi trebalo da ostane upotrebljiva bez dodatnih elemenata Javaskript-a. Alternativni pristup rešavanju ovog problema jeste da prvi autor sadržaja koristi osnovne tehnologije koje rade u svim pretraživačima, a zatim poboljša sadržaj namenjen korisnicima koji podržavaju Javaskript. Ovo je poznato kao progresivno poboljšanje.

Istorijat verzija

[uredi | uredi izvor]

Javaskript je prvobitno razvijen 1996. godine radi korišćenja u veb pretraživaču Netskejp navigator. Iste godine Majkrosoft je predstavio implementaciju Internet eksplorera. Ona je nazvana JSkript zbog problema sa autorskim pravima. Godine 1997. je predstavljena prva standardizovana verzija jezika pod nazivom EKMASkript u okviru prvog izdanja standarda EKMA-252. Eksplicitno verzionisanje i uključivanje novih komponenti jezika je bilo karakteristično samo za Mozilu i kasnije je napušten ovaj princip. Fajerfoks 4 je poslednja verzija ovog pretraživača koja je bila vezana za verziju Javaskripta (1.8.5). Sa novim verzijama EKMA-262 standarda, komponente Javaskript jezika se pominju zajedno sa početnom definicijom EKMA-262 izdanja.

Sledeća tabela se zasniva na informacijama iz više izvora.[77][78][79]

Verzija Datum Ekvivalentno sa Netskejp
Navigator
Mozila
Fajerfoks
Internet
Eksplorer
Opera Safari Gugl
Hrom
1.0 Mart 1996 2.0 3.0
1.1 Avgust 1996 3.0
1.2 Jun 1997 4.0-4.05 3[80]
1.3 Oktobar 1998 EKMA-262 1. + 2. izdanje 4.06-4.7x 4.0 5[81]
1.4 Netskejp
Server
6
1.5 Novembar 2000 EKMA-262 3. izdanje 6.0 1.0 5.5 (JSkript 5.5),
6 (JSkript 5.6),
7 (JSkript 5.7),
8 (JSkript 5.8)
7.0 3.0-5 1.0-10.0.666
1.6 Novembar 2005 1.5 + dodaci nizovima + generatori nizova i stringova + E4X 1.5
1.7 Oktobar 2006 1.6 + pajton generatori + iteratori + dozvole 2.0 28.0.1500.95
1.8 Jun 2008 1.7 + generatori izraza + zatvarači izraza 3.0 11.50
1.8.1 1.8 + podrška za Džejson (engl. JSON) + manji dodaci 3.5
1.8.2 Jun 22, 2009 1.8.1 + manji dodaci 3.6
1.8.5 Jul 27, 2010 1.8.2 + nove komponente za slaganje sa EKMA-262 izdanjem 4.0

Reference

[uredi | uredi izvor]
  1. ^ a b Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
  2. ^ „Standard ECMA-262”. Ecma International. 17. 6. 2015. 
  3. ^ a b v „Uvod”. Pristupljeno 10. 11. 2016. 
  4. ^ „ECMAScript Language Specification” (PDF). Arhivirano iz originala (PDF) 12. 4. 2015. g. Pristupljeno 23. 3. 2017. 
  5. ^ „ECMAScript Language Overview” (PDF). 23. 10. 2007. str. 4. Arhivirano iz originala (PDF) 13. 7. 2010. g. Pristupljeno 3. 5. 2009. 
  6. ^ Severance, Charles (februar 2012). „JavaScript: Designing a Language in 10 Days”. Computer. IEEE Computer Society. 45 (2): 7—8. doi:10.1109/MC.2012.57. Pristupljeno 23. 3. 2013. 
  7. ^ „TechVision: Innovators of the Net: Brendan Eich and JavaScript”. web.archive.org. Arhivirano iz originala 8. 2. 2008. g. 
  8. ^ „The History of Programming Languages”. oreilly.com. O'Reilly Media. 2004. Arhivirano iz originala 12. 7. 2016. g. Pristupljeno 16. 7. 2016. 
  9. ^ „What Is JavaScript?” (PDF). wiley.com. Wiley. Pristupljeno 16. 7. 2016. 
  10. ^ Noorda, Brent (21. 9. 2013). „Brent Noorda's Answers on ECMA”. quora.com. Pristupljeno 16. 7. 2016. 
  11. ^ Noorda, Brent (24. 6. 2010). „History of Nombas”. brent-noorda.com. Pristupljeno 16. 7. 2016. 
  12. ^ Eich, Brendan (21. 6. 2011). „New JavaScript Engine Module Owner”. brendaneich.com. Pristupljeno 16. 7. 2016. 
  13. ^ Netscape Communications Corporation (11. 12. 1998). „Server-Side JavaScript Guide”. oracle.com. Netscape Communications Corporation. Pristupljeno 16. 7. 2016. 
  14. ^ a b v Champeon, Steve (6. 4. 2001). „JavaScript, How Did We Get Here?”. oreilly.com. Arhivirano iz originala 19. 7. 2016. g. Pristupljeno 16. 7. 2016. 
  15. ^ „Microsoft Internet Explorer 3.0 Beta Now Available”. microsoft.com. Microsoft. 29. 5. 1996. Pristupljeno 16. 7. 2016. 
  16. ^ McCracken, Harry (16. 9. 2010). „The Unwelcome Return of "Best Viewed with Internet Explorer". technologizer.com. Pristupljeno 16. 7. 2016. 
  17. ^ „Documentation”. ecmascript.org. Arhivirano iz originala 26. 4. 2011. g. Pristupljeno 16. 7. 2016. 
  18. ^ „Standard ECMA-262, ECMAScript® 2016 Language Specification”. ecma-international.org. jun 2016. Pristupljeno 16. 7. 2016. 
  19. ^ Crockford, Douglas (2001). „JavaScript, The World's Most Misunderstood Programming Language”. crockford.com. Pristupljeno 16. 7. 2016. 
  20. ^ Kowal, Kris (1. 12. 2009). „CommonJS Effort Sets JavaScript on Path for World Domination”. arstechnica.com. Pristupljeno 16. 7. 2016. 
  21. ^ „USPTO Copyright entry #75026640”. USPTO. 
  22. ^ „Sun Trademarks”. Sun Microsystems. Arhivirano iz originala 28. 5. 2010. g. Pristupljeno 8. 11. 2007. 
  23. ^ Flanagan 2006, str. 16.
  24. ^ „JavaScript data types and data structures - JavaScript | MDN”. Developer.mozilla.org. 16. 2. 2017. Pristupljeno 24. 2. 2017. 
  25. ^ „Inheritance and the prototype chain”. Mozilla Developer Network. Mozilla. Pristupljeno 6. 4. 2013. 
  26. ^ Herman, David (2013). Effective JavaScript. Addison-Wesley. str. 83. ISBN 978-0-321-81218-6. 
  27. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. str. 95–97. ISBN 978-1-59327-282-1. 
  28. ^ Katz, Yehuda. „Understanding "Prototypes" in JavaScript”. Pristupljeno 6. 4. 2013. 
  29. ^ Herman, David (2013). Effective JavaScript. Addison-Wesley. str. 125–127. ISBN 978-0-321-81218-6. 
  30. ^ „Properties of the Function Object”. Es5.github.com. Arhivirano iz originala 28. 01. 2013. g. Pristupljeno 26. 5. 2013. 
  31. ^ Flanagan 2006, str. 141.
  32. ^ The many talents of JavaScript for generalizing Role-Oriented Programming approaches like Traits and Mixins, Peterseliger.blogpsot.de, April 11, 2014.
  33. ^ Traits for JavaScript, 2010.
  34. ^ „Home | CocktailJS”. Cocktailjs.github.io. Pristupljeno 24. 2. 2017. 
  35. ^ Angus Croll, A fresh look at JavaScript Mixins, published May 31, 2011.[nepouzdan izvor?]
  36. ^ „Concurrency model and Event Loop”. Mozilla Developer Network. Pristupljeno 28. 8. 2015. 
  37. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. str. 139–149. ISBN 978-1-59327-282-1. 
  38. ^ Robert Nyman, Getters And Setters With JavaScript – Code Samples And Demos, Robertnyman.com, published 29 May 2009, accessed 2 January 2010.
  39. ^ John Resig, JavaScript Getters and Setters, Ejohn.org, 18 July 2007, accessed 2 January 2010
  40. ^ „E4X – Archive of obsolete content | MDN”. Mozilla Developer Network. Mozilla Foundation. 14. 2. 2014. Arhivirano iz originala 24. 07. 2014. g. Pristupljeno 13. 7. 2014. 
  41. ^ a b v g d đ „Primitivni tipovi” (PDF). Arhivirano iz originala (PDF) 26. 04. 2020. g. Pristupljeno 16. 11. 2016. 
  42. ^ a b v g d đ e „Fukcije”. Pristupljeno 18. 11. 2016. 
  43. ^ a b „Nizovi”. Pristupljeno 20. 11. 2016. 
  44. ^ a b v „Date”. Pristupljeno 5. 12. 2016. 
  45. ^ a b v g d đ „Regularni izrazi”. Pristupljeno 20. 11. 2016. 
  46. ^ a b v g d đ e ž z i j k l „Greške” (PDF). Arhivirano iz originala (PDF) 26. 04. 2020. g. Pristupljeno 20. 11. 2016. 
  47. ^ a b v g d đ „Sintaksa”. Pristupljeno 14. 11. 2016. 
  48. ^ „Promenljive”. Pristupljeno 22. 11. 2016. 
  49. ^ „Aritmetički operatori”. Pristupljeno 20. 11. 2016. 
  50. ^ „Operator dodele”. Pristupljeno 20. 11. 2016. 
  51. ^ „Operatori poređena”. Pristupljeno 20. 11. 2016. 
  52. ^ „Logicki operatori”. Pristupljeno 20. 11. 2016. 
  53. ^ „Uslovni operator”. Pristupljeno 20. 11. 2016. 
  54. ^ a b „Bitovski operatori”. Pristupljeno 20. 11. 2016. 
  55. ^ „var – JavaScript – MDN”. The Mozilla Developer Network. Pristupljeno 30. 4. 2016. 
  56. ^ a b v g „If-else”. Pristupljeno 22. 11. 2016. 
  57. ^ „Switch”. Pristupljeno 22. 11. 2016. 
  58. ^ „Do while”. Pristupljeno 22. 11. 2016. 
  59. ^ „While”. Pristupljeno 22. 11. 2016. 
  60. ^ „For”. Pristupljeno 22. 11. 2016. 
  61. ^ „For in”. Pristupljeno 22. 11. 2016. 
  62. ^ „For of”. Pristupljeno 22. 11. 2016. 
  63. ^ „Break”. Pristupljeno 22. 11. 2016. 
  64. ^ „Continue”. Pristupljeno 22. 11. 2016. 
  65. ^ „Import”. Pristupljeno 22. 11. 2016. 
  66. ^ „Export”. Pristupljeno 22. 11. 2016. 
  67. ^ a b v g „Klase”. Pristupljeno 22. 11. 2016. 
  68. ^ „Prototipsko nasleđivanje”. Pristupljeno 18. 11. 2016. 
  69. ^ „Objekti”. Pristupljeno 1. 12. 2016. 
  70. ^ a b „Veb”. Pristupljeno 1. 12. 2016. 
  71. ^ „Dogadjaji”. Arhivirano iz originala 08. 11. 2018. g. Pristupljeno 1. 12. 2016. 
  72. ^ a b v g d „Veb”. Arhivirano iz originala 16. 10. 2016. g. Pristupljeno 1. 12. 2016. 
  73. ^ „JavaScript tracking – Piwik”. Piwik. Arhivirano iz originala 31. 10. 2013. g. Pristupljeno 30. 4. 2016. 
  74. ^ Peter-Paul Koch, Object detection
  75. ^ Peter-Paul Koch, Mission Impossible – mouse position Arhivirano na sajtu Wayback Machine (17. oktobar 2018)
  76. ^ Peter-Paul Koch, Browser detect
  77. ^ „JavaScript – JScript – ECMAScript version history”. Webmasterworld.com. Pristupljeno 30. 4. 2016. 
  78. ^ Resig, John. „Versions of JavaScript”. Ejohn.org. Pristupljeno 30. 4. 2016. 
  79. ^ „Version Information (JScript)”. Msdn.microsoft.com. Pristupljeno 30. 4. 2016. 
  80. ^ „History of the Opera web browser”. www.opera.com. Arhivirano iz originala 06. 09. 2012. g. Pristupljeno 30. 4. 2016. 
  81. ^ „What Version of JavaScript”. Arhivirano iz originala 09. 01. 2017. g. Pristupljeno 10. 01. 2017. 

Literatura

[uredi | uredi izvor]

Spoljašnje veze

[uredi | uredi izvor]