Argomenti trattati: il controllo dei cicli nella sintassi JavaScript.
Finora abbiamo visto come realizzare delle strutture iterative che eseguano un certo numero di istruzioni fino a che la loro condizione di fine non viene soddisfatta. Tuttavia esistono altri due modi, in JavaScript, per uscire da un ciclo prima che questo giunga naturalmente a conclusione o per "saltare" momentaneamente, tutte o in parte, le istruzioni in esso contenute ricominciando poi un altro ciclo di istruzioni. Nel primo caso si fa ricorso all'istruzione break, nel secondo si utilizza continue. Queste due istruzioni espandono notevolmente le possibilità di utilizzare le strutture iterative, consentendo di modificare durante l'esecuzione il "comportamento" di un ciclo a seconda delle evenienze che si presentano. Andiamo ora a trattare nel dettaglio le due istruzioni.
Come è facile intuire l'istruzione break consente di interromprere l'esecuzione di un ciclo senza che la sua condizione di fine sia stata soddisfatta. L'istruzione break si rivela utile se si ha l'esigenza di uscire forzatamente da un ciclo quando una condizione "speciale" richiede la fine anticipata delle iterazioni. Il listato che segue è un esempio di un caso del genere:
<html>
<title>Utilizzo di break</title>
<head>
<script language="JavaScript">
<!--
for (var i=1, somma=0, num=''; i<=10; i++) {
num=prompt('Introdurre un valore: ','');
if (num.toLowerCase()=='fine') break;
somma+=parseInt(num);
}
alert('La somma totale è: ' + somma);
-->
</script>
</head>
// Nell'esempio un ciclo for è utilizzato per chiedere all'utente 10 valori di cui alla fine sarà visualizzata la somma. Normalmente il ciclo andrebbe avanti fino a che la variabile contatore i non fosse uguale a 10. Tuttavia in questo caso è stata prevista la possibilità che l'utente voglia terminare il ciclo anticipatamente, e per far questo non deve far altro che digitare la parola "fine" nella stessa casella di testo in cui digita i valori da sommare. Una volta che il ciclo viene interrotto dall'istruzione break il controllo passa alle istruzioni immediatamente successive al blocco di codice del ciclo; in questo caso all'istruzione alert. L'uso del metodo parseInt() è necessario per convertire una variabile stringa come num nel valore intero del numero digitato dall'utente. Di tale metodo si parlerà piú diffusamente quando si tratterà l'oggetto Global.
Dalla versione 1.2 del linguaggio, in JavaScript l'istruzione break può essere utilizzata con maggiore precisione. È necessario specificare, infatti, che quando si utilizza un'istruzione break in un ciclo che a sua volta è annidato in un altro ciclo - che sia dello stesso tipo o no, è ininfluente - tale istruzione consente di uscire solo dal ciclo in cui se ne fa uso, ossia da quello piú annidato. Ne consegue che, se vi fosse bisogno di uscire da tutti i cicli, si dovrebbe ripetere la stessa condizione in ciascuno di essi. JavaScript però possiede una soluzione molto "elegante" per ovviare all'inconveniente; in esso, a differenza di molti altri linguaggi di programmazione, inclusi quelli piú strettamente affini, è possibile utilizzare una label - che in inglese sta per "etichetta" - per uscire in un sol colpo da tutta la struttura nidificata, indipendentemente dal suo livello di annidamento e senza correre il rischio di destrutturare il programma come accade in altri linguaggi se si utilizza una label con un'istruzione goto. Ciò è possibile facendo precedere al codice del primo ciclo - ovvero di quello piú esterno - un identificatore alfanumerico seguito dal segno dei due punti (:). Successivamente quando si utilizza l'istruzione break sarà sufficiente far seguire il nome dell'etichetta per ottenere di uscire dall'intera struttura nidificata. Anche in questo caso il controllo del flusso passa alla prima istruzione immediatamente successiva al blocco di codice contrassegnato dalla label. L'esempio qui sotto mostra l'utilizzo di un'istruzione break seguita dal nome di un'etichetta per uscire da tre cicli nidificati.
<html>
<title>Utilizzo di break con una label</title>
<head>
<script language="JavaScript">
<!--
cicli_Annidati:
for (var i=1; i<=10;) {
for (var num=''; i<=10;) {
num=prompt('Introdurre un valore: ','');
for (var somma=0; i<=10; i++) {
if (num.toLowerCase()=='fine') break cicli_Annidati;
somma+=parseInt(num);
}
}
}
alert('La somma totale è: ' + somma);
-->
</script>
</head>
// Nel listato appena mostrato l'esempio precedente è stato "spezzettato" in tre cicli for nidificati. Nel ciclo piú interno è stata utilizzata un'istruzione break seguita dal nome della label "cicli_Annidati" che è posta prima del codice dei tre cicli. Provando l'esempio ci si renderà conto di come l'utilizzo di una sola istruzione break con il nome di un'"etichetta" permetta di uscire istantaneamente da un numero qualsiasi di cicli nidificati.
L'istruzione continue invece consente di anticipare forzatamente l'iterazione di un ciclo saltando le istruzioni che si trovano fra essa e la condizione di fine. L'esempio seguente è una variante del primo; in esso è stata aggiunta un'istruzione continue che viene eseguita nel caso che l'utente prema "OK" senza aver digitato alcun numero valido.
<html>
<title>Utilizzo di continue</title>
<head>
<script language="JavaScript">
<!--
for (var i=1, somma=0, num=''; i<=10; i++) {
num=prompt('Introdurre un valore: ','');
if (num.toLowerCase()=='fine') break;
if (isNaN(parseInt(num))) continue;
somma+=parseInt(num);
}
alert('La somma totale è: ' + somma);
-->
</script>
</head>
// In questo caso, se l'utente digitasse caratteri alfanumerici o se premesse invio senza digitare niente, il ciclo continuerebbe le sue iterazioni ma senza eseguire alcuna somma. L'istruzione posta dopo continue, in questo caso il codice della somma aritmetica, viene saltata e il controllo ritorna alla "testa" del ciclo che provvede ad eseguire il controllo della condizione e, se ancora questa non dovesse essere stata soddisfatta, a incrementare nuovamente la variabile contatore i. Per capire la differenza tra questo e il codice dell'esempio precedente si provi a digitare caratteri non validi sia in questo che nell'altro. Si potrà verificare come nel primo, mancando questo tipo di controllo, le somme vengano ugualmente eseguite ma alla fine il risultato non sarà valido come numero ma sarà NaN, acronimo di Not a Number. Il metodo isNaN, utilizzato in questo secondo esempio, permette appunto di eseguire un controllo del genere. Come parseInt anche isNaN appartiene all'oggetto Global a cui si rimanda per la sua trattazione.
Abbiamo visto come è possibile controllare ancora piú specificamente l'esecuzione di uno o piú cicli grazie all'utilizzo di break e continue. Prima di passare all'argomento successivo si consiglia di approfondire bene quanto visto finora, che costituisce, dagli identificatori fino ai cicli, la sintassi fondamentale di JavaScript. Sarebbe inutile proseguire oltre se non si padroneggiassero con discreta disinvolura i costrutti sintattici di base. Si consiglia quindi di fare molti esercizi allo scopo di impratichirsi il piú possibile di quanto trattato finora dopodiché sarà possibile continuare con la trattazione approfondita delle funzioni.