Javascript è un linguaggio di programmazione che porta il web in una nuova dimensione: la dimensione dell’interattività , della dinamicità e degli effetti speciali. Vale la pena conoscerlo, vero?
Gli effetti speciali, le animazioni e il gioco che avete ammirato nella slide precedente
Un linguaggio di programmazione
Sono linguaggi la cui costruzione sintattica è molto più vicina a quella del linguaggio umano piuttosto che a quella della macchina.
Sono linguaggi che non costringono il programmatore ad assegnare preventivamente alle variabili un tipo specifico di dato. Il tipo di dato viene piuttosto dedotto dal valore a cui la variabile fa riferimento in uno specifico momento dell’esecuzione del programma. Javascript è un linguaggio debolmente tipizzato.
Sono linguaggi che permettono di modificare lo stato di un programma durante l’esecuzione dello stesso (cioé a runtime).
Generalmente i linguaggi dinamici sono anche debolmente tipizzati.
Javascript è un linguaggio dinamico.
I programmi servono a risolvere problemi in modo efficiente e controllato.
I linguaggi orientati agli oggetti permettono di schematizzare il problema mediante una rappresentazione “ad oggetti” dello stesso.
Schematizzare un problema mediante oggetti può portare ad una risoluzione più intuitiva dello stesso.
Il punto precedente non è sempre vero.
Javascript è orientato agli oggetti.
Vi chiederete: cosa c’entra tutto questo con il web, gli effetti grafici e le animazioni?
Javascript permette di manipolare i contenuti e la visualizzazione della pagina in maniera programmatica. Senza l’intervento di un programma Javascript la struttura di una pagina web risulterebbe “congelata” nella sua scrittura iniziale. Un programma Javascript permette di “scongelare” la struttura di una pagina e di modificarla dinamicamente.
A metà degli anni ‘90, all’alba dell’esplosione del Web come IL servizio Internet per definizione, Brendan Eich entra in Netscape allo scopo di includere nel loro browser un interprete Scheme.
Al tempo in molti (tra cui Bill Joy di Sun) erano convinti e spingevano affinchè il Web avesse un linguaggio di scripting da includere in formato sorgente all’interno delle pagine HTML…
Purtroppo tutto questo interessamento finì per essere controproducente:
la visione del management (di Netscape e di Sun) era che Java (e le applet) sarebbe stato il linguaggio usato dai programmatori per scrivere i componenti mentre questo nuovo linguaggio di scripting sarebbe stato utilizzato dagli scripter per scrivere il codice collante
E’ fu così che il progetto inizialmente chiamato Mocha e successivamente chiamato Livescript raggiunse l’inclusione nella versione 2.0 del browser di Netscape:
Nel 1996 (lo stesso anno in cui Javascript è stato ufficialmente rilasciato con Netscape Navigator 2.0) Netscape sottopone Javascript alla ECMA International per la standardizzazione:
ECMAScript è il nome della standardizzazione del linguaggio contenuta nello standard ECMA-262 (arrivato alla terza revisione) a cui Javascript (Netscape), JScript (Microsoft) cercano di rimanere compatibili.
Oltre allo standard ECMA-262 (alla revisione 3 attualmente in uso) sono presenti altri 3 standard riguardanti Javascript oltre alla revision 4 dello standard ECMA-262:
Da ECMAScript (oltre a Javascript e JScript) derivano altri linguaggi di scripting, oltre a essere presenti diverse varianti dello stesso dialetto:
La quarta revisione dello standard ECMA-262 aveva in programma l’introduzione di una notevole quantità di caratteristiche nel linguaggio (tra cui classi e lo static typing)…
… Ma attualmente l’ultima versione dello standard (rilasciata nel Dicembre 2009
con il nome di Harmony
) contiene solo alcune lievi modifiche (che costituiscono ora ECMAScript 5
) allo scopo di stabilizzare alcune caratteristiche già implementate in diverse varianti, senza stravolgerne la sua natura corrente.
Come è possibile immaginare il cammino dello standard (ECMAScript) è sempre più lento di quello delle implementazioni dovendo mantenere la compatibilità con il passato e tra le varie versioni.
Ogni implementazione (soprattutto quando utilizzata in ambiti diversi delle pagine Web) ha introdotto (e continua ad introdurre) correttivi o nuove caratteristiche al proprio dialetto.
Tutti i linguaggi dinamici sono in genere dotati di un interprete interattivo con cui interagire con la Virtual Machine in maniere interattiva.
Javascript non fa ovviamente eccezione anzi sono molti i modi in cui è possibile ottenere una shell Javascript con cui interagire:
https://developer.mozilla.org/en/JavaScript_shellsIl laboratorio integrato accessibile dalle slide di questo corso è dotato di un semplice interprete interattivo (basato su FirebugLite
):
In Javascript le variabili possono essere dichiarate esplicitamente (mediante la parola chiave var ) o essere utilizzate senza nessuna dichiarazione esplicita:
NOTA : E’ assolutamente consigliabile dichiarare sempre esplicitamente le variabili, in quanto quelle utilizzate senza dichiarazione esplicita finiscono nello spazio (“scope”) globale
Ora provalo nell'interprete interattivoJavascript ha un solo tipo di numero.
Non distingue quindi tra numeri interi e float ma è dotato di un unico type rappresento internamente come un floating point a 64 bit (identico ad un double Java):
Ora provalo nell'interprete interattivoInfinity rappresenta tutti i numeri più grandi di 1.79769313486231570e+308
Ora provalo nell'interprete interattivoMath è un built-in object che raccoglie costanti e funzioni matematiche utili, mentre parseInt e isNaN sono funzioni built-in nello “scope” globale.
Ora provalo nell'interprete interattivoIn Javascript le stringhe sono sequenze di caratteri (Unicode a 16-bit)
Ora provalo nell'interprete interattivoIn Javascript gli oggetti e i dizionari (HashTable) sono sinonimi e costituiscono uno dei concetti fondamentali del linguaggio:
Ora provalo nell'interprete interattivoMentre la chiave (o nome) deve essere necessariamente una stringa, il valore puo’ essere un qualunque oggetto.
Ora provalo nell'interprete interattivoUn Array è uno speciale oggetto built-in:
Ora provalo nell'interprete interattivoJavascript è dotato di un tipo boolean, con valori (che costituiscono parole chiave) true and false. Tutti i valori possono essere convertiti in boolean secondo le seguenti regole:
Javascript è dotato di tutti gli operatori dei linguaggi con sintassi C-like;
Gli operatori incremento e decremento possono essere usati come operatori sia in prefix che in postfix
L’operatore ”+” viene utilizzato sia per la somma tra numeri che per la concatenazione di stringhe, in caso gli operatori siano di tipo diverso viene operata una conversione forzata, cosa che richiede particolare attenzione:
Ora provalo nell'interprete interattivoGli operatori di test di uguaglianza in Javascript richiedono ancora più attenzione in quanto le versioni standard ( ”==” / ”!=” ) operano una conversione forzata e silenziosa che potrebbe non dare i risultati che ci si aspetterebbe:
NOTA : per questo motivo è sempre consigliabile usare gli operatori ”===” e ”!==” che non effettuano conversioni forzate e silenziose.
Ora provalo nell'interprete interattivotypeof ed instanceof sono due particolari operatori il cui compito è rispettivamente identificare il tipo di un valore e verificare se è istanza di un determinato prototipo:
Ora provalo nell'interprete interattivoLe strutture di controllo di Javascript sono simili alle strutture di controllo classiche dei linguaggi C-like:
Ora provalo nell'interprete interattivoLo switch (analogo a quello presente nei linguaggi C-like) confronta l’espressione contenuta nella switch con l’espressione contenuta nelle singole clausole case mendiante l’operatore ===:
for…in è una variante della struttura di controllo for utili per iterare su Array ed Object:
Ora provalo nell'interprete interattivoJavascript è dotato di un sistema di gestione delle eccezioni con una sintassi del tutto simile agli altri linguaggi C-like:
Le funzioni sono sicuramente, insieme agli Object/Hashtables, uno dei costrutti fondamentali per Javascript.
Ora provalo nell'interprete interattivoIn Javascript le variabili dichiarate con var non sono legate al block scope come negli altri linguaggi C-like, ma sono in realtà legate al function scope:
Per questo motivo è opportuno dichiarare tutte le variabili utilizzate in una funzione in testa, oltre a non dimenticarsi di dichiararle con var …
Ora provalo nell'interprete interattivoIn Javascript il nome delle funzioni è opzionale, per cui le funzioni anonime si dichiarano in maniera analoga alle funzioni dotate di un nome.
Inoltre all’interno dello scope di una funzione è possibile accedere ad una variabile simile ad un array che ci da accesso ai parametri e ad un riferimento alla funzione corrente (utile in caso di funzioni anonime):
Le funzioni in Javascript sono First class object (possono essere passate come parametri e ritornate come valori dalle funzioni) e sono dotate di proprietà e metodi come gli altri oggetti.
In Javascript è consentito dichiarare una funzione all’interno di un’altra funzione:
NOTA: non ha importanza dove vengono dichiarate le inner function , è come se tutte le funzioni fossero valutate all’inizio della funzione.
Le closure sono una importantissima caratteristica delle funzioni in Javascript, sulla quale si poggiano sia i meccanismi di Event Handling usati solitamente nello scripting Web, che molte delle tecniche per completare la OOP di Javascript o ovviare ad alcuni dei suoi difetti di design.
Le closure in Javascript sono costituite dalle normali funzioni, le quali portano con se il lexical scope nelle quali sono state definite.
Ci sono alcuni valori in Javascript che hanno comportamente particolarmente poco amichevoli:
Se questo non bastasse… Javascript ha ereditato da Java la differenza fra primitiva e istanza del relativo oggetto:
NOTA : per questo motivo è sempre meglio utilizzare esclusivamente le primitive per i tipi dati primitivi (string, boolean, number e function)
Ora provalo nell'interprete interattivo