# JavaScript
## Premessa

JavaScript nasce come linguaggio di scripting lato-client orientato agli oggetti e agli eventi per aggiungere funzionalità alle pagine web. Occorre distinguerlo da falsi-simili come il Java che ha natura e scopi totalmente differenti, o da altre tecnologie come il NodeJS che usano JavaScript ma elevandolo a linguaggio lato-server. Di suo, Javascript può essere utilizzato per fornire interattività alle componenti HTML di una pagina, quindi ad esempio menù e form interattivi, ed è in genere già integrato nei temi dei più diffusi CMS, pronto all'uso. Per inserire codice JavaScript è sufficiente inserire il codice nel tag HTML <script>, importare un file '.js' nella pagina HTML, da una fonte locale o da CDN.
Questa lezione tratta perciò del linguaggio JavaScript interpretato lato-client, incluso in pagine HTML.

## Introduzione

Fu originariamente sviluppato da Brendan Eich della Netscape Communications come linguaggio di scripting interpretato lato-client e debolmente orientato agli oggetti. Si contrappone all'HTML e al CSS che non sono linguaggi di programmazione ma bensì di formattazione.

## Concetti base
### Integrazione in una pagina HTML

I comandi JavaScript vengono interpretati dentro all'apposito tag <script>. È possibile utilizzarlo più volte sullo stesso documento inserendolo nell'<head> o nel <body> del documento HTML:
È possibile richiamare anche uno script su un file esterno. Il file deve contenere solo codice JavaScript ed è bene che abbia estensione .js:
Nota: I prossimi esempi di codice saranno implicitamente in un tag <script>, come nell'esempio sopra.

### Console di debug

Molti browser-web moderni come Mozilla Firefox o Chromium includono una console di debug, utile per l'analisi del codice di una pagina web.
Ad esempio su Mozilla Firefox la console di debug si apre con il tasto F12 e permette di digitare direttamente comandi JavaScript, o vedere l'output di console.log utilizzato nell'esempio precedente.
La console di debug mostra errori normalmente non visibili durante la semplice navigazione.

### Commenti

I commenti non vengono considerati dall'interprete JavaScript. Così come per qualsiasi software è buona abitudine usare i commenti multi-riga all'inizio del file per riassumere cosa fa il codice, insieme al nome dell'autore e la licenza del proprio codice.

## Variabili

JavaScript non è un linguaggio a tipizzazione forte: alle variabili non si specifica a priori il tipo e può cambiare nel corso del programma. Solitamente la prima istanziazione si effettua tramite var.
Le variabili sono case-sensitive.
Qualsiasi variabile istanziata in una pagina ha visibilità globale, al contrario qualsiasi variabile istanziata in una funzione ha visibilità locale.

### Funzioni

I seguenti codici hanno il medesimo risultato:
Funzione classica:
Funzione anonima:
Funzione anonima auto-richiamata (avanzata):

## Notazione a cammello

Solitamente le funzioni e le variabili JavaScript sono chiamate secondo la notazione a cammello:
Output: true

## Oggetti e prototipi

La programmazione orientata agli oggetti in JavaScript può risultare un po' caotica, questo perché il concetto di classe in JavaScript è sostituita dalla possibilità di creare oggetti manualmente o tramite "prototipi polimorfi".
Un oggetto creato manualmente:
Output: 1
O ancora manualmente:
Output: 1
Un oggetto creato tramite un prototipo:
Output: 1
Si può anche modificare uno dei prototipi predefiniti per appenderci metodi personalizzati:
Output: @@Wikiversità@@

### Approfondimento

JavaScript viene sempre più utilizzato anche in ambito web per siti e applicazioni, tuttavia sotto l'aspetto SEO la resa non sempre è ottimale. In generale, pero', seguendo una serie di good practices è possibile farne uso anche in ottica motori di ricerca, che nel frattempo si sono evoluti e riescono a leggere ed interpretare, ad oggi, anche i contenuti scritti in questo linguaggio. JavaScript in passato non era eseguito dai bot dei motori di ricerca., quindi il testo generato dinamicamente non veniva indicizzato. Ultimamente Google ha fatto notevoli progressi nell'interpretazione di JavaScript in modo massivo (durante il crawling delle pagine), resta comunque necessario seguire alcuni accorgimenti per ottimizzare l'indicizzazione.

### New (approfondimento)

Dato che una funzione e un costruttore per l'interprete JavaScript sono la stessa cosa, è importante ricordarsi di esplicitare la parola chiave new se si sta istanziando un oggetto con un costruttore. Omettere new fa ottenere l'eventuale valore di ritorno della funzione.
In questo esempio stampo in console un oggetto correttamente creato col costruttore, e poi ciò che otterrei senza new:
Output: Object { nome: "Mario Rossi", score: 0 } Output: "Eh? Mi usi come funzione?"
* ↑ CDN, Content Delivery Network
* ↑ https://www.seoroma.com/news/luso-corretto-di-javascript-in-termini-di-seo.php
* ↑ https://www.evemilano.com/2017/01/seo-angularjs/