Corso JavaScript

CORSO DI JAVASCRIPT


Terza Parte - Comandi JavaScript; ancora sui Commenti; Comandi di cicli e iterazioni: for, for..in, while; Syntax-highlighting; Interruzione e prosecuzione di un ciclo: Break e Continue; Le Funzioni - Creazione di funzioni e procedure definite dall'utente; Il comando Return; Comandi condizionali: if..else; Il comando ?;

di Luciano Giustini

Nota - La pagina si presta ottimamente ad essere stampata: consiglio senz'altro questa soluzione per meglio comprendere il codice e la struttura dei paragrafi. Può essere ancora meglio affiancare la versione elettronica con quella cartacea per gli esempi inseriti da salvare. Il Corso è anche pubblicato con struttura frame su Web alla URL http://www.beta.it/beta/ext/corsi/js-11

Ricordo che, prima della fine del corso, darò conto anche delle modifiche introdotte nella nuova implementazione standard di JavaScript, definita EcmaScript. E' possibile vedere fin d'ora di cosa si tratta collegandosi all'indirizzo http://www.ecma.ch/.

Abbiamo visto nella scorsa puntata come scrivere la nostra prima funzione in JavaScript, la sintassi e gli errori, e alcune indicazioni per le dichiarazioni. Vediamo ora di entrare nel merito introducendo i comandi JavaScript, alcuni dei quali (i fondamentali) saranno oggetto di paragrafi a parte.

Comandi JavaScript

I comandi possono essere costituiti da blocchi di codice, e abbiamo visto il costrutto della funzione che può servire a contenerli, oppure da singole righe di codice.Ogni comando che occupa una singola linea può avere un punto e virgola (;) che indica la fine del comando. Ricordarsi che JavaScript è un linguaggio case-sensitive, distingue cioè le maiuscole dalle minuscole. Al contrario dell'HTML, quindi, ma attenzione: il codice JavaScript dentro al codice HTML è ancora case-sensitive tranne per quello che viene considerato a tutti gli effetti come tag HTML. Un esempio varrà più di tante parole:
   <HTML>
      <SCRIPT LANGUAGE="JavaScript">
      <!-- 
      function doThis() {
         alert("Salve, e benvenuto al Corso JavaScript di BETA");
         }
      //-->
      </SCRIPT>
   <BODY>
   <H4>Esempio di una finestra "alert"</H4>
   <FORM>
     <INPUT TYPE="BUTTON" VALUE="Mostra Alert" ONCLICK="doThis()">
   </FORM>
   </BODY>
   </HTML>

OnClick, attributo di evento JavaScript, in questo caso diventa a tutti gli effetti un tag HTML e come tale la sintassi è case - insensitive: può essere scritto tutto maiuscolo, minuscolo, ecc. La chiamata di funzione doThis(), come valore, deve essere invece scritta esattamente come è stata dichiarata.

Commenti

La volta scorsa abbiamo visto brevemente i commenti da includere per rendere compatibile una pagina contenente comandi JavaScript con i client Web vecchi. Vediamo ora quali sono i commenti che invece riguardano il linguaggio JavaScript vero e proprio. Apro una parentesi per consigliare vivamente l'uso di righe di commento a compendio e spiegazione del codice presente. Molto spesso le modifiche, gli aggiornamenti, rivestono un ruolo fondamentale nella corretta gestione di pagine JavaScript, e operare su centinaia di righe senza ricordarsi esattamenteil loro significato può voler dire molti mal di testa in più e tempo speso male. Segnate inoltre nome dell'autore, eventuale copyright e data di creazione/aggiornamento all'inizio del codice.
I commenti si dividono tra quelli a riga singola (//.. ) e quelli composti (/* .. */); questi ultimi servono qualora vogliate scrivere annotazioni su più righe. Per esempio:
   <SCRIPT LANGUAGE="JavaScript">
   <!--
   // Commento su una riga 

   /*  Commento su più righe  - Questa è la prima...
    Questa è la seconda...
    Questa è la terza riga di commento  */

   ..codice..
   //-->
   </SCRIPT>

Comandi di cicli e iterazioni: for, for..in, while

JavaScript possiede tre (o due, in pratica) comandi di iterazione: for, for..in e while, oltre ai comandi break e continue. Sembrerà poco, ma comunque la potenza di questi costrutti in pratica serve a risolvere virtualmente qualsiasi problema iterativo, senza ricorrere alla ricorsività. Pratica, quest'ultima, che genera anche il problema della saturazione di memoria, specie per codici molto costosi in termini di risorse. Meglio quindi i cicli; che vediamo ora, sono molto simili a quelli di Java e C, e quindi non mi dilungherò eccessivamente sulle spiegazioni di ogni singola semantica.

    For

    sintassi

    for ([initial-expression]; [condition]; [update-expression]) { statement(s)... }

    esempio

       <SCRIPT LANGUAGE="JavaScript">
       <!--
       function exampleLoop() {
          for (var size=5; size <= 10; size+=5)
              document.write('<HR ALIGN=LEFT WIDTH=' + size + '%>');
          }   
       //-->
       </SCRIPT>
    
Notare che non ci sono le parentesi graffe all'interno del ciclo for, poichè in questo caso c'è un solo comando (e una sola riga di codice).

Una variazione del ciclo for è for..in, utilizzato per analizzare le proprietà di un oggetto, che identifichiamo con objectName, tramite l'ausilio di un contatore (i nell'esempio). In JavaScript una proprietà è un valore che appartiene a un oggetto; molti oggetti JavaScript possiedono una serie di proprietà il cui valore può essere ricavato ed eventualmente modificato.

    For..in

    sintassi

    for (index in objectName) { statement(s).. }

    esempio

       <SCRIPT LANGUAGE="JavaScript">
       <!--
       function showProperties(obj, name) {
             document.write('<TABLE BORDER=1><TR><TD ALIGN=MIDDLE>'+
             name + '</TD></TR>');
             for (i in obj) 
                document.writeln('<TD>' + i + '</TD>');
             document.writeln('</TABLE>');
             }   
    
       showProperties(document, 'document');
       //-->
       </SCRIPT>
    
Notiamo alcune cose: alla funzione sono passate due variabili; una delle due è chiamata obj, e non per esempio object, che potrebbe sembrare più intuitivo, perchè object è una parola riservata.Fate sempre attenzione quando scegliete i nomi di variabili a considerare le parole riservate; consultate le tabelle aggiornate fornite assieme all'implementazione di JavaScript che state usando (vedi riferimenti, sotto).

Syntax-highlighting
Un buon metodo per ridurre la frequenza di questo inconveniente, e comunque per scrivere "meglio" in codice, sia JavaScript sia HTML, può essere quello di utilizzare un editor con il syntax-highlight corretto. In questo modo le parole riservate verranno evidenziate rispetto al codice circostante. Nei riferimenti, collegandosi al settore di BETA "Download Software", consigliamo alcuni editor tra quelli syntax-highlight: Editeur (http://www.studioware.com), TextPad (http://www.textpad.com) e HomeSite, provato su questo stesso numero di BETA. In ogni caso un editor con la sintassi HTML dovrebbe prevedere la personalizzazione dei tag così come quella di JavaScript, visto che nuovi comandi vengono aggiunti ad ogni release di Netscape. Anche la colorazione dovrebbe essere personalizzabile, considerando che quella proposta da Netscape stessa, di cui vediamo un esempio in figura (view-source), appare attualmente la più gradita, e più utilizzata dagli editor a meno di piccole differenze.

Syntax-Highlighting Syntax-highlighting - Ecco come appare un documento HTML e JavaScript visualizzato tramite il comando View, Page Source da Netscape 4.0. Il tipo di sintassi colorata adottata da Netscape appare la più gradita agli sviluppatori e molti editor HTML vi si rifanno per la visualizzazione dei codici.

Una buona regola di scrittura, soprattutto quando il codice JavaScript è molto lungo e complesso, è di indentare (rientrare le righe) il codice secondo le strutture e le appartenenze. Questa è tra l'altro una pratica molto consigliata anche per tutti i linguaggi di programmazione, e il JavaScript non fa eccezione.

Vediamo adesso il ciclo while, terzo costrutto iterativo del linguaggio JavaScript. Con questo tipo di ciclo si possono eseguire uno o più comandi JavaScript mentre sussiste una condizione. Anche qui, se dentro al corpo del ciclo si devono eseguire più istruzioni esse vanno racchiuse tra parentesi graffe, viceversa non ve n'è bisogno.

    While

    sintassi

    while (loopCondition) { statement(s).. }

    esempio

       <SCRIPT LANGUAGE="JavaScript">
       <!--
       function showMoltiplication(number) {
             var iLoop = 1;
             document.write('<B>Tavola moltiplicativa per:</B> ' + 
             number + '</B><HR NOSHADE SIZE=1><PRE>');
             while (iLoop <= 10) {
                document.writeln(iLoop + 'x' + number + 
                '=' + (iLoop * number));
                iLoop++;
                }
             document.writeln('</PRE>');
             }   
    
       showMoltiplication(5);
       //-->
       </SCRIPT>
    
Notiamo, in questo caso, che la tavola moltiplicativa dell'esempio si ferma dopo 10 iterazioni. La funzione viene chiamata fornendo direttamente un numero; in una sistemazione definitiva si può utilizzare l'input dell'utente, tramite un prompt (sintassi: prompt('userMessage', [inputDefault])), oppure una form scritta ad-hoc.

Interruzione e prosecuzione di un ciclo: Break e Continue

Il comando break (sintassi: break;) serve a interrompere un ciclo, come for, while, facendolo terminare nel punto in cui si trova il comando e passando il controllo al comando successivo al ciclo. Nell'ultimo esempio che abbiamo visto proviamo a porre il comando break come segue:
     ...
     while (iLoop <= 10) {
        if (iLoop == 6)
           break;
        ...
        }
     // l'uscita dal ciclo while porta qui
     ...
Quindi la funzione del comando break è quella di uscire dal ciclo. Il comando continue (sintassi: continue;) invece di provocare l'uscita dal ciclo ne obbliga l'iterazione successiva. In altre parole promuove la prosecuzione del ciclo in cui si trova; se questo è un while, il comando continue fa ripartire il ciclo ritornando alla condizione iniziale, mentre in un ciclo for (e for..in) salta alla update-expression.

Le Funzioni - Creazione di funzioni e procedure definite dall'utente

Nella seconda parte del corso abbiamo introdotto le funzioni, il costrutto di JavaScript per i blocchi di codice che realizzano uno specifico task ed eventualmente restituiscono un valore. Funzioni e procedure sono la stessa cosa in JavaScript; le procedure eseguono un certo blocco di codice mostrando alla fine un risultato, mentre le funzioni realizzano un certo processo restituendo uno specifico valore.
     function doThis() {
        var odiern = new date();
        alert("Salve! Oggi e' il " + odiern);
        }
Ogni funzione per essere eseguita ha bisogno di una chiamata di funzione. Ne abbiamo viste alcune negli esempi precedenti. Le chiamate possono avvenire in qualsiasi punto della pagina (o della struttura frame, che vedremo in seguito nel Corso), a patto di trovarsi in un JavaScript scope :
    dentro un corpo JavaScript: <SCRIPT>doThis()</SCRIPT>
    come valore di un tag HTML: <A HREF="JavaScript:doThis()">Click Here</A>
    come valore di un campo form: <..ONCLICK="doThis()"></FORM>
    ..e in altri casi ancora, l'importante è scrivere la funzione rispettando il case e alternando gli apici doppi e singoli per non incorrere in errori.
Come abbiamo visto in alcuni dei precedenti esempi, le funzioni possono accettare degli argomenti, cioè valori memorizzati o creati in un altro punto della propria applicazione, come la proprietà di un oggetto JavaScript o un input da utente, che vengono passati alla funzione. Ogni blocco di codice che non sia composto da un solo comando deve essere entrocontenuto in parentesi graffe ({..}). Da ricordare che non possono essere annidate funzioni all'interno di altre funzioni, mentre ovviamente possono esistere blocchi dentro altri blocchi - è il caso per esempio di if..else spiegato sotto, in tal caso separati dalle graffe.

Il comando Return
Se una funzione deve restituire uno specifico valore, si deve usare il comando return con il valore, o l'espressione, che si vuole restituire. Il comando return è opzionale, in quanto non tutte le funzioni restituiscono valori.

    Return

    sintassi

    return value;
    return (value);

    esempio

         function calcYears(years) {
            hoursinYear = 24 * 365;
            return (hoursinYear);
            }
    
TRUCCHI E ASTUZIE
Se si vuole abbandonare una funzione in uno specifico punto, invece di utilizzare complessi comandi condizionali, può bastare porre un comando return. Il programma si sposterà al comando immediatamente successivo alla chiamata della funzione.

Comandi condizionali: if..else

Il comando if..else è un'istruzione condizionale che permette di eseguire uno o più comandi JavaScript, in base a una condizione definita dall'utente.
    If..else

    sintassi

    if (condition) { statement(s).. } [ else { statement(s).. } ]

    esempio

       <HTML>
         <SCRIPT LANGUAGE="JavaScript">
         <!--
         var today = new date();
         var minutes = today.getMinutes();
         if (minutes >= 0 && minutes <=30)
            document.write('<BODY TEXT="#FFFFFF" BGCOLOR="#000088">');
            else
               document.write('<BODY TEXT="#000088" BGCOLOR="#FFFFFF">');
         //-->
         </SCRIPT>
       
       Questo è un esempio di documento condizionale
       </BODY>
       </HTML>
    
Noterete che il tag <BODY> manca nel documento (c'è una riga bianca al suo posto): questo è voluto, poichè è il programma JavaScript che lo dichiara, a seconda dell'ora in cui viene visualizzato il documento. Notare anche che questo codice JavaScript viene eseguito direttamente e non è contenuto in una funzione: verrà eseguito in qualsiasi caso.

Il comando ?

JavaScript fornisce anche un comando di verifica di una condizione del tipo: se una certa espressione è vera fai questo, se è falsa fai quello. La differenza con il costrutto if..else si basa sul solo valore booleano che in questo caso può assumere la condizione. In pratica il costrutto ? può essere considerato una forma abbreviata di if..else, anche se non è molto utilizzato.
    comando ?

    sintassi

    ? (expression) trueStatement(s) : falseStatement(s)

    esempio

       <HTML>
         <SCRIPT LANGUAGE="JavaScript">
         <!--
         var today = new date();
         var secs = today.getSeconds();
         var backColor = (secs >= 0 && secs <=30) ? 'FFFFFF' : 'C0C0C0';
         document.write('<BODY TEXT="#000000" BGCOLOR="#' + 
         backColor + '">');
         //-->
         </SCRIPT>
       
       Questo è un altro esempio di documento condizionale
       </BODY>
       </HTML>
    
Alla prossima!

Fine Terza parte


______________________________________________________________________________

Luciano Giustini è raggiungibile su Internet all'indirizzo l.giustini@beta.it


Logo Corsi di BETAPer saperne di più sui corsi di BETA
Copyright © 1994-97 BETA. Tutti i diritti sono riservati. BETA Sul Web: http://www.beta.it.