17 Javascript 1 - caprera.dia.unisa.itcaprera.dia.unisa.it/TSW/MATERIALE/ns/Javascript1.pdf ·...

132
Javascript – 1 Introduzione

Transcript of 17 Javascript 1 - caprera.dia.unisa.itcaprera.dia.unisa.it/TSW/MATERIALE/ns/Javascript1.pdf ·...

Javascript – 1

Introduzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 2

Javascript client-side – 1  HTML non può né gestire scelte

dell’utente, né prendere decisioni, né iterare dei task

 Gli script client-side indicano al browser la lista di azioni che deve eseguire

  Il risultato dipende dall’interprete (browser)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 3

Javascript client-side – 2   Valida i dati dei moduli durante la loro

compilazione   Visualizza messaggi e possono richiedere

dati in apposite finestre (alert box)   Anima il contenuto della pagina (e.g.,

immagini) interagendo con l’utente (e.g., spostamenti cursore)

  Adatta le pagine ai browser che le visitano   E altro ancora… (es. menu a tendina,

messaggi sulla linea di status del browser, aprono nuove finestre,… )

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 4

Il tag SCRIPT   È il tag contenitore per inserire codice

Javascript nella pagina HTML <SCRIPT> … </SCRIPT>

  Gli attributi di SCRIPT sono: –  language –  type –  src –  defer

  I l contenuto del tag SCRIPT v iene interpretato dal browser come istruzioni in un linguaggio di scripting

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 5

Gli attributi di SCRIPT – 1   language (deprecato)

–  Indica il linguaggio di scripting utilizzato all’interno del tag SCRIPT

•  language=“Javascript” (indica la versione 1.0) •  language=“Javascript1.2”

  type (usato al posto di language) – Descrive il mime-type utilizzato all’interno

del tag SCRIPT •  type=“text/javascript”

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 6

Gli attributi di SCRIPT – 2  src

–  Indica l’url di un file contenente codice Javascript (non contiene HTML)

–  Il file in genere termina con estensione .js •  <SCRIPT type=“text/javascript”

src=“codice/menu.js”></SCRIPT>

–  Il tag di chiusura è richiesto – Tutto quello compreso tra i due tag SCRIPT

non viene interpretato (eseguito)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 7

Gli attributi di SCRIPT – 3  defer

– Attributo booleano, indica al browser di interpretare il contenuto del tag SCRIPT solo dopo che ha terminato di caricare tutto il documento HTML

– Lo si usa quando ci sono script che non producono output (e.g., non usano document.write) o che non necessitano che tutto il documento HTML sia caricato

•  La performance del browser aumenta

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 8

Javascript e browser antiquati  Per vecchie versioni di browser che non

sono in grado di interpretare Javascript (o meglio il tag SCRIPT) si può utilizzare il seguente modello di commento

<SCRIPT TYPE=“text/javascript”> <!--

… // --> </SCRIPT>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 9

Il tag NOSCRIPT  Permette di specificare cosa fare

quando –  il browser non sa interpretare Javascript – Javascript è stato disabilitato dall’utente

 Dovrebbe essere usato ogni volta che si utilizza il tag SCRIPT –  Almeno la prima volta…. –  Si potrebbe redirigere il browser verso una pagina

che non contiene Javascript

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 10

<SCRIPT TYPE=“text/javascript”> <!-- // Commento HTML per non mostrare il codice

// JS quando il browser non lo interpreta … // --> </SCRIPT> <NOSCRIPT> <H1> Questa pagina richiede Javascript</H1> </NOSCRIPT>

Al posto di <H1> si potrebbe redirezionare la pagina attraverso il tag META (SCRIPT deve essere in HEAD)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 11

Dove posizionare il tag SCRIPT  Può andare nella sezione HEAD del

documento HTML –  In tal caso il codice contenuto viene

eseguito prima di visualizzare la pagina  Può andare nella sezione BODY del

documento HTML –  In tal caso il codice contenuto viene

eseguito quando il tag <SCRIPT> viene incontrato dal browser nel flusso normale della pagina

Migliorare la fruibilità del sito   Inserire il codice javascript alla fine del

documento HTML

  Il documento viene immediatamente visualizzato senza attendere che il codice javascript venga interpretato

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 12

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 13

Il primo script <H1>Ecco il classico</H1> <SCRIPT TYPE=“text/javascript"> document.write(“Ciao mondo”); </SCRIPT>   document si riferisce al documento html (è un oggetto

che rappresenta il documento visualizzato nella finestra del browser)

  write è un metodo di document

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 14

Codice completo <!DOCTYPE HTML > <HTML> <HEAD> <TITLE> Esempio di script </TITLE> </HEAD> <BODY> <H1>Ecco il classico </H1> <SCRIPT type="text/javascript"> <!-- document.write("Ciao mondo!"); //--> </SCRIPT> </BODY> </HTML>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 15

…tornando a NOSCRIPT <!DOCTYPE HTML> <HTML> <HEAD> <TITLE> Esempio di NOSCRIPT</TITLE> <SCRIPT TYPE="text/javascript">

alert("Bravo!\n Il tuo browser supporta JavaScript"); </SCRIPT> <NOSCRIPT> <META HTTP-EQUIV="refresh" CONTENT="7;URL=pagina.html"> </HEAD> <BODY> <h2>Per visualizzare questo sito hai bisogno di JavaScript</h2> <h2>Fra sette secondi sarai direzionato verso una versione del sito che non fa uso di JavaScript</h2> </BODY> </NOSCRIPT> </HEAD> <BODY> … </BODY> </HTML>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 16

Un altro esempio <SCRIPT TYPE=“text/javascript"> out= "<FONT COLOR='RED'> Questo testo ”; out=out+”&egrave; di colore rosso</FONT>“; document.write(out); </SCRIPT>   out contiene codice HTML da

mandare in output –  all’interno delle virgolette

si usano gli apici singoli (o viceversa)

HTML antiquato

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 17

Ancora un esempio <SCRIPT TYPE=“text/javascript">

str= "<FONT COLOR='RED'>\ Questo testo &egrave; di colore rosso: " for(i=1;i<=6;i++){ out = str+ i; out += "</FONT><BR>"; document.write(out);} </SCRIPT>

Serve a scrivere una stringa su più linee

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 18

Tempo di esecuzione di uno script

 Lo script viene eseguito in tempi diversi a seconda di dove è scritto il codice – È eseguito al tempo di caricamento se è

presente in HEAD senza l’attributo DEFER – È eseguito al tempo di visualizzazione

della pagina se è presente in BODY – Se invece il codice fa parte di una

funzione, allora viene eseguito solo quando la funzione viene invocata

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 19

Interazione con l’utente   Introduciamo a questo punto i metodi alert,

confirm e prompt dell’oggetto window –  Saranno utili per risolvere i primi esercizi proposti

sul sito del corso   alert serve a mostrare una finestra per

l’output da parte del codice javascript   confirm aspetta che l’utente prema OK o

Continua per continuare   prompt serve a mostrare una finestra in cui

l’utente fornisce dell’input al codice javascript   In seguito forniremo maggiori dettagli

sull’oggetto window e su i suoi metodi

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 20

alert   Mostra una finestra di dialogo contenente un

messaggio ed un bottone per chiuderla   Sintassi

–  alert(msg) •  msg è una stringa che verrà mostrata in una finestra

  Non è necessario specificare l’oggetto window –  window.alert(msg)

  Non si può usare HTML all’interno di msg per formattare il testo, ma solo caratteri ASCII e \n, \t, …

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 21

Esempio <BODY> <SCRIPT type="text/javascript"> <!--

alert("ciao mondo\n"); //-->

</SCRIPT> </BODY>

Netscape

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 22

confirm  Mostra una f inestra d i d ia logo

contenente un messaggio e due bottoni uno per confermare l’azione l’altro per annullare l’azione

 Sintassi – confirm(msg) – Restituisce true se l’utente preme OK false

altrimenti

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 23

Esempio <SCRIPT type="text/javascript"> <!-- if(confirm("premi OK per continuare"))

document.write("<H1>Hai premuto OK</H1>"); else

document.write("<H1>Hai premuto Annulla</H1>"); //--> </SCRIPT>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 24

prompt  Mostra una finestra di dialogo con un

messaggio, una linea testuale di input e due bottoni uno per confermare l’azione l’altro per annullare l’azione

 Sintassi – prompt(msg,default)

•  msg è il messaggio mostrato all’utente •  default è l’input di default, usare “” per creare

una linea testuale di input vuota

 Restituisce la stringa digitata dall’utente

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 25

Esempio <SCRIPT type="text/javascript"> <!-- val=prompt("Come ti chiami?", "carlo") document.write("<H1>Ciao "+val+"</H1>");

//--> </SCRIPT>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 26

Input di numeri   Il valore restituito da prompt (e.g., val) è di

tipo stringa   Per convertirlo al tipo intero usiamo la

funzione parseInt(val)   Per convertirlo al tipo float usiamo la funzione

parseFloat(val)   Entrambi restituiscono la costante NaN se val

non inizia per un numero –  Per verificare se il valore restituito da parseInt o

parseFloat non è un numero si usa la funzione isNaN()

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 27

eval(str)  Riceve in input una stringa str che

rappresenta del codice JavaScript  Quando la funzione eval è invocata,

l’interprete JavaScript valuta il codice rappresentato da str e lo esegue. –  Restituisce il risultato della valutazione

Elementi del linguaggio

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 29

Cosa c’è in Javascript   Gli elementi di un programma Javascript

possono essere divisi in 5 categorie: –  variabili e valori –  espressioni ed operatori

•  per manipolare i valori

–  strutture di controllo •  per modificare l’ordine di esecuzione

–  funzioni •  per raggruppare blocchi di istruzioni

–  oggetti ed array •  raggruppamenti di dati e funzioni

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 30

Commenti in Javascript  Stessa tecnica del C++ o di Java  Commenti su di una singola linea

//

 Commenti su più linee Inizio commento /* Fine commento */

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 31

Punto e virgola opzionale  Ogni istruzione dovrebbe terminare con

il punto e virgola (;)  Può essere omesso se due istruzioni

sono separate da un invio a = 3 b = 4

 Nel seguente caso è obbligatorio a = 3; b = 4;

 Conviene sempre metterlo

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 32

Valori  Javascript riconosce i seguenti tipi di

valori –  Numeri –  Valori booleani –  Stringhe –  null //può essere assegnato ad una variabile

•  Indica un valore nullo –  undefined

•  Indica che una variabile ha un valore indefinito

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 33

Numeri interi

 decimali: (compresi tra –253 e 253) – e.g., 77 – 9876453

 ottali (iniziano con zero): – e.g., 077 – 09876

 esadecimali (iniziano con 0x o 0X): – e.g., 0x77 – 0X123456789abcDEF

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 34

Numeri in virgola mobile  Notazione standard

–  1234.567 – -1.234  Notazione scientifica

–  1.2345e10 1.1234e-11 9. 87E-21  Valore massimo

±1.7976931348623157x10308  Valore minimo

±5x10-324

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 35

Costanti numeriche speciali   Number.POSITIVE_INFINITY

–  Valore speciale per rappresentare “infinito”

  Number.NEGATIVE_INFINITY –  valore speciale per rappresentare “infinito negativo”

  NaN oppure Number.NaN –  Valore speciale per rappresentare un “non-numero”

  Number.MAX_VALUE –  il più grande numero rappresentabile

  Number.MIN_VALUE –  il più piccolo numero rappresentabile

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 36

Valori booleani  Possono assumere il valore true o false  JavaScript, se è necessario, converte

true in 1 e false in 0  Utilizzo

if (a == 4) b = b + 1;

else a = a + 1;

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 37

Valori stringa  Sono letterali di zero o più caratteri

racchiusi tra virgolette doppie (") o singole (')

 Esempi "" // stringa vuota "casa" 'cassa' "1234" "una riga \n un’altra riga" 'nome= "carlo"' //stringa nome="carlo"

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 38

Caratteri speciali   Oltre ai caratteri ordinari o a quelli espressi in

UNICODE (\uXXXX, dove X è un valore esadecimale), si possono inserire nelle stringhe i seguenti caratteri speciali –  \' (apice singolo) \" (apice doppio) –  \b (backspace) \f (form feed) –  \n (interruzione di linea) \r (ritorno carrello) –  \t (tabulazione) \\ (backslash) –  \v (tab. verticale) \0 (carattere NULL)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 39

Parole riservate – 1 o  abstract o  boolean o  break o  byte o  case o  catch o  char o  class o  const o  continue o  debugger o  default

o  delete o  do o  double o  else o  enum o  export o  extends o  false o  final o  finally o  float o  for

o  function o  goto o  if o  implements o  import o  in o  instanceof o  int o  interface o  long o  native o  new

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 40

Parole riservate – 2 o  null o  package o  private o  protected o  public o  return o  short o  static o  super o  switch o  synchronized o  this

o  throw o  throws o  transient o  true o  try o  typeof o  var o  void o  volatile o  while o  with

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 41

Variabili in Javascript   Le variabili sono nomi simbolici associati a

valori in applicazioni Javascript   I nomi delle variabili devono seguire alcune

regole –  Il primo carattere deve essere o una lettera o un

underscore (_) oppure il segno del dollaro ($) –  I caratteri seguenti possono essere lettere, cifre,

oppure il segno del dollaro (non ci possono essere spazi)

–  Non possono essere uguali a parole riservate   Javascript è case sensitive

–  Var1 ≠ var1

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 42

Tipo delle variabili   Javascript non è un linguaggio tipato

–  Alla stessa variabile possiamo assegnare valori di tipo differente senza generare errori

  Esempio <SCRIPT TYPE=“text/javascript”> <!-- var altezza=2+3.4; document.write(altezza); document.write(“<BR>”); altezza=“5.4 metri”; document.write(altezza); // --> </SCRIPT>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 43

Dichiarazione di variabili – 1

 Non è necessario dichiarare le variabili anche se è buona norma farlo sempre

 Per dichiarare una variabile possiamo semplicemente assegnarle un valore –  i=10; //a questo punto i è dichiarata –  str= "Ciao \n mondo!";

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 44

Dichiarazione di variabili – 2   Per dichiarare una variabile si usa la parola

chiave var –  var i; –  var r, d; –  var s=“ciao”;

  Possiamo dichiarare con var una variabile più di una volta senza causare errori

  Se, all’interno di una funzione, si crea una variabile senza far ricorso a var, allora si crea una variabile globale

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 45

Inizializzazione di variabili  Possiamo inizializzare una variabile

quando la dichiariamo – var i=10;

 Una variabile dichiarata ma non inizializzata (e.g., var i;) è indefinita – Se tentiamo di leggere il suo contenuto

otteniamo undefined  Se tentiamo di accedere ad una

variabile non dichiarata otteniamo un errore al runtime

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 46

Campo di visibilità di una variabile   Prima di Javascript 1.7 esistevano solo due

campi di visibilità   Locale

–  Variabili definite all’interno di una funzione attraverso la parola chiave var

  Globale –  Variabili definite in qualsiasi punto del codice

Javascript, ma al di fuori di una funzione; oppure in una funzione senza utilizzare var

  JavaScript 1.7 introduce il campo di visibilità di blocco (block scope) tramite la keyword let –  NON È COMPLETAMENTE SUPPORTATO

Keyword let  Funziona solo con Firefox indicando

<script type="application/javascript;version=1.7”> var x = 5; var y = 0; let (x = x+10, y = 12) { alert(x+y + "\n"); } alert((x + y) + "\n"); </script> Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 47

Provare con gli altri browser

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 48

Esempio function test(o){

var i=0; if(typeof o == “object) { var j=i+3; for(var k=0; k<10; k++) { document.write(k); } document.write(j); document.write(k); } document.write(i);

}

Le variabili i j e k hanno lo stesso campo di visibilità (scope), quello della funzione. Sono visibili da a non soltanto nei blocchi colorati

X La variabile j diventa gloabale

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 49

Cenni su oggetti in Javascript – 1   Un oggetto in JavaScript è una collezione di

valori con nome (named values) –  Una specie di struttura in C

  In genere si fa riferimento a questi named values con il nome di proprietà

  Per far riferimento ad una proprietà di un oggetto si fa riferimento al nome dell’oggetto seguito dal punto (.) e dal nome della proprietà –  immagine.altezza –  immagine.larghezza

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 50

Cenni su oggetti in Javascript – 2  Se un oggetto contiene una funzione,

allora la funzione prende il nome di metodo dell’oggetto ed il nome della proprietà diventa il nome del metodo

 Una variabile in uno script Javascript in esecuzione in un browser coincide con una proprietà dell’oggetto window

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 51

L’oggetto globale – 1   Quando l’interprete Javascript esegue uno

script, una delle prime cose che fa è creare un oggetto globale

  Tra le proprietà di questo oggetto globale ci sono le variabili dichiarate all’interno di script Javascript –  Quando si dichiara una variabile si sta

aggiungendo una proprietà all’oggetto globale   L’interprete Javascript inizializza questo

oggetto globale con altri valori e funzioni predefinite

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 52

L’oggetto globale – 2   Per far riferimento a questo oggetto nel

codice Javascript che non fa parte di funzioni possiamo usare la parola chiave this –  All’interno di funzioni this ha un significato

differente, dettagli in seguito   In JavaScript l’oggetto Window serve da

oggetto globale –  Per far riferimento a this possiamo usare la

proprietà auto-referenziale window dell’oggetto globale Window, oppure possiamo far riferimento direttamente alle proprietà di window (non usiamo né this né window, ma direttamente la proprietà)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 53

Il call object

 Le variabili locali (quelle dichiarate all’interno di una funzione) sono anch’esse proprietà di un oggetto chiamato call object –  Il call object è creato quando si invoca una

funzione –  Il tempo di vita di un call object è la durata

dell’esecuzione della funzione a cui è associato

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 54

Costanti  Variabili a sola lettura  Sono create usando la parola chiave

const –  const sconto=0.1; –  const nome=“pippo”;

 Esistono in Javascript anche delle costanti predefinite che rappresentano i più comuni valori matematici (accessibili attraverso l’oggetto math)

Operatori e costrutti

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 56

Tipi di operatori  Unario

– L’operatore ha un solo operando – E.g., -3

 Binario – L’operatore ha due operandi – E.g., 3+4

 Ternario – L’operatore ha tre operandi – E.g., a < 4 ? 3 : 4;

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 57

Operatori aritmetici   x + y addizione   x – y sottrazione   x * y moltiplicazione   x / y divisione, restituisce double   ++i incremento prefisso   i++ incremento postfisso   --i decremento prefisso   i-- decremento postfisso   -i negazione   x % y modulo

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 58

Operatori relazionali  Restituiscono un valore booleano  x > y maggiore di  x >= y maggiore o uguale a  x < y minore di  x <= y minore o uguale a  a in x vero se a è una proprietà

dell’oggetto x  y istanceof x vero se y è un’istanza

del tipo di oggetto x

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 59

Esempio di in ed istanceof

var theDay=new Date(2003, 4, 29) if (theDay instanceof Date) { // istruzioni da eseguire }

var point = {x:1, y:1}; //oggetto if ("x" in point) { // istruzioni da eseguire }

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 60

Operatori di uguaglianza  a == b uguaglianza

– Restituisce vero se a e b sono uguali anche dopo conversioni di tipo

–  3 == “3” restituisce true  a === b identità

– Restituisce vero se a e b sono uguali e sono dello stesso tipo

– 3 === “3” restituisce false

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 61

Operatori di disuguaglianza  a != b disuguaglianza

– Restituisce vero se a e b sono diversi anche dopo conversioni

–  3 != “2” restituisce true

 a !== b non-identità – Restituisce vero se a e b non sono identici – 3 !== “3” restituisce true

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 62

Operatori su stringhe   Tutti gli operatori di relazione già visti   Operatore di concatenazione: +   "Ciao a voi " + 3; => "Ciao a voi 3"   L’operatore + usato con stringhe e numeri

non è associativo 1 + 2 + " gattini"; produce "3 gattini" "gattini: " + 1 + 2; produce "gattini: 12"   Per convertire un numero x nella stringa "x" è

sufficiente scrivere ""+x –  ""+3 produce "3"

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 63

Operatori logici   && AND logico

–  expr1 && expr2   || OR logico

–  expr1 || expr2   ! NOT logico

–  !expr   Le espressioni logiche vengono valutate da

sinistra verso destra; l’interpretazione si arresta appena diventa noto il valore dell’espressione –  7 < 10 || “espressione”

•  “espressione” non verrà mai valutata

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 64

Operatori bitwise   Lavorano sui bit che rappresentano i loro

operandi

  & AND bitwise   | OR bitwise   ^ XOR bitwise   ~ NOT bitwise   << shift verso sinistra (x << 3;)   >> shift verso destra (x >> 4;)   >>> shift verso destra con

riempimento di 0

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 65

Assegnamento   Il più semplice tipo di operatore

=

  Esempi –  x=3; str=“casa”;

  Assegnamento multiplo –  x = y = z = 0;

  Esistono altri operatori di assegnamento che sono la forma abbreviata di operazioni standard –  E.g., x+=3; equivalente a x=x+3;

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 66

Forma abbreviata   x += y equivale a x = x + y   x -= y equivale a x = x - y   x *= y equivale a x = x * y   x /= y equivale a x = x / y   x %= y equivale a x = x % y   x <<= y equivale a x = x << y   x >>= y equivale a x = x >> y   x >>>= y equivale a x = x >>> y   x &= y equivale a x = x & y   x ^= y equivale a x = x ^ y   x |= y equivale a x = x | y

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 67

Operatore condizionale  Unico operatore ternario in JavaScript  Sintassi

–  (condizione) ? expr1 : expr2 –  restituisce la valutazione di expr1 se

condizione è vera, altrimenti restituisce la valutazione di expr2

– expr1 e expr2 possono avere tipi diversi

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 68

Operatore typeof  L’operatore typeof restituisce una stringa

che indica il tipo dell’operando  Sintassi

–  typeof operando –  typeof (operando)

 Esempio if(typeof a == “string”) document.write(a +“ &egrave; una stringa”);

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 69

Esempi di typeof   typeof parseInt

–  restituisce la stringa “function”

  typeof undefinedVariable –  restituisce “undefined”

  typeof 33 restituisce “number”   typeof “Ciao” restituisce “string”   typeof true restituisce “boolean”   typeof null restituisce “object”

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 70

Operatore void  L’operatore void specifica

un’espressione che deve essere valutata senza restituire un valore

 Sintassi –  void espressione –  void (espressione)

 Usato in concomitanza degli eventi (onClick, onMouseOver, ….) Dettagli in seguito

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 71

Operatore virgola  Valuta il suo operando sinistro poi

quello destro e restituisce il valore del suo operando destro

 Esempio –  i=0, j=1, k=2; –  assegna 0 ad i

1 a j 2 a k restituisce il valore 2

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 72

Altri operatori  new

– Serve a creare istanze di oggetti   delete

– Serve a rimuovere proprietà di oggetti   ()

– Operatore chiamata a funzione

  [] e . – Operatori di accesso ad array ed oggetti

Istruzioni

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 74

Istruzioni JavaScript   In JavaScript la più semplice istruzione è

un’espressione che ha un effetto collaterale –  s = 4 + i; –  cont++;

  In JavaScript possiamo combinare, usando le parentesi graffe più istruzioni in una singola istruzione o istruzione blocco {

x = Math.PI; cx = Math.cos(x); alert("cos(" + x + ") = " + cx);

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 75

Istruzioni condizionali   Un’istruzione condizionale è un insieme di

comandi che vengono eseguiti se una condizione specificata è vera

  if –  if (espressione) istruzioni

  if else –  if (espressione) istruzioni1 else istruzioni2

  if else if –  if (espressione1) istruzioni1

else if (espressione2) istruzioni2 else istruzioni3

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 76

Istruzione switch   Un’istruzione switch permette ad un

programma di valutare un espressione e confrontare il valore dell’espressione con un’etichetta (label) case.

  Se si trova una corrispondenza, allora il programma esegue l’istruzione associata

  La labe l può essere una quals ias i espressione arbitraria, non necessariamente una costante al tempo di compilazione come accade per il C, C++ o Java

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 77

Sintassi switch (espressione){

case label1 : istruzione1; break; case label2 : istruzione2; break; ... default : istruzione-n; }

Può essere:

case 60*60*24: case Math.PI: case n+1: case a[0]:

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 78

Istruzioni di ciclo  Un ciclo è un insieme di comandi che

vengono eseguiti ripetutamente fino a quando una condizione specificata è soddisfatta

 Semplificano azioni ripetitive –  for –  while –  do while –  for in

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 79

Ciclo for  Sintassi

for(assegnamento; condizione; incremento) istruzioni

Esempi for(count = 0; count < 10; count++)

document.write(count + "<br>");

for(i = 0, j = 10 ; i < 10 ; i++, j--) sum += i * j;

opzionali

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 80

Ciclo while  Sintassi

while (condizione) { istruzioni

}

 Esempio var count = 0; while (count < 10) {

document.write(count + "<br>"); count++;

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 81

Ciclo do while  Sintassi

do { istruzione

} while (condizione );  Esempio var i=0; do {

i+=1; document.write(i); } while (i<5);

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 82

Ciclo for in  Sintassi

for (variable in object) statement

 Esempio for (prop in my_object) {

nome= "Nome: " + prop; valore= "Valore: " + my_object[prop]; document.write(nome + " - " +valore+ "<br>");

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 83

label   Con una label possiamo fornire un

identificativo ad un’istruzione. È usata in un ciclo in concomitanza con break o continue

  Sintassi label: istruzione

  Esempio markLoop:

while (theMark == true) doSomething();

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 84

break   Con break forziamo l’uscita dal ciclo più

interno che lo racchiude o da uno switch   Sintassi

break oppure break label;

  Esempio for(i = 0; i < a.length; i++) {

if (a[i] == target) break;

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 85

continue   È usato solo all’interno di un ciclo, interrompe il ciclo

e va a controllare la condizione   Sintassi

continue oppure continue label;

  Esempio i = 0; n = 0; while (i < 5) { i++; if (i == 3) continue; n += i; }

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 86

Esempio di continue con label 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 checkiandj; document.write(j + " is odd.<BR>"); } document.write("i = " + i + "<br>"); document.write("j = " + j + "<br>"); }

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 87

Istruzione with  L’istruzione with stabilisce l’oggetto

di default per un insieme di istruzioni

 L’uso di with rallenta l’esecuzione

Esempio utilizzo with

  Sintassi with (oggetto){ istruzioni

}   Per ogni identificativo

c h e c o m p a r e i n istruzioni si verifica se è una proprietà di oggetto

with(Math) { x = sin(i * PI / 20); y = cos(i * PI / 30);

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 88

x = Math.sin(i * Math.PI / 20); y = Math.cos(i * Math.PI / 30);

Le funzioni

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 90

Funzioni in JavaScript  Una funzione è un insieme di istruzioni

JavaScript che esegue un compito specifico

 Per usare una funzione bisogna prima definirla, poi lo script può invocarla

  In JavaScript esistono tre modi per definire una funzione – Attraverso l’istruzione function – Attraverso il costruttore Function – Attraverso una funzione letterale

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 91

L’istruzione function  Una funzione è composta da quattro

parti – La parola chiave function –  Il nome della funzione – Una lista opzionale di parametri racchiusa

da parentesi tonde –  Il corpo della funzione (serie di istruzioni

JavaScript) racchiusi da parentesi graffe  Non occorre dichiarare il tipo di ritorno

della funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 92

Sintassi function nome_funzione ( argomenti ) {

istruzioni JavaScript }   I nomi delle funzioni sono degli identificatori,

quindi si applicano le stesse regole viste per i nomi da assegnare alle variabili

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 93

Esempi – 1 function quadrato(number) {

return number * number; }

function distanza(x1, y1, x2, y2) {

var dx = (x2 - x1); var dy = (y2 - y1); return Math.sqrt(dx*dx + dy*dy);

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 94

Esempi – 2   Il return è opzionale function print(msg) {

document.write(msg + "<BR>"); }  Dopo che una funzione è stata definita

può essere invocata attraverso l’operatore di chiamata

print("Ciao a tutti! ");

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 95

Funzioni ricorsive  È possibile definire funzioni ricorsive function fattoriale(x) {

if (x <= 1) return 1; else return x * fattoriale(x-1);

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 96

Argomenti di una funzione   Il passaggio avviene per valore

– Passando oggetti, possiamo modificarne le loro proprietà

 Possono essere passati un numero variabili di argomenti –  In più o in meno di quelli specificati nella

definizione della funzione – Vedremo in seguito come accedere a tutti

gli argomenti passati

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 97

Dove definire le funzioni?  Possono comparire in qualsiasi punto

del documento HTML

 È possibile definirle tutte nella sezione HEAD

•  O prima di </body> ….

 Meglio ancora, mettiamole in un file esterno con estensione .js – Le possiamo riusare facilmente…

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 98

Variabili locali e funzioni function init(a) { b = a; } function strana(s, t) { a = s; if (t) { var a; a = a+a; } return a+b; }

La funzione strana definisce una variabile locale a. Non importa che l’istruzione var compare all’interno di un’istruzione condizionale (if). L’istruzione var crea a all’inizio della funzione a prescindere dal valore di t

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 99

Funzioni annidate   In JavaScript è possibile definire funzioni

all’interno di un’altra funzione  Sono visibili solo all’interno della funzione

dove sono state definite  Non è possibile definire una funzione in

un ciclo o in un’istruzione condizionale – Questo vale solo per l’istruzione function ma

non per il costruttore Function o per le funzioni letterali

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 100

Esempio di funzione annidata function chiama(x) {

function quadrato(y) { return y*y; } return quadrato(x)+5;

} <P> Adesso invoco "chiama(6)", dovrebbe restituire 41. </P> <SCRIPT TYPE="text/javascript"> document.write("Risultato: " + chiama(6)); </SCRIPT>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 101

Il costruttore Function()   Permette di definire delle funzioni in maniera

dinamica (simile a create_function() in PHP)   Il costruttore si aspetta un numero variabile di

argomenti di tipo stringa –  L’ultimo argomento è il corpo della funzione –

contiene istruzioni JavaScript arbitrarie separate da punto e virgola

–  Tutti gli altri argomenti specificano i nomi degli argomenti della funzione che si sta definendo

  Per definire una funzione che non prende argomenti, è sufficiente passare a Function() solo il corpo della funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 102

Utilizzo del costruttore Function() var f = new Function("x", "y", "return x*y;");   Per invocare la funzione appena definita si

usa f(3,4);

var g = new Function("x", "return x*x;"); var hi = new Function("alert(‘Ciao a tutti’);");

g(3); hi();

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 103

Note sul costruttore Function()   Il corpo della funzione può essere

costruito in maniera dinamica all’interno di uno script

 Non viene specificato come argomento un nome per la funzione che si sta definendo – Le funzioni create con Function() sono

chiamate funzioni anonime – Come definire le funzioni ricorsive?

•  dettagli in seguito…

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 104

Funzioni letterali – 1  Una funzione letterale è un’espressione

che definisce una funzione senza nome  La sintassi di una funzione letterale è

molto simile a quella dell’istruzione function tranne per il fatto che: – è usata come un’espressione piuttosto che

come un’istruzione – non è necessario specificare il nome della

funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 105

Funzioni letterali – 2  Funzioni definite in questo modo sono a

volte chiamate funzioni lambda in ricordo del linguaggio di programmazione LISP

 Sono utili quando devono essere usate una sola volta e non gli si deve assegnare un nome

 Possono essere memorizzate in una variabile, passate come argomento di una funzione o invocate direttamente

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 106

Esempio di funzione letterale var f1 = function(x) { return x*x; };

 Definizioni più o meno equivalenti sono:

var f2 = new Function(“x”, “return x*x;”);

function f3(x) { return x*x; }

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 107

Differenze tra f1, f2 ed f3?

 f1(x), f2(x) ed f3(x) restituiscono lo stesso risultato, ma nell’ambiente di esecuzione dove sono definite vengono defini t i t re “oggett i ” differenti

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 108

Esempi di funzioni letterali   Definizione e memorizzazione

a[0] = function(x) { return x*x; };

  Definizione di una funzione e suo passaggio ad un’altra

a.sort(function(a,b) {return a-b;} );   Definizione ed invocazione var cento = (function(x) { return x*x; }) (10);

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 109

Funzioni letterali con nome  È possibile definire una funzione

letterale assegnandole un nome – Utile per funzioni ricorsive

 Esempio

var f = function fattoriale(x) { if (x<=1) return 1; else return x*fattoriale(x-1); };

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 110

Campo di visibilità di funzioni letterali

 Le funzioni letterali possono essere rese visibili a livello globale

function xPerxPiu5(x) { quadrato=function(y) { return y*y; }; return quadrato(x)+5; }

 La funzione quadrato è visibile in qualsiasi punto del codice

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 111

Mentre, nel seguente esempio quadrato è visibile solo all’interno di xPerxPiu5

function xPerxPiu5(x) { function quadrato(y) { return y*y; } return quadrato(x)+5;

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 112

Funzione letterale come valore di ritorno function moltiplicatore(x) {

return function(y) { return x*y; } }

function print(msg) { document.write(msg); }

var perdue = moltiplicatore(2); var pertre = moltiplicatore(3); var persei = moltiplicatore(6); print( "Otto per due fa: " + perdue(8)+"<br>"); print("Otto per tre fa: " + pertre(8)+"<br>"); print("Otto per sei fa: " + persei(8)+"<br>");

x usato per inizializzare la funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 113

Funzioni come dati

  In JavaScript le funzioni sono viste come dati, quindi possono anche essere – assegnate a variabili – memorizzate come proprietà di oggetti – memorizzate come elementi di un array – passate come argomento di una funzione –  restituite come valore di ritorno di una

funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 114

Differenze tra funzioni letterali e Function()  Con Function() possiamo creare e

compilare dinamicamente al tempo di esecuzione delle funzioni.

 Le funzioni letterali sono una parte statica del programma

 Le funzioni create con Function() NON USANO lo scoping lessicale, ma sono compilate come se fossero funzioni top-level (globali)

Scoping lessicale   In JavaScript le funzioni hanno uno

scoping lessicale (statico) invece di dinamico

 Con lo scoping lessicale la funzione è in esecuzione nell’ambiente (scope) in cui è stata definita non nell’ambiente in cui è invocata – Fanno parte dello scope le variabili locali e

gli argomenti della funzione – Scope esecuzione = Scope definizione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 115

Dinamico vs lessicale  Supponiamo che una funzione utilizzi

un simbolo non definito al suo interno  Con lo Scoping Lessicale

– La funzione usa la definizione che il simbolo ha nell'ambiente in cui la funzione è definita

 Con lo Scoping Dinamico – Usa la definizione che esso ha nell'ambiente

in cui la funzione è chiamata

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 116

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 117

var x = 10; function provaScope(y) { return y + x; } alert(provaScope(7)); // Visualizza 17 function testEnv() {// Cosa visualizza ? var x = -1; return provaScope(7); } alert(testEnv()); // Visualizza sempre 17 // con lo scoping dinamico //visualizzerebbe 6

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 118

Esempio

var y = "sono nello scope globale”; function CostruisciFunzione() {

var y = "sono in CostruisciFunzione"; return new Function("return y");

} alert(CostruisciFunzione()());

Non è un errore, rappresenta l’invocazione della funzione

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 119

<script type="text/javascript"> var y = "scope globale"; function CostruisciFunzione() { var y = "scope locale"; return new Function("return y"); } function CostruisciFunzioneLetterale() { var y = "scope locale"; return function() {return y;}; } </script>

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 120

<body> <p> esempio di invocazione di funzione costruita con

Function()</p> <SCRIPT TYPE="text/javascript"> document.write(CostruisciFunzione()() + "<br>"); </SCRIPT> <p> esempio di invocazione di funzione letterale </p> <SCRIPT TYPE="text/javascript"> document.write(CostruisciFunzioneLetterale()() + "<br>"); </SCRIPT> </body>

Stampa “scope globale”

Stampa “scope locale”

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 121

Ulteriore differenza  Se una funzione viene costruita

all’interno di un ciclo con Function(), allora il costruttore esamina il corpo della funzione e crea un nuovo oggetto funzione ogni volta che viene invocato

 Se la funzione è costruita con una funzione letterale, allora essa non viene creata nuovamente ogni volta che è incontrata

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 122

L’oggetto arguments – 1  Ogni volta che una funzione viene

invocata, oltre al call object viene creato l’oggetto arguments

 Contiene i parametri della funzione e il nome della funzione che è stata invocata – Valore della proprietà callee

  In questo modo si possono gestire funzioni con un numero variabili di argomenti

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 123

L’oggetto arguments – 2  Per accedere al primo parametro della

funzione si usa arguments[0]   In generale per accedere al parametro

i-esimo si usa arguments[i-1]  Per sapere quanti parametri sono stati

passati alla funzione si usa la proprietà lenght (cioè arguments.length)

  Il nome della funzione invocata è memorizzata nella proprietà callee (cioè arguments.callee)

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 124

Esempio – 1 function max() { var m = Number.NEGATIVE_INFINITY; for(var i = 0; i < arguments.length; i++)

if (arguments[i] > m) m = arguments[i];

return m; } var massimo = max(10, 32, 2, 3, 43, 4, 5, 30, 6);

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 125

Esempio – 2 function f(x, y, z) {

if (arguments.length != 3) { msg= "La funzione f è chiamata con "; msg+= arguments.length; msg+= " argomenti, ma ne aspetta 3."; alert( msg ); return null; } // esecuzione della funzione f...

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 126

Esempio – 3  La proprietà callee è utile per funzioni

ricorsive anonime function(x) { if (n<=1) return 1;

else return x*arguments.callee(x-1);

}

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 127

Numero di argomenti di una funzione

 Possiamo anche verificare con quanti argomenti è stata definita una funzione andando ad esaminare la proprietà length dell’oggetto funzione –  arguments.callee.length

 Questa proprietà non deve essere confusa con arguments.length

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 128

Esempio function check( param ) {

var attuali = param.length; vat attesi = param.callee.length; if (attuali != attesi) return false; else return true;

} // nel corpo della funzione che vogliamo // sia chiamata con il # di parametri esatto

if(check(arguments)) ….

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 129

Funzioni ricorsive e Function()

 Abbiamo visto che il costruttore F u n c t i o n ( ) n o n p r e v e d e c o m e parametro il nome della funzione che si sta costruendo – Come possiamo dinamicamente definire

funzioni ricorsive? – Si può utilizzare opportunamente la

proprietà callee

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 130

Esempio var func = "if (x <= 1) return 1; " func += " else return x*arguments.callee(x-1);" var f = new Function("x", func ); f(4); //restituisce 24

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 131

Definizione di proprietà di una funzione

  In JavaScript non è possibile dichiarare in una funzione una variabile static per far si che il suo valore persista attraverso invocazioni successive –  E.g., tenere traccia di quante volte una funzione

ricorsiva viene chiamata per risolvere un problema   Per ovviare al problema è possibile

aggiungere una proprietà alla funzione. Tale proprietà rappresenterà la variabile statica NomeFunzione.NomeProprietà

Prof. Carlo Blundo Tecnologie di Sviluppo per il WEB 132

Esempio GeneraUnicoIntero.contatore=0;

//Non è una variabile globale function GeneraUnicoIntero() {

return GeneraUnicoIntero.contatore++; }   Le dichiarazioni di funzione sono elaborate prima che

il codice dello script venga eseguito; di conseguenza, l’assegnamento GeneraUnicoIntero.contatore=0 può comparire nello script prima della definizione della funzione