| prethodna sadržaj slijedeća |
| Vodič za core JavaScript 1.5 |
Poglavlje 5 Naredbe
JavaScript sadrži kompaktan skup naredbi koje vašim Web stranicama daje interaktivnost. Ovdje ćete naći pregled takvih naredbi.
Poglavlje sadrži slijedeća poglavlja sa detaljnim opisom svake:
Block naredba: { }
Uvjetne naredbe: if...else i switch
Loop (petlja) naredbe: for, while , do while, label, break i continue (label sama po sebi nije loop naredba, ali se često koristi uz ove naredbe)
Naredbe za manipulaciju objektima: for...in i with
Naredbe za rukovanje izuzecima : try...catch i throw Svaki izraz je također naredba. Vidi Poglavlje 3, "Izrazi i operatori" za potpunu informaciju o naredbama.
Upotrijebite semicolon (;) znak da razdvojite naredbe u JavaScript code-u.
Vidi Core JavaScript Reference za detalje o naredbama.
Block naredba
Block se koristi za grupiranje naredbi. Block se razdvaja parom vitičastih zagrada:
{statement1 statement2 . . .statementn}
Uvjetne naredbe
Uvjetna naredba je skup komandi koje se izvršavaju ako je uvjet true (istinit). JavaScript podržava dvije uvjetne naredbe: if...else i switch .
if...else naredba
Upotrijebite if naredbu za izvršavanje određenih naredbi ukoliko je logički uvjet true. Koristite opcionalni else za izvođenje drugih naredbi ako je uvjet false. Naredba if izgleda ovako:
if (uvjet) {
naredbe1
}
[else {
naredbe2
} ]Uvjet može biti bilo koji JavaScript izraz koji se procjenjuje na true ili false. Naredbe koje se izvršavaju mogu biti bilo koje JavaScript naredbe, uključujuči i daljnje ugnježđene if naredbe.Ako koristite više od jedne naredbe nakon if ili else morate ih zatvoriti u vitičastu zagradu {}.
Ne bi se trebalo koristiti jednostavno pridruživanje kao uvjet. Npr., ne koristite slijedeće:
if(x = y)
{
/* uradi pravu stvar */
}Ako trebate jednostavno pridruživanje unutar uvjeta stavite dodatne zagrade. Npr., upotrijebite nešto ovako: if( (x = y) ).
Ne brkajte primitivne Boolean vrijednosti true i false sa true i false vrijednostima Boolean objekta. Bilo koji objekt čija vrijednost nije definirana, null, zero, NaN ili prazan string, uključujući i Boolean objekt čija vrijednost je false, daje rezultat true kada prođe kroz uvjet. Npr.:
var b = new Boolean(false);
if (b) // ovaj uvjet je true
Primjer. U narednom primjeru, funkcija checkData daje true ako je broj znakova u Text objektu tri; u protivnom prikazuje upozorenje i daje false.
function checkData () {
if (document.form1.threeChar.value.length == 3) {
return true
} else {
alert("Enter exactly three characters. " +
document.form1.threeChar.value + " is not valid.")
return false
}
}
Naredba switch
Naredba switch dopušta da program procjenjuje izraz te pokušava da pronađe podudarnost njegove vrijednosti i case labela. Ukoliko se podudarnost pronađe, program izvršava pridruženu naredbu. Naredba switch izgleda ovako:
switch (izraz){
case label :
naredba;
break;
case label :
naredba;
break;
...
default : naredba;
}
Program prvo traži da li se label podudara sa vrijednošću izraza, a zatim izvršava pridruženu naredbu. Ukoliko se ne nađe podudarna labela, program traži opcionalnu default naredbu te ako ju nađe izvršava pridruženu joj naredbu. Ako pak default naredba ne postoji, program se nastavlja iza switch naredbe.
Opcionalna break naredba pridružena svakom case labelu osigurava da program izađe iz switch naredbe kada se podudarna naredba izvrši te da se program nastavi izvršavati na kraju switch naredbe. Ako se break ispusti, program se nastavlja izvršavati kod naredne naredbe unutar switch naredbe.
Primjer. U narednom primjeru, ako expr daje "Bananas", program nalazi podudarnost sa case-om "Bananas" te izvršava pridruženu naredbu. Nakon što se izvrši break program završava sa switch te izvršava naredbu nakon switch -a. Da je break izostavljen, naredba za case (slučaj) "Cherries" također bi se izvršio.
switch (expr) {
case "Oranges" :
document.write("Oranges are $0.59 a pound.<BR>");
break;
case "Apples" :
document.write("Apples are $0.32 a pound.<BR>");
break;
case "Bananas" :
document.write("Bananas are $0.48 a pound.<BR>");
break;
case "Cherries" :
document.write("Cherries are $3.00 a pound.<BR>");
break;
default :
document.write("Sorry, we are out of " + i + ".<BR>");
}
document.write("Is there anything else you'd like?<BR>");
Loop (petlja) naredbe
Loop je skup naredbi koje se uzastopno izvršavaju sve dok se ne zadovoljeni uvjet. JavaScript podržava for, do...while i while loop naredbe, a također i label (label sam po sebi nije loop naredba, ali se često kristi uz ove naredbe). Nadalje, može se koristiti break i continue naredbe unutar loop naredbi. Druga naredba, for...in , izvršava naredbe sa ponavljanjima,ali se koristi i za manipulaciju objektima. Vidi Naredbe za manipulaciju objektima.
Naredba for
For loop (petlja) se ponavlja sve dok određeni uvjet ne postane false (lažan). JavaScript for petlja je slična Java i C for petlji. Sintaxa je:
for ([početniIzraz]; [uvjet]; [incrementIzraz ]) {
naredbe
}
Kada se for petlja izvršava, događa se slijedeće:
Primjer. Naredna funkcija sadrži for naredbu koja prebrojava odabrane opcije u scrolling popisu ( Select objekt koji dozvoljava višestruki odabir). Naredba for deklarira varijablu i te postavlja ju na nultu početnu vrijednost. Zatim provjerava da je i manje od broja opcija u Select objektu, izvršava narednu if naredbu te povećava i za jedan nakon svakog prolaska kroz petlju.
Izvršava se početni izraz ukoliko postoji. Ovaj izraz obično inicijalizira jedan ili više loop brojača, ali sintaxa dozvoljava da izraz ima bilo koji stupanj kompleksnosti. Ovaj izraz može takođe deklarirati varijablu.
Izvršava se uvjetni izraz. Ukoliko je true, petlja se izvršava. Ako uvjet postane false, for petlja skončava. Ako se uvjetni izraz izostavi, smatra se da je uvjet true.
Izraz za osvježavanje incrementIzraz, ukoliko postoji, izvršava se i kontrolira povratak na Korak 2.
<SCRIPT>
function howMany(selectObject) {
var numberSelected=0;
for (var i=0; i < selectObject.options.length; i++) {
if (selectObject.options[i].selected==true)
numberSelected++;
}
return numberSelected;
}
</SCRIPT>
<FORM NAME="selectForm">
<P><B>Choose some music types, then click the button below:</B>
<BR><SELECT NAME="musicTypes" MULTIPLE>
<OPTION SELECTED> R&B
<OPTION> Jazz
<OPTION> Blues
<OPTION> New Age
<OPTION> Classical
<OPTION> Opera
</SELECT>
<P><INPUT TYPE="button" VALUE="How many are selected?"
onClick="alert ('Number of options selected: ' + howMany(document.selectForm.musicTypes))">
</FORM>
do...while naredba
Naredba do...while se ponavlja sve dok određeni uvjet ne postane false. A izgleda ovako :Naredba se izvršava jednom prije nego je uvjet provjeren. Ako je uvjet true naredba se ponovo izvršava. Uvjet se provjerava na kraju svakog izvršenja . Kada uvjet postane false izvršavanje se zaustavlja te se kontrola prosljeđuje naredbi nakon do...while petlje .
Primjer. U narednom primjeru do petlja iterira najmanje jednom i to ponavlja sve dok i ne postane manje od 5.
do {
i+=1;
document.write(i);
} while (i<5);
while naredba
Naredba while izvršava svoje naredbe sve dok je uvjet true. Ona izgleda ovako:
Ako uvjet postane false, naredbe unutar petlje se stopiraju te se nastavlja s izvršavanjem naredbe iza petlje. Test uvjeta se odigrava prije nego se naredbe počnu izvršavati. Ako je uvjet true naredbe se izvršavaju te se uvjet ponovno testira. Kad uvjet postane false izvršavanje se stopira te se nastavlja s izvršavanjem naredbe iza petlje.
Primjer 1. Naredna while petlja iterira sve dok je n manje od tri:
n = 0;
x = 0;
while( n < 3 ) {
n ++;
x += n;
}
Sa svakom iteracijpm, petlja povećava n i dodaje tu vrijednost x -u. Tako da x i n poprimaju slijedeće vrijednosti:
Nakon svršetka trećeg prolaska uvjet n < 3 više nije true pa se petlja zaustavlja.
Primjer 2: infinite loop (beskonačna petlja). Osigurajte da uvjet jednom postane false jer se inače petlja nikad neće okončati. U ovom primjeru naredba će se vječno izvršavati jer je uvjet uvijek true:
while (true) {
alert("Hello, world") }
label naredba
Label omogućava postojanje naredbe sa identifikatorom koji omogućava da ju pozovemo (petlju) bilo gdje u programu. Npr., može se upotrijebiti label za identificiranje petlje, a zatim koristiti break ili continue naredbe da bi petlju nastavili ili ju prekinuli.
Vrijednost label -a može biti bilo koji JavaScript identifikator koji nije rezervirana riječ. Naredba koju identificiramo s labelom može biti bilo koja naredba.
Primjer. U ovom primjeru, labela markLoop identificira while petlju.
markLoop:
while (theMark == true){
doSomething();
}
break naredba
Upotrijebite break naredbu za prekidanje petlje, switch -a ili label naredbe.
Sintaxa je:
Kad se koristi break bez labele, okončava najunutrašnjiji while, do-while , for ili switch i prenosi kontrolu na slijedeću naredbu.
Kad upotrijebite break sa labelom, okončava labeliranu naredbu.
Prvi oblik sintaxe okončava najunutrašnjiju petlju ili switch. Drugi oblik sintaxe okončava labeliranu naredbu.
Primjer. Ovaj primjer iterira kroz elemente niza sve dok ne nađe index elementa čija je vrijednost theValue:
for (i = 0; i < a.length; i++) {
if (a[i] = theValue)
break;
}
continue naredba
Naredba continue može se koristiti za restart while, do-while , for ili label naredbe.
Sintaxa je:
Kad se koristi continue bez labela, okončava trenutnu iteraciju najunutrašnjije while, do-while ili for naredbe i nastavlja izvršavati istu petlju slijedećom iteracijom. Nasuprot break naredbi, continue ne okončava izvršavanje čitave petlje. U while petlji skače ponovno na uvjet. U for petlji skače na incrementIzraz (izraz za povećavanje) .
Kad se koristi continue sa labelom, odnosi se na naredbu petlje označenu labelom.
Primjer 1. Primjer pokazuje while petlju sa continue naredbom koja se izvršava kada je i jednako tri. Na ovaj način n uzima vrijednosti jedan, tri, sedam i dvanaest.
i = 0;
n = 0;
while (i < 5) {
i++;
if (i == 3)
continue;
n += i;
}Primjer 2. Naredba labelirana sa checkiandj sadrži naredbu labeliranu sa checkj. Kada program dođe do continue završava se trenutna iteracija od checkj i započinje slijedeća. Svaki put kada se dođe do continue, checkj ponovo iterira sve dok uvjet postane false. Kada je false vraćen, ostatak od checkiandj naredbe se završava i checkiandj ponovno iterira sve dok uvjet ne postane false. Kada je false vraćen, program nastavlja s naredbom iza checkiandj.
Ako continue ima labelu checkiandj , program će nastaviti sa vrha checkiandj naredbe.
checkiandj :
while (i<4) {
document.write(i + "<BR>");
i+=1;
checkj :
while (j>4) {
document.write(j + "<BR>");
j-=1;
if ((j%2)==0)
continue checkj;
document.write(j + " is odd.<BR>");
}
document.write("i = " + i + "<br>");
document.write("j = " + j + "<br>");
}
Naredbe za manipulaciju objektima
JavaScript upotrebljava for...in te with naredbe pri manipulaciji objektima.
for...in naredba
Naredba for...in iterira određenu varijablu kroz sva svojstva objekta. Za svako različito svojstvo JavaScript izvršava određenu naredbu.Sintaxa glasi:
for (varijabla in objekt) {
naredbe ; }
Primjer. Naredna funkcija uzima za svoj argument objekt i naziv objekta. Zaim iterira kroz sva svojstva objekta i daje kao rezultat string koji izlistava nazive svojstava i njihove vrijednosti.
function dump_props(obj, obj_name) {
var result = "";
for (var i in obj) {
result += obj_name + "." + i + " = " + obj[i] + "<BR>"
}
result += "<HR>";
return result;
}
Za objekt car sa svojstvima make i model rezultat je:
car.make = Ford
car.model = Mustang
with naredba
Naredba with stvara default objekt za skup naredbi. JavaScript pretražuje svaki nekvalificirani naziv unutar skupa naredbi da odredi da li su to nazivi svojstava default objekta. Ukoliko se nekvalificirani naziv podudara sa svojstvom tada je svojstvo upotrijebljeno u naredbi; inače se upotrijebi local ili global varijabla.
Primjer. Naredna with naredba određuje da Math objekt bude default objekt. Naredbe nakon with odnose se na PI svojstvo te na cos i sin metode bez specificiranja objekta.
var a, x, y;
var r=10 ;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI/2);
}
Uočite: Upotreba with naredbe može znatno usporiti vaš program.
Komentari
Komentari su zabilješke autora koje pokazuju što skripta radi. Interpreter ignorira komentare. JavaScript podržava Java i C++ komentare:
Ispred komentara u jednoj liniji stavi se double-slash (//). Primjer. Naredni primjer pokazuje 2 komentara:
// Ovo je komentar u jednoj liniji.
/* Ovo je komentar u više linija. Može biti bilo koje veličine i ovdje možete staviti što god hoćete. */
Naredbe za rukovanje izuzecima
Izuzeci se mogu izbaciti sa throw naredbom, a upravljat sa izuzecima pomoću try...catch naredbi.
Takođe koristite try...catch za rukovanje Java izuzecima. Vidi "Rukovaje sa Java izuzecima u JavaScriptu" str. 141 te "Rukovanje sa JavaScript izuzecima u Javi" str. 144 .
Naredba throw
Upotrijebite throw naredbu za izbacivanje izuzetka. Kada izbacite izuzetak određujete izraz koji sadrži vrijednost izuzetka:
Naredni code izbacuje nekoliko izuzetaka.
throw "Error2"; // generira izuzetak sa string vrijednošću generira izuzetak sa vrijednošću 42
throw 42; //
throw true; // generira izuzetak sa vrijednoću true
Kada se izbacuje izuzetak može se odrediti i objekt. Tada se može pozvati svojstvo objekta u catch bloku. Naredni primjer stvara objekt myUserException tipa UserException i to koristi u throw naredbi.
// Stvaranje objekta UserException
function UserException (message) {
this.message=message;
this.name="UserException";
}
// Kreira stavku objekta i izbacuje ju
myUserException=new UserException("Value too high");
throw myUserException;
Naredba try...catch
Naredba try...catch markira blok naredbi da iskuša i odredi jedan ili više odziva na koje izuzetak treba biti izbačen. Ako je izuzetak izbačen, try...catch naredba ga hvata.
Naredba try...catch sastoji se od try bloka, koji sadrži jednu ili više naredbi, te nijedan ili više catch blokova, sadržavajući naredbe koje određuju što da se radi ako je izuzetak bačen u try blok. To jest, želite da try block slijedi iza, a ako ne, želite kontrolirati prijelaz na catch blok. Ukoliko bilo koja naredba u try bloku (ili u funkciji pozvanoj iz try bloka) izbaci izuzetak, kontrola se pomiče na catch blok. Ukoliko nijedan izuzetak nije izbačen u try bloku, catch blok se preskače. Posljednji blok se izvršava nakon try i catch blokova, ali prije naredbi koje slijede iza try...catch naredbe.
Naredni primjer koristi try...catch naredbu. Primjer poziva funkciju koja uzima ime mjeseca iz niza zasnovanog na vrijednosti proslijeđenoj funkciji. Ako vrijednost ne odgovara broju mjeseca (1-12), izuzetak je bačen sa vrijednošću "InvalidMonthNo" i naredbe u catch bloku postavljaju varijablu monthName u "unknown".
function getMonthName (mo) {
mo=mo-1; // Adjust month number for array index (1=Jan, 12=Dec)
var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
"Aug","Sep","Oct","Nov","Dec");
if (months[mo] != null) {
return months[mo]
} else {
throw "InvalidMonthNo"
}
}
try {
// statements to try
monthName=getMonthName(myMonth) // function could throw exception
}
catch (e) {
monthName="unknown"
logMyErrors(e) // pass exception object to error handler
}
catch blok
Može se koristiti jedan catch blok za upravljanje svim izuzecima koji su stvoreni u try bloku ili se može upotrijebiti zasebni catch blokovi od kojih će svaki upravljati posebnim tipom izuzetka.
Single catch Block
Upotrijebite jedan try...catch naredbeni catch blok (recovery block) da izvršite code koji upravlja pogreškama za bilo koji izuzetak izbačen u try bloku.
Jednostruki catch blok ima sintaxu:
catch (catchID) {
statements
}Blok catch određuje identifikator (catchID u prethodnoj sintaxi) koji drži vrijednosti određene pomoću throw naredbe. Ovaj identifikator može se upotrijebiti za prikupljanje informacije o izuzetku koji je izbačen. JavaScript stvara ovaj identifikator kada se catch blok unosi;identifikator traje samo dok traje catch blok; nakon što catch blok završi izvršavanje identifikator više nije dostupan.
Npr., naredni code izbacuje izuzetak. Kad se desi izuzetak kontrola prelazi na catch blok.
try {
throw "myException" // generates an exception
}
catch (e) {
// statements to handle any exceptions
logMyErrors(e) // pass exception object to error handler
}
Višestruki catch blokovi
Jedna try naredba može imati više uvjetnih catch blokova, tako da svaki upravlja određenim tipom izuzetka. U ovom slučaju, odgovarajući uvjetni catch blok se unosi samo kad je izbačen izuzetak određen za taj blok. Takođe možete ukjlučiti opcionalni catch-all catch block za sve neodređene izuzetke kao posljednji catch blok u naredbi.
Npr., naredna funkcija poziva tri druge funkcije (deklarirane bilo gdje), koje provjeravaju valjanost svojih argumenata.Ako funkcija odredi da je komponenta nevaljala, daje 0, uzrokujući bacanje određenog izuzetka.
function getCustInfo(name, id, email)
{
var n, i, e;
if (!validate_name(name))
throw "InvalidNameException"
else
n = name;
if (!validate_id(id))
throw "InvalidIdException"
else
i = id;
if (!validate_email(email))
throw "InvalidEmailException"
else
e = email;
cust = (n + " " + i + " " + e);
return (cust);
}Uvjetni catch blokovi šalju kontrolu odgovarajućem rukovatelju izuzetkom.
// function could throw three exceptions
getCustInfo("Lee", 1234, "lee@netscape.com")
}
catch (e if e == "InvalidNameException") {
// call handler for invalid names
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
// call handler for invalid ids
bad_id_handler(e)
}
catch (e if e == "InvalidEmailException") {
// call handler for invalid email addresses
bad_email_handler(e)
}
catch (e){
// don't know what to do, but log it
logError(e)
}
Blok finally
Blok finally sadrži naredbe koje se izvrše nakon try i catch blokova ali prije naredbi koje su iza try...catch naredbe. Blok finally se izvršava bez obzira da li je izuzetak bačen ili ne. Ako je izuzetak bačen, naredbe u finally bloku se izvršavaju čak iako nijedan catch blok ne upravlja izuzetkom.
F inally block može se upotrijebiti tako da vam skripta bude "otporna" na propuste. Naredni primjer otvara fajl, a zatim izvršava naredbe koje koriste taj fajl (server-side JavaScript dopušta pristup fajlovima). Ukoliko je izuzetak bačen dok je fajl otvoren, finally blok zatvara fajl prije završetka skripte.
openMyFile();
try {
writeMyFile(theData)
}
finally {
closeMyFile() // always close the resource
}
Ugnježđivanje try...catch naredbi
Može se ugnjezditi jedna ili više try...catch naredbi. Ako unutrašnja try...catch naredba nema catch blok, ograđivajući try...catch naredbeni catch blok se provjerava za podudaranje.
prethodna sadržaj slijedeća
Copyright © 2000 Netscape Communications Corp. All rights reserved.
Posljednje
izmjene Rujan 28, 2000