guida javascript parte 1

Transcript

guida javascript parte 1
Javascript concetti fondamentali
Javascript (spesso abbreviato come JS) è il linguaggio di scripting più diffuso sul Web. Chi
affronta per la prima volta questo argomento, almeno in questa sede, dovrebbe sapere che a
differenza di HTML, che è un linguaggio di markup, Javascript è un vero e proprio linguaggio di
programmazione (o di scripting che dir si voglia) orientato agli oggetti (seppur in modo "limitato")
ed agli eventi.
Attraverso Javascript è possibile scrivere veri e propri "programmi" (script) attraverso i quali
interagire con l'utente e con il sistema attraverso l'ausilio del browser che, dopo aver scaricato il
codice sorgente del programma, ne darà esecuzione. In questo senso si parla di linguaggio di
scripting lato client per distinguerlo dai linguaggi lato server dove l'interpretazione del codice è
compito del server e non del client.
Implementare il codice Javascript all'interno
di una pagina HTML
Come già detto, il codice Javascript viene implementato direttamente all'interno delle pagine
HTML, frequentemente all'interno della sezione <head>, con l'utilizzo dei tag <script> e </script>.
In realtà, è bene precisarlo, codice Javascript può essere inserito in qualsiasi punto del documento
HTML, sia nell'<head> che nel <body> della pagina. La scelta di "dove" implementare il codice
dipende da una pluralità di fattori che è difficile approfondire a questo punto della guida. In linea di
assoluta approssimazione possiamo dire che gli script che producono direttamente un output (ad
esempio appraverso un document.write()) vengono solitamente inclusi nel corpo visibile della
pagina, mentre eventuali librerie, funzioni nonchè i codici che effettuano operazioni come redirect o
l'apertura di pop-up vengono inserite nell'intestazione del documento.
L'articolo continua dopo la pubblicità
Editor Javascript
Se volete scrivere codice Javascript non avete bisogno di nessun software particolare.
Sia ben inteso: esistono diversi editor Javascript ma il loro utilizzo non deve essere inteso come
indispensabile in quanto la loro utilità è data esclusivamente da funzioni di auto-completamento,
dizionari incorporati e strumenti di debug. Per carità, non è poco... ma se potete farne a meno
sappiate che per scrivere codice Javascript è sufficiente utilizzare un editor plain-text come il
Blocco Note di Windows o Notepad++.
Il tag <script>
All'inizio della lezione abbiamo accennato al tag <script>, vediamo ora in maniera completa come
preparare la pagina a ricevere del codice Javascript.
L'utilizzo "completo" e scolastico del tag script prevede l'indicazione dell'attributo type. Questa
indicazione in HTML 4 è necessaria, mentre in HTML 5 è assolutamente facoltativa. In HTML 4,
quindi, utilizzeremo:
<script type="text/javascript">
/*
codice ed istruzioni javascript
*/
</script>
Hello World in Javascript
Scriviamo un primo semplice programmino che stamperà a video una stringa di testo:
<script>
document.write("Ciao a tutti!!!");
</script>
Questo è un classico esempio di codice che va implementato nel <body> della pagina nel punto
esatto in cui si vuole appaia la stringa, ad esempio in un paragrafo oppure nella cella di una tabella.
Si noti che al termine della nostra istruzione è stato inserito un punto e virgola. In realtà inserire il
punto e virgola a fine riga non è obbligatorio in quanto l'interprete Javascript riconosce la fine di
una riga di codice e lo inserisce automaticamente in memoria; è comunque buona norma di
programmazione inserirlo. E' indispensabile, invece, se diverse istruzioni vengono scritte sulla
stessa linea, ad esempio:
document.write("Benvenuto");
In un qualsiasi linguaggio di programmazione un ruolo indispensabile e di primo piano è occupato
dal concetto di variabile. Col termine "variabile" s'intende una porzione di memoria (del client)
all'interno della quale vengono conservate alcune informazioni necessarie per lo svolgimento delle
operazioni del programma.
L'assegnazione di un valore ad una variabile in Javascript è molto semplice:
var nomeVariabile;
nomeVariabile = "contenuto";
Oppure:
var nomeVariabile = "contenuto";
Attraverso var abbiamo creato la variabile ed in seguito l'abbiamo valorizzata. In realtà la
dichiarazione della variabile (attraverso la clausola var) avrebbe potuto essere omessa in quanto
Javascript non prevede la dichiarazione obbligatoria delle variabili. Quindi avremmo potuto scrivere
semplicemente:
nomeVariabile = "contenuto";
La sintassi dell'assegnazione del valore ad una variabile è elementare, da sinistra a destra abbiamo:



il nome della variabile;
l'operatore di assegnazione (=);
il valore assegnato.
Seguono alcune considerazioni importanti:



Javascript è case-sensitive, questo significa che una variabile chiamata "miavariabile" sarà
differente da un'altra variabile chiamata "MiaVariabile";
il nome della variabile:
o non deve coincidere con una delle parole chiave del linguaggio;
o non può iniziare con un numero;
o non può contenere uno spazio;
o non può contenere caratteri speciali come, ad esempio, il punto (.) ed il trattino (-).
il valore assegnato deve essere contento all'interno di doppi apici (") o apici singoli (') se si tratta di
una stringa; non servono se il valore della variabile è numerico, è null o booleano.
NOTA: abbiamo appena detto che le stringhe vanno sempre racchiuse tra doppi apici (") o apici
singoli ('). Ma come possiamo fare se è la stessa stringa a dover contenere uno di questo due
caratteri? Le soluzioni sono due: 1) se la nostra stringa contiene apaci singoli racchiudiamola
all'interno di doppi apici, o viceversa; 2) più correttamente impariamo ad utilizzare il carattere
backslash in questo modo:
var str1 = 'Oggi serve l\'ombrello';
var str2 = "Marco ha detto: \"ciao a tutti\"";
In pratica abbiamo anteposto una backslash prima del carattere che avrebbe potuto essere
interpretato da Javascript come "speciale" (nel nostro caso sarebbe stato identificato come il
terminatore della stringa); così facendo il carattere viene semplicemente stampato a video e non
interpretato.
Tipi di dato: il valore delle variabili
Le variabili in Javascript possono assumere differenti valori:




stringa di testo;
valore numerico (intero o decimale);
valore booleano (true/false);
valore NULL;
Un tipo particolare di variabile è rappresentato dai vettori o array ma questo argomento verrà
affrontato in una lezione successiva di questa nostra guida.
Altri operatori di assegnazione
Se si lavora con variabili numeriche, oltre all'uguale è possibile usare anche altri operatori di
assegnazione, e cioè:
+=
E' un operatore incrementale e viene usato così:
x += y;
Questa sintassi euqivale a:
x = x + y;
NOTA: Questo operatore può essere utilizzato anche per le variabili stringa che, ovvaimente, non
vengono sommate ma concatenate.
-=
E' un operatore decrementale e viene usato così:
x -= y;
Questa sintassi euqivale a:
x = x - y;
*=
E' un operatore di moltiplicazione e viene usato così:
x *= y;
Questa sintassi euqivale a:
x = x * y;
/=
E' un operatore divisionale e viene usato così:
x /= y;
Questa sintassi euqivale a:
x = x / y;
%=
E' un operatore modulare e viene usato così:
x %= y;
Questa sintassi euqivale a:
x = x % y;
variabili locali e variabili globali
Le variabili possono essere locali o globali, le prime servono a dichiarare un valore che verrà
conservato in memoria per l'utilizzo della funzione o della routine in cui viene dichiarata, le
seconde, al contrario, vengono dichiarate all'inizio di un blocco di script e possono essere utilizzate
da una molteplicità di funzioni e routine.
Vediamo un esempio di variabile locale:
function mia_funzione() {
var miaVariabile = 123;
alert(miaVariabile);
}
In questo caso la nostra variabile miaVariabile esiste solo all'interno della funzione.
Vediamo adesso un esempio di variabile globale:
var miaVariabile = 123;
function mia_funzione() {
alert(miaVariabile);
}
In questo caso la variabile miaVariabile sarà accessibile ovunque ed è quindi definita "globale".
In una precedente lezione abbiamo visto come defininire e valorizzare delle variabili in Javascript
ed abbiamo visto che queste possono assumere diversi valori corrispondenti a diversi tipi di dato
(stringa, numerico, booleano, ecc.). Se è vero che le variabili svolgono un ruolo da primo iano in un
qualsiasi programma, è altrettanto vero che lo è altrettanto saper svolgere su di esse determinate
operazioni come, ad esempio, operazioni matematiche, confronti, concatenazioni, ecc.
Tutte queste operazioni sono fondamentali all'interno di un programma in quanto è attraverso di
esse che il flusso di codice riesce a raggiungere il risultato (l'elaborazione) che il programmatore si
è prefissato.
L'articolo continua dopo la pubblicità
In realtà alcuni operatori li abbiamo già incontrati nella lezione dedicata alle variabili, si tratta dei
cosidetti operatori di assegnazione che sono utilizzati, come il nome lascia intendere, appunto per
assegnare un valore ad una variabile. In questa lezione vedremo altre "famiglie" di operatori, più
precisamente: operatori di concatenazione, operatori matematici, operatori di confronto e operatori
logici.
Operatori di concatenazione
Gli operatori di concatenazione agiscono sulle stringhe e servono, come il nome lascia intendere, a
concatenare due o più variabili stringa.
Operatore +
Attraverso il simbolo matematico del + è possobile concatenare due variabili stringa. Ad esempio:
var str1 = 'Mr.';
var str2 = 'Webmaster';
document.write(str1 + str2);
stamperà a video "Mr.Webmaster".
Operatore +=
Attraverso l'operatore += viene concatenato il valore della variabile di sinistra all'espressione di
destra:
var str1 = 'Mr.';
str1 += 'Webmaster';
document.write(str1);
stamperà a video "Mr.Webmaster".
Operatori matematici
Si tratta dei comuni operatori utilizzati per effettuare operazioni matematiche tra variabili
numeriche. Questi sono:





+ Esegue un'addizione
- Esegue una sottrazione
* Esegue una moltiplicazione
/ Esegue una divisione
% (modulo) calcola il resto intero della divisione tra due numeri
Oltre a questi devono essere ricordati gli operatori ++ e -- utilizzati, rispettivamente, per
incrementare e decrementare di una unità un valore numerico passato per una routine. Ad esempio:
var num = 7;
num++;
documenti.write(num);
stamperà a video: 8
var num = 7;
num--;
documenti.write(num);
stamperà a video: 6
Operatori di confronto
Questi operatori possono agire su diversi tipi di variabili (stringa, numerica, booleana, ecc.) e sono
utilizzati per effettuare, appunto, dei confronti. L'esito del confronto genera un valore booleano
(TRUE o FALSE).






== Uguaglianza
!= Diversità
< Minore
<= Minore o uguale
> Maggiore
>= Maggiore o uguale
Questo tipo di operatori assume un'importanza centrale all'interno delle strutture di controllo (o
strutture condizionali) quando, cioè, l'esito del confronto tra due o più variabili diventa
determinante al fine del comportamento del programma stesso.
Vediamo qualche esempio di utilizzo degli operatori di confronto:
var a = 10;
var b = 3;
if
if
if
if
(a
(a
(a
(a
== b) { ... } // il controllo restituisce FALSE
!= b) { ... } // il controllo restituisce TRUE
< b) { ... } // il controllo restituisce FALSE
> b) { ... } // il controllo restituisce TRUE
Strutture condizionali in Javascript: if, else if e
else
Da questa lezione, sulla scorta delle nozioni apprese finora, inizieremo finalmente a scrivere
qualche programmino degno di nota, per farlo dobbiamo, prima di tutto, prendere confidenza con le
cosiddette strutture di controllo del flusso di programma o, più banalmente, le condizioni.
Come in ogni linguaggio di programmazione che si rispetti, anche in Javascript, infatti, è possibile
definire delle condizioni al verificarsi delle quali deve o meno accadere qualcosa. Per fare ciò ci si
serve degli operatori if, else if, else i quali corrispondono alle locuzioni condzionali "se", "oppure
se" e "oppure".
L'articolo continua dopo la pubblicità
La sintassi Javascript per eseguire un'istruzione if è la seguente:
if (condizione) {
istruzioni;
}
La condizione segue l'istruzione if e viene racchiusa tra parentesi tonde, mentre le istruzioni da
eseguire - se la condizione si verifica - vengono racchiuse tra parentesi graffe.
Se vi è una sola istruzione e questa viene scritta su una singola riga è possibile omettere le parentesi
graffe come nell'esempio:
if (condizione) istruzione;
Possiamo anche dire al programma come comportarsi in caso la condizione non si verifichi, con
l'ausilio di else:
if (condizione) {
istruzioni;
}else{
istruzioni;
}
Utilizzando else non c'è bisogno di specificare tra parentesi tonde la condizione, dato che il
programma valuterà tutte le altre situazioni possibili, all'infuori di quella specificata nell'istruzione
if. Quindi se la condizione non si verifica il programma eseguirà quanto specificato nel blocco else.
Quella che abbiamo visto è una struttura condizionale relativamente semplice: se la condizione X si
verifica esegui questa operazione, in caso contrario esegui quest'altra.
In realtà, però, è possibile creare strutture condizionali molto più complesse introducendo la
clausola else if che in sostanza introduce N nuove possibiltà in quanto, a differenza di if e else che
possono essere usate una volta soltanto, può essere utilizzata più volte per creare infinite nuove
possibilità.
if (condizione 1) {
istruzioni;
}
else if (condizione 2) {
istruzioni;
}
else if (condizione 3) {
istruzioni;
}
else if (condizione N) {
istruzioni;
}else{
istruzioni;
}
Come avete visto i blocchi "else if" possono essere più di uno.
Vediamo di seguito un esempio di una semplice struttura di controllo "scolastica" finalizzata a
stampare a video un messaggio differente a seconda della risoluzione dello schermo dell'utente.
var screenwidth = screen.width;
if (screenwidth < 400) {
document.write('Stai usando uno smartphone');
}
if (screenwidth < 800) {
document.write('Stai usando un tablet');
}else{
document.write('Stai usando un computer');
}
Nel nostro esempio, molto banalmente, intercettiamo la larghezza dello schermo dell'utente e,
attraverso una struttura condizionale a tre blocchi mostriamo un messaggio differente a seconda che
la risoluzione lasci intendere l'utilizzo di uno smarphone, di un tablet o di un comune computer.
Vediamo di seguito un esempio che mostra come costruire istruzioni condizionali composite. Più
precisamente vedremo come utilizzare l'operatore logico AND (&&) per creare blocchi condizionali
composti da più condizioni:
// creo un oggetto data
var saluto = new Date();
// individuo l'ora corrente
var oo = saluto.getHours();
if (oo > 06 && oo <= 12) {
document.write("Buon giorno!");
}
else if (oo > 12 && oo <= 18) {
document.write("Buon pomeriggio!");
}
else if (oo > 18 && oo <= 22) {
document.write("Buona sera!");
}
else {
document.write("Buona notte!");
}
Operatori logici
Un altra serie molto importante di operatori è costituita da quella simbologia che consente di
effettuare operazioni logiche di associazione (AND), alternanza (OR) e negazione (NOT). Anche
questi operatori sono utilizzati nelle strutture di controllo del flusso di programma.

&& - L'operatore "AND" è utilizzato per creare condizioni complesse composte da una pluralità di
sotto-condizioni; affinché la routine si verifichi è necessario che tutte le sotto-condizioni siano vere.
|| - L'operatore "OR" è utilizzato per creare condizioni complesse composte da una pluralità di
sotto-condizioni; affinché la routine si verifichi è necessario che almeno una delle sotto-condizioni
sia vera.
! - L'operatore "NOT" indica una negazione all'interno di una routine. In sostanza si usa per invertire
il significato di una condizione.


Vediamo qualche esempio:
var
var
var
var
if
if
if
if
a
b
c
d
=
=
=
=
10;
3;
9;
24;
(a == b && c < d) { ... } // il controllo restituisce FALSE
(a != b && c < d) { ... } // il controllo restituisce TRUE
(a > b || c == d) { ... } // il controllo restituisce TRUE
(!(a > b)) { ... } // il controllo restituisce FALSE
Creare condizioni complesse
Quando si concatenano due o più condizioni è necessario stare molto attenti all'uso delle parentesi
tonde. Se si concatenano diverse condizioni sempre col medesimo operatore l'uso di parentesi tonde
(ulteriori a quelle "esterne" che racchiudono l'intera condizione) non è necessario:
if (a == true && b == true && c == true) { ... }
In questo caso il blocco if si realizzerà se tutte e tre le condizioni sono vere.
L'uso delle parentesi diventa indispensabile, invece, se si costruiscono condizioni complesse
utilizzando una pluralità di operatori logici:
if ((a == true && b == true) || c == true) { ... }
In quest'ultimo esempio il blocco if si realizzerà se "a" e "b" sono true oppure se è true la sola
variabile "c".
I cicli in Javascript: for, while e do-while
Per una serie di motivi che scopriremo nel corso di questa lezione, può nascere l'esigenza di dover
ripetere una serie di istruzioni un determinato numero di volte, o finchè non si verifichi una data
condizione. In tali circostanze è necessario ricorrere alle iterazioni o, più comunemente, ai cicli.
Javascript supporta diverse strutture iterative:



for
while
do while
Vediamole una ad una cercando di illustrarne il funzionamento anche facendo ricorso ad esempi
pratici di utilizzo.
Il ciclo for()
Un ciclo for() serve a ripetere una serie di istruzioni un determinato numero determinato di volte.
Per definire un ciclo for() si imposta:



una variabile contatore a cui si assegna un valore di partenza arbitrario (solitamente 0);
la condizione di terminazione (cioè un valore della variabile contatore che, una volta raggiunto,
blocca il ciclo);
ed uno step (cioè l'incremento - o decremento - da applicare alla variabile contatore ad ogni
passaggio del ciclo).
La dichiarazione della variabile contatore è opzionale, ma le buone norme di programmazione
gradiscono che venga dichiarata.
Vediamo un esempio:
var i;
for (i=0; i<3; i++) {
/*
istruzioni che verranno ripetute 3 volte
*/
}
Come potete vedere abbiamo definito una variabile "i" che svolge il ruolo di contatore. All'interno
delle parentesi tonde che seguono a for abbiamo definito il valore di partenza (i=0), la condizione
che termina il ciclo (i<3) ed il nostro step (i++). In pratica for eseguirà le istruzioni contenute tra le
parentesi graffe per tre volte in quanto al primo passaggio "i" avrà valore 0, al secondo 1, al terzo 2
ed a questo punto si stopperà in quanto la condizione di terminazione ci dice che il ciclo dovrà
continuare sino a quanto "i" è minore di 3.
Più avanti, nel corso di questa guida, ritroveremo i cicli for() nella lezione dedicata agli array dove
assumono un ruolo determinante nell'esplorazione del contenuto del vettore.
L'articolo continua dopo la pubblicità
Il ciclo while()
A differenza di for(), il ciclo while() non prevede l'utilizzo di alcun contatore ma semplicemente
l'indicazione di una condizione di terminazione: il ciclo terminerà non appena la condizione
impostata si realizza. La sintassi è la seguente:
while (condizione) {
istruzioni;
}
Vediamo un esempio banale:
var i = 0;
while (i < 10) {
document.write('Conto: ' + i);
i++;
}
che equivale a:
var i;
for (i=0; i<10; i++) {
document.write('Conto: ' + i);
}
Nell'esempio qui sopra, come in for(), il ciclo è determinato da una variabile numerica, in realtà
nulla vieta di impostare un ciclo while() che utilizza come condizione un altro tipo di variabile
come, ad esempio, un valore booleano.
Il ciclo do while()
La struttura do while() è una variante di while(). La differenza tra le due sintassi consiste nel fatto
che il controllo della condizione avviene dopo l'esecuzione dell'istruzione e non prima; la
differenza, da un punto di vista pratico, è che l'istruzione viene eseguita sempre almeno una volta.
Questa la sintassi:
do {
istruzioni;
}
while (condizione);
Vediamo un esempio pratico:
var i = 0;
do {
document.write('Conto: ' + i);
i++;
}
while (i < 10);
Attenzione ai loop!
In chiusura di questa lezione dedicata i cicli ritengo doveroso un avvertimento: quando impostate un
ciclo abbiate sempre cura di impostare con attenzione la condizione conclusiva che deve SEMPRE
verificarsi. Ricordatevi, infatti, che se la condizione non si realizza mai... il ciclo continua
all'infinito (cosidetto loop). Da un punto di vista pratico un loop comporta un esaurimento delle
risorse del client ed un blocco del browser, quindi si tratta di una situazione che non deve mai
potersi verificare!