close

Javascript

Vai alla navigazione Vai alla ricerca
javascript
Logo JavaScript non ufficiale 2.svg
JavaScript screenshot.png
?
Informazione Generale
Estensioni comuni .js
Paradigma Multiparadigma , programmazione funzionale , [ 1 ] ​programmazione basata su prototipi , imperativo , interpretato ( scripting )
Apparso in 4 dicembre 1995
Progettato da Comunicazioni Netscape , Fondazione Mozilla
Ultima versione stabile ECMAScript 2021 (01 giugno 2021 (1 anno, 4 mesi e 15 giorni))
sistema di tipo debole, dinamico, anatra
implementazioni SpiderMonkey , Rhino , KJS , JavaScriptCore , V8 , Chakra .
dialetti ECMAScript
influenzato da Java , Perl , Self , Python , C , Schema
ha influenzato ObjectiveJ, JScript .NET, TIScript

JavaScript (comunemente abbreviato JS ) è un linguaggio di programmazione interpretato , dialetto dello standard ECMAScript . È definito come orientato agli oggetti , [ 2 ] basato su prototipi , imperativo, debolmente tipizzato e dinamico .

Viene utilizzato principalmente lato client , implementato come parte di un browser Web che consente miglioramenti dell'interfaccia utente e pagine Web dinamiche [ 3 ] e JavaScript lato server ( JavaScript lato server o SSJS ). Significativo è anche il suo utilizzo in applicazioni esterne al web , ad esempio in documenti PDF , applicazioni desktop (per lo più widget ).

Dal 2012, tutti i browser moderni supportano pienamente ECMAScript 5.1, una versione di JavaScript. I browser meno recenti supportano almeno ECMAScript 3. La sesta edizione è stata rilasciata a luglio 2015. [ 4 ]

JavaScript è stato progettato con una sintassi simile a C++ e Java , [ 5 ] ​[ 6 ]​ sebbene adotti nomi e convenzioni dal linguaggio di programmazione Java. Tuttavia, Java e JavaScript hanno semantica e scopi diversi. Il loro rapporto è prettamente commerciale, dopo l'acquisto del creatore di Java (Sun Microsystems) da Nestcape Navigator (creatore di LiveScript) e il cambio di nome del linguaggio di programmazione.

Tutti i browser moderni interpretano il codice JavaScript incorporato nelle pagine web. Per interagire con una pagina web, il linguaggio JavaScript viene fornito con un'implementazione del Document Object Model (DOM). Javascript è l'unico linguaggio di programmazione che i browser comprendono in modo nativo.

Tradizionalmente è stato utilizzato nelle pagine Web HTML per eseguire operazioni e solo nell'ambito dell'applicazione client , senza accedere alle funzioni del server . Attualmente è ampiamente utilizzato per inviare e ricevere informazioni dal server insieme all'aiuto di altre tecnologie come AJAX . JavaScript viene interpretato dall'interprete mentre le istruzioni vengono scaricate insieme al codice HTML .

Dal rilascio del giugno 1997 dello standard ECMAScript 1, ci sono state le versioni 2, 3 e 5, che è la più utilizzata oggi (la versione 4 è stata abbandonata [ 7 ] ). Nel giugno 2015 è stata chiusa e pubblicata la versione ECMAScript 6. [ 8 ]

Storia

Nascita di JavaScript

JavaScript è stato originariamente sviluppato da Brendan Eich di Netscape con il nome Mocha , che è stato successivamente ribattezzato LiveScript , diventando infine JavaScript. Il cambio di nome ha coinciso all'incirca con il momento in cui Netscape ha aggiunto il supporto della tecnologia Java al suo browser Web Netscape Navigator nella versione 2002 nel dicembre 1995. La denominazione ha causato confusione, dando l'impressione che il linguaggio sia un'estensione di Java., ed è stato considerato da molti come strategia di marketing per Netscape per acquisire prestigio e innovare nel campo dei nuovi linguaggi di programmazione web. [ 9 ] ​[ 10 ]

"JAVASCRIPT" è un marchio registrato di Oracle Corporation . [ 11 ] Viene utilizzato su licenza da prodotti creati da Netscape Communications e da entità attuali come Mozilla Foundation . [ 12 ] ​[ 13 ]

Microsoft ha chiamato il suo dialetto di JavaScript " JScript ", per evitare problemi di branding. JScript è stato adottato nella versione 3.0 di Internet Explorer, rilasciata nell'agosto 1996, e includeva il supporto di Effect 2000 per le funzioni di data, una deviazione da quelle basate in quel momento. I dialetti possono sembrare così simili che i termini "JavaScript" e "JScript" sono spesso usati in modo intercambiabile, ma la specifica JScript è incompatibile con la specifica ECMA in molti modi.

Per evitare queste incompatibilità, il World Wide Web Consortium ha progettato lo standard Document Object Model (DOM, o Document Object Model in spagnolo), che incorpora Konqueror , versioni 6 di Internet Explorer e Netscape Navigator , Opera versione 7, Mozilla Application Suite e Mozilla Firefox dalla sua prima versione. [ citazione necessaria ]

Nel 1997 gli autori hanno proposto [ 14 ] JavaScript da adottare come standard dall'Associazione Europea dei Produttori di Computer ECMA , che nonostante il nome non è europea ma internazionale, con sede a Ginevra. Nel giugno 1997 è stato adottato come standard ECMA, con il nome ECMAScript . Subito dopo anche come standard ISO .

JavaScript lato server

Netscape ha introdotto un'implementazione di scripting lato server con Netscape Enterprise Server , rilasciata nel dicembre 1994 (poco dopo il rilascio di JavaScript per browser web). [ 15 ] [ 16 ]​ A partire dalla metà degli anni 2000, c'è stata una proliferazione di implementazioni JavaScript lato server. Node.js è uno degli esempi notevoli di JavaScript lato server, utilizzato in grandi progetti. [ 17 ] ​[ 18 ]

Sviluppi successivi

JavaScript è diventato uno dei linguaggi di programmazione più popolari e ampiamente utilizzati su Internet. All'inizio, tuttavia, molti sviluppatori disapprovavano il linguaggio perché il suo pubblico previsto era costituito, tra le altre ragioni, da editori di articoli e altri hobbisti. [ 19 ] L'arrivo di Ajax ha riportato JavaScript alla ribalta e ha attirato l'attenzione di molti altri programmatori. Di conseguenza si è verificata una proliferazione di un insieme di framework e librerie di portata generale, il miglioramento delle pratiche di programmazione JavaScript e un maggiore utilizzo di JavaScript al di fuori dei browser Web , come si è visto con la proliferazione di ambienti JavaScript sul lato Web. del server . Nel gennaio 2009 è stato lanciato il progetto CommonJS con l'obiettivo di specificare una libreria da utilizzare per attività comuni principalmente per lo sviluppo al di fuori del browser web. [ 20 ]

Nel giugno 2015, lo standard ECMAScript 6 è stato chiuso e pubblicato [ 21 ] ​[ 22 ]​ con supporto irregolare tra browser [ 23 ]​ e che fornisce JavaScript con funzionalità avanzate che erano mancate e sono comunemente utilizzate in JavaScript. altri linguaggi, come come moduli per l'organizzazione del codice, vere classi per la programmazione orientata agli oggetti , espressioni di freccia, iteratori, generatori o promesse per la programmazione asincrona.

La versione 7 di ECMAScript è nota come ECMAScript 2016, [ 24 ] ed è l'ultima versione disponibile, rilasciata a giugno 2016. È la prima versione a utilizzare una nuova procedura di rilascio annuale e processo di sviluppo. [ 25 ]

Caratteristiche

Le seguenti caratteristiche sono comuni a tutte le implementazioni conformi allo standard ECMAScript, a meno che non venga specificato diversamente.

Imperativo e strutturato

JavaScript supporta gran parte della struttura di programmazione di C (ad esempio istruzioni if, loop for, istruzioni switch, ecc.). Con un avvertimento, in parte: in C, le variabili hanno come ambito il blocco in cui sono state definite; tuttavia JavaScript non lo supporta, poiché l'ambito delle variabili è quello della funzione in cui sono state dichiarate. Ciò cambia con la versione ECMAScript 2015, poiché aggiunge il supporto per l'ambito del blocco tramite la parola chiave . Come in C, JavaScript fa una distinzione tra espressioni e istruzioni. Una differenza sintattica rispetto a C è l'inserimento automatico del punto e virgola, ovvero in JavaScript i punto e virgola che terminano una frase possono essere omessi. [ 26 ] let

Dinamico

digitazione dinamica
Come nella maggior parte dei linguaggi di scripting , il tipo è associato al valore, non alla variabile. Ad esempio, una variabile xpuò contemporaneamente essere associata a un numero e successivamente rimbalzare a una stringa . JavaScript supporta diversi modi per controllare il tipo di un oggetto, inclusa la digitazione anatra . [ 27 ] Un modo per scoprirlo è attraverso la parola chiave typeof.
oggettivo
JavaScript è composto quasi interamente da oggetti . Gli oggetti in JavaScript sono array associativi , migliorati dall'inclusione di prototipi (vedi sotto). I nomi delle proprietà degli oggetti sono chiavi di tipo string: obj.x = 10e obj['x'] = 10sono equivalenti, la notazione del punto è sintattica sugar . Le proprietà e i relativi valori possono essere creati, modificati o eliminati in fase di esecuzione. La maggior parte delle proprietà di un oggetto (e quelle incluse nella catena di ereditarietà prototipo) possono essere enumerate tramite l'istruzione loop for... in. JavaScript ha un piccolo numero di oggetti predefiniti come Functione Date.
Valutazione in fase di esecuzione
JavaScript include la funzione evalper valutare le espressioni espresse come stringhe in fase di esecuzione. Per questo motivo si consiglia di evalutilizzarlo con cautela e di scegliere di utilizzare la funzione JSON.parse()il più possibile, in quanto può essere molto più sicura.

Funzionale

Funzionalità di prima classe
Le funzioni sono spesso chiamate cittadini di prima classe; sono oggetti in sé. In quanto tali, hanno proprietà e metodi, come .call()e .bind(). [ 28 ]​ Una funzione annidata è una funzione definita all'interno di un'altra. Viene creato ogni volta che viene chiamata la funzione esterna. Inoltre, ogni funzione creata forma una chiusura ; è il risultato della valutazione di un ambito contenente una o più variabili dipendenti da un altro ambito esterno, incluse le costanti, le variabili locali e gli argomenti della funzione esterna chiamante. Il risultato della valutazione di tale chiusura fa parte dello stato interno di ogni oggetto funzione, anche dopo che la funzione esterna ha completato la sua valutazione. [ 29 ]

prototipo

prototipi
JavaScript utilizza prototipi invece di classi per l'uso dell'ereditarietà . [ 30 ] È possibile emulare molte delle funzionalità fornite dalle classi nei tradizionali linguaggi orientati agli oggetti mediante la prototipazione in JavaScript. [ 31 ]
Funziona come costruttori di oggetti
Anche le funzioni si comportano come costruttori. Prefissare una chiamata di funzione con la parola chiave newcrea una nuova istanza di un prototipo, che eredita le proprietà e i metodi del costruttore (incluse le proprietà del prototipo Object). [ 32 ] ECMAScript 5 fornisce il metodo Object.create, che consente la creazione esplicita di un'istanza senza dover ereditare automaticamente dal prototipo dell'oggetto (in ambienti meno recenti il ​​prototipo dell'oggetto creato potrebbe apparire come null). [ 33 ] La prototypeproprietà del costruttore determina l'oggetto utilizzato per il prototipo interno degli oggetti appena creati. È possibile aggiungere nuovi metodi modificando il prototipo dell'oggetto utilizzato come costruttore. Anche i costruttori predefiniti in JavaScript, come Arrayu Object, hanno prototipi che possono essere modificati. Sebbene ciò sia possibile, è considerata una cattiva pratica modificare il prototipo Objectpoiché la maggior parte degli oggetti in Javascript eredita i metodi e le proprietà dell'oggetto prototype, oggetti che possono aspettarsi che non siano stati modificati. [ 34 ]

Altre caratteristiche

Ambiente di runtime
JavaScript in genere dipende dall'ambiente in cui viene eseguito (ad esempio, in un browser Web ) per fornire oggetti e metodi mediante i quali gli script possono interagire con il "mondo esterno". Dipende infatti dall'ambiente poter fornire la possibilità di includere o importare script (ad esempio in HTML tramite il tag <script>). (Questa non è una funzionalità del linguaggio, ma è comune alla maggior parte delle implementazioni JavaScript.)
funzioni variadiche
Un numero indefinito di parametri può essere passato alla funzione. La funzione può accedervi tramite i parametri o anche tramite l'oggetto locale arguments. Le funzioni variadiche possono anche essere create usando il .apply().
Funziona come metodi
A differenza di molti linguaggi orientati agli oggetti, non c'è distinzione tra definizione di funzione e definizione di metodo . Piuttosto, la distinzione si verifica durante la chiamata di funzione; una funzione può essere chiamata come metodo. Quando una funzione viene chiamata come metodo di un oggetto, la parola chiave this, che è una variabile locale della funzione, rappresenta l'oggetto che ha chiamato la funzione.
Array e definizione letterale di oggetti
Come molti linguaggi di scripting, è possibile creare array e oggetti ( array associativi in ​​altri linguaggi) con una sintassi abbreviata. In effetti, questi valori letterali costituiscono la base del formato dati JSON .
Espressioni regolari
JavaScript supporta anche le espressioni regolari in modo simile a Perl , che fornisce una sintassi concisa e potente per la manipolazione del testo che è più sofisticata delle funzioni integrate negli oggetti stringa. [ 35 ]

Estensioni specifiche del produttore

JavaScript è ufficialmente sotto l' organizzazione della Mozilla Foundation e nuove funzionalità del linguaggio vengono aggiunte periodicamente. Tuttavia, solo alcuni motori JavaScript supportano queste funzionalità:

  • Le proprietà gete set(supportate anche da WebKit, Opera, [ 36 ]​ ActionScript e Rhino). [ 37 ]
  • Clausole condizionali catch.
  • Protocollo iteratore adottato da Python .
  • Coroutine adottate anche da Python.
  • Generazione di liste ed espressioni per comprensione adottata anche da Python.
  • Imposta l'ambito da bloccare tramite la parola chiave let.
  • Destrutturazione di array e oggetti (forma limitata di pattern matching).
  • Espressioni concrete in funzioni (function(args) expr).
  • ECMAScript per XML (E4X), un'estensione che aggiunge il supporto XML nativo a ECMAScript.

Sintassi e semantica

l'ultima versione del linguaggio è ECMAScript 2016 pubblicata il 17 giugno 2016. [ 38 ]

Esempi semplici

Le variabili in JavaScript sono definite usando la parola chiave var : [ 39 ]

variabile  x ;  // definisce la variabile x, sebbene non abbia alcun valore assegnato di default 
var  y  =  2 ;  // definire la variabile y e assegnarle il valore 2

Considera i commenti nell'esempio sopra, che sono preceduti da 2 barre in avanti.

Non ci sono funzionalità di I/O incluse nella lingua; l'ambiente di runtime lo fornisce già. La specifica ECMAScript nella sua edizione 5.1 menziona: [ 40 ]

...in effetti, non ci sono disposizioni in questa specifica per l'input o l'output di dati esterni per i risultati calcolati.

Tuttavia, la maggior parte degli ambienti di runtime ha un oggetto [ 41 ]​ chiamato consoleche può essere utilizzato per stampare dal flusso di output della console di debug. Ecco un semplice programma che stampa "Hello world!":

consolle . log ( "Ciao mondo!" );

Una funzione ricorsiva :

funzione  fattoriale ( n )  { 
    se  ( n  ===  0 )  { 
        ritorno  1 ; 
    } 
    restituisce  n  *  fattoriale ( n  -  1 ); 
}

Esempi di funzione anonima (o funzione lambda ) e una chiusura:

var  displayClosure  =  funzione ()  { 
    var  conteggio  =  0 ; 
    funzione di ritorno  () { ritorno ++ conteggio ; }; } var inc = displayClosure (); inc (); // restituisce 1 inc (); // restituisce 2 inc (); // ritorno 3  
         
    

   
 
 
 

Le espressioni auto-invocanti consentono alle funzioni di passarle variabili per parametro all'interno delle proprie chiusure.

var  v ; 
v  =  1 ; 
var  getValue  =  ( funzione ( v )  { 
  funzione di ritorno  () { ritorno v ;}; } ( v ));  


v  =  2 ;

getValore ();  // 1

Esempi più avanzati

Il codice seguente mostra varie funzionalità di JavaScript.

/* Trova il minimo comune multiplo (LCM) di due numeri */ 
function  LCMCalculator ( x ,  y )  {  // funzione di costruzione 
    var  checkInt  =  function  ( x )  {  // funzione interna 
        if  ( x  %  1  !==  0 )  { 
            throw  new  TypeError ( x  +  "non è un numero intero" );  // lancia un'eccezione 
        } 
        return  x ; 
    }; 
    questo . a  =  checkInt ( x )  // i punti e virgola sono opzionali 
    this . b  =  checkInt ( e ); 
} 
// Il prototipo delle istanze dell'oggetto create dal costruttore è quello della proprietà "prototype" del costruttore. 
Calcolatrice LCM . prototipo  =  {  // oggetto definito come 
    costruttore letterale :  LCMCalculator ,  // quando riassegnamo un prototipo, impostiamo correttamente la sua proprietà del costruttore 
    gcd :  function  ()  {  // metodo che calcola il massimo fattore comune 
        // Algoritmo di Euclide: 
        var  a  =  Matematica . abs ( questo . a ),  b  =  matematica . abs ( questo . b ),  t ; 
        if  ( a  <  b )  { 
            // scambia variabili 
            t  =  b ; 
            b  =  un ; 
            a  =  t ; 
        } 
        mentre  ( b  !==  0 )  { 
            t  =  b ; 
            b  =  a  %  b ; 
            a  =  t ; 
        } 
        // Abbiamo solo bisogno di calcolare il GCF una volta, quindi 'ridefiniamo' questo metodo. 
        // (Non proprio un override: è definito sull'istanza stessa, quindi 
        // this.gcd si riferisce a questo 'override' piuttosto che a LCMCalculator.prototype.gcd). 
        // Inoltre, 'gcd' === "gcd", this['gcd'] === this.gcd 
        this [ 'gcd' ]  =  function  ()  { 
            return  a ; 
        }; 
        tornare  a ; 
    }, 
    // I nomi delle proprietà degli oggetti possono essere specificati con stringhe delimitate da virgolette singole (') o doppie (“). 
    "lcm"  :  function  ()  { 
        // I nomi delle variabili non entrano in conflitto con le proprietà dell'oggetto. Ad esempio: |lcm| non è |questo.lcm|. 
        // Non usare |this.a * this.b| per evitare problemi con i calcoli in virgola mobile. 
        var  lcm  =  questo . a  /  questo . gcd ()  *  questo . b ; 
        // Abbiamo solo bisogno di calcolare LCM una volta, quindi "ridefiniamo" questo metodo. 
        questo . lcm  =  funzione  ()  { 
            ritorno  lcm ; 
        }; 
        ritorno  lcm ; 
    }, 
    toString :  function  ()  { 
        return  "LCMCalculator: a = "  +  this . a  +  ", b = "  +  questo . b ; 
    } 
};

// Definiamo una funzione generica per stampare un risultato; questa implementazione funziona solo nei browser web 
function  output ( x )  { 
    document . corpo . appendChild ( document . createTextNode ( x )); 
    documento . corpo . appendChild ( document . createElement ( 'br' )); 
}

// Nota: i metodi .map() e .forEach() del prototipo Array sono definiti in JavaScript 1.6. 
// Questi metodi sono usati qui per dimostrare la natura funzionale intrinseca del linguaggio. 
[[ 25 ,  55 ],  [ 21 ,  56 ],  [ 22 ,  58 ],  [ 28 ,  56 ]]. map ( function  ( pair )  {  // costruzione letterale di una funzione di mappatura Array +. 
    return  new  LCMCalculator ( pair [ 0 ],  pair [ 1 ]); 
}). sort ( function  ( a ,  b )  {  // ordina la raccolta usando questa funzione 
    return  a .lcm () - b .lcm (); } ) . forEach ( funzione ( obj ) { output ( obj + ", gcd = " + obj . gcd () + ", lcm = " + obj . lcm ()); });  
  
            

L'esempio seguente mostra l'output che dovrebbe essere visualizzato in una finestra del browser.

Calcolatrice LCM: a = 28, b = 56, gcd = 28, lcm = 56
Calcolatrice LCM: a = 21, b = 56, gcd = 7, lcm = 168
Calcolatrice LCM: a = 25, b = 55, gcd = 5, lcm = 275
Calcolatrice LCM: a = 22, b = 58, gcd = 2, lcm = 638

Utilizzo su pagine web

L'uso più comune di JavaScript è quello di scrivere funzioni che sono incorporate nelle pagine HTML e che interagiscono con il Document Object Model (DOM) della pagina. Alcuni semplici esempi di questo utilizzo sono:

  • Carica nuovo contenuto per la pagina o invia dati al server tramite AJAX senza ricaricare la pagina (ad esempio, un social network può consentire all'utente di inviare aggiornamenti di stato senza uscire dalla pagina).
  • Animare gli elementi della pagina, farli sparire, ridimensionare, spostare, ecc.
  • Contenuti interattivi, ad esempio giochi e riproduzione audio e video.
  • Convalida dei valori di input di un modulo web per garantire che siano accettabili prima di essere inviati al server.
  • Trasmissione di informazioni sulle abitudini di lettura e sulle attività di navigazione degli utenti a vari siti web. Le pagine Web spesso lo fanno per analisi web, monitoraggio degli annunci, personalizzazione o altri scopi. [ 42 ]

Poiché il codice JavaScript può essere eseguito localmente nel browser dell'utente (piuttosto che su un server remoto), il browser può rispondere rapidamente alle azioni dell'utente, rendendo un'applicazione più reattiva. D'altra parte, il codice JavaScript può rilevare le azioni dell'utente che solo HTML non può, come le sequenze di tasti. Applicazioni come Gmail ne traggono vantaggio: la maggior parte della logica dell'interfaccia utente è scritta in JavaScript, inviando richieste al server (ad esempio il contenuto di un messaggio di posta elettronica). La crescente tendenza all'uso della programmazione Ajax sfrutta allo stesso modo questa tecnica.

Un motore JavaScript (noto anche come interprete JavaScript o implementazione JavaScript) è un interprete che interpreta il codice sorgente JavaScript ed esegue lo script di conseguenza. Il primo motore JavaScript è stato creato da Brendan Eich presso Netscape Communications Corporation, per il browser web Netscape Navigator. Il motore, chiamato SpiderMonkey, è implementato in C. Da allora è stato aggiornato (in JavaScript 1.5) per essere conforme a ECMA-262 edizione 3. Il motore di Rhino, creato principalmente da Norris Boyd (ex Netscape, ora su Google) è un implementazione di JavaScript in Java . Rhino, come SpiderMonkey, è conforme a ECMA-262 edizione 3.

Un browser web è di gran lunga l'ambiente di hosting più comune per JavaScript. I browser Web spesso creano oggetti non nativi, dipendenti dal runtime per rappresentare il Document Object Model (DOM) in JavaScript. Il server Web è un altro ambiente di servizio comune. Un server Web JavaScript in genere espone i propri oggetti per rappresentare oggetti di richiesta e risposta HTTP, che un programma JavaScript potrebbe quindi interrogare e manipolare per generare dinamicamente pagine Web.

Poiché JavaScript è l'unico linguaggio per il quale i browser più popolari condividono il supporto, è diventato un linguaggio in cui compilano molti framework in altri linguaggi, anche se JavaScript non è stato progettato per tali scopi. [ 43 ] Nonostante i limiti prestazionali inerenti alla sua natura dinamica, la maggiore velocità dei motori JavaScript ha reso questo linguaggio un ambiente di compilazione sorprendentemente fattibile.

Esempio di script

Ecco un breve esempio di una pagina web (conforme agli standard dello standard HTML5 ) che utilizza JavaScript per la gestione dei DOM :

<!DOCTYPE html> 
< html > 
< head > 
    < meta  charset = "utf-8" > 
    < title > Esempio semplice </ title > 
</ head > 
< body > 
    < h1  id = "header" > Questo è JavaScript </ h1 >

    < script > 
        documento . corpo . appendChild ( document . createTextNode ( 'Hello World!' ));
    
        var  h1  =  documento . getElementById ( 'intestazione' );  // contiene il riferimento al tag <h1> 
        h1  =  document . getElementsByTagName ( 'h1' )[ 0 ];  // accesso allo stesso elemento <h1> 
    </ script >

    < noscript > Il tuo browser non supporta JavaScript o JavaScript è disabilitato. </ noscript > 
</ body > 
</ html >

Considerazioni sulla compatibilità

Poiché JavaScript viene eseguito in così tanti ambienti diversi, una parte importante del test e del debug è il test e la verifica che il codice JavaScript funzioni correttamente in più browser. L'interfaccia DOM per l'accesso e la manipolazione delle pagine web non fa parte dello standard ECMAScript, né dello stesso JavaScript. Il DOM è definito dagli sforzi di standardizzazione del W3C , un'organizzazione indipendente. In pratica, le diverse implementazioni di JavaScript in browser differiscono sia l'una dall'altra che dagli standard dello standard.

Per ovviare a queste differenze, gli autori di JavaScript potrebbero essere stati in grado di scrivere codice conforme agli standard che funzionerebbe correttamente anche nella maggior parte dei browser o, in mancanza, almeno scrivere codice in grado di verificare la presenza di determinate funzionalità del browser e che si comporti in modo diverso se detto la funzionalità non è disponibile. [ 44 ] Ci sono casi in cui due browser possono implementare la stessa funzionalità, ma con un comportamento diverso, un fatto che può aiutare i programmatori a rilevare quale browser è in esecuzione in quel momento e quindi modificare il comportamento della tua scrittura in modo che corrisponda. [ 45 ] ​[ 46 ]​ I programmatori utilizzano spesso librerie o strumenti che tengono conto delle differenze tra i browser.

Inoltre, gli script potrebbero non funzionare per alcuni utenti. Ad esempio, un utente può:

  • Utilizzando un browser meno recente senza il supporto completo dell'API DOM,
  • Utilizzare un PDA o un browser per cellulare che non può eseguire JavaScript
  • Disabilitare l'esecuzione di JavaScript, come precauzione di sicurezza,
  • Utilizzo di un browser vocale a causa, ad esempio, di una disabilità visiva.

Per supportare questi utenti, gli sviluppatori Web creano spesso pagine a tolleranza di errore basate su programmi utente (tipo di browser) che non supportano JavaScript. In particolare, la pagina dovrebbe essere comunque utile senza le funzionalità aggiuntive che JavaScript avrebbe aggiunto. Un approccio alternativo che molti ritengono preferibile consiste nel creare prima il contenuto utilizzando tecnologie che funzionano in tutti i browser e nel migliorare il contenuto per gli utenti che hanno abilitato JavaScript.

Accessibilità

Supponendo che l'utente non abbia disabilitato l'esecuzione del codice JavaScript, sul lato client JavaScript dovrebbe essere scritto sia allo scopo di migliorare le esperienze dei visitatori con disabilità visive o fisiche, sia per evitare di nascondere le informazioni a questi visitatori. [ 47 ]

Gli screen reader , utilizzati da non vedenti e ipovedenti, possono essere presi in considerazione da JavaScript e quindi essere in grado di accedere e leggere gli elementi DOM della pagina. Il codice HTML scritto dovrebbe essere il più conciso, navigabile e semanticamente ricco possibile, indipendentemente dal fatto che JavaScript venga eseguito o meno.

JavaScript non dovrebbe dipendere totalmente dagli eventi del mouse del browser e dovrebbe essere accessibile agli utenti che non desiderano utilizzare il mouse (computer) per navigare o che scelgono di utilizzare solo la tastiera. Ci sono eventi indipendenti dal dispositivo come onfocuse onchangeche sono preferibili nella maggior parte dei casi. [ 47 ]

JavaScript non deve essere utilizzato per creare confusione o disorientamento all'utente web. Ad esempio, la modifica o la disabilitazione delle normali funzionalità del browser, come la modifica del modo in cui si comporta il pulsante per tornare indietro o l'aggiornamento dell'evento, sono pratiche che in genere è meglio evitare. Allo stesso modo, l'attivazione di eventi di cui l'utente potrebbe non essere a conoscenza riduce il senso di controllo dell'utente e provoca modifiche impreviste al contenuto della pagina. [ 48 ]

Spesso, il processo per fornire una pagina web complessa con il massimo grado di accessibilità possibile diventa un problema non banale in cui molte questioni finiscono per essere dibattute e formulate opinioni, richiedendo l'impegno di tutti fino alla fine. Tuttavia, gli user agent e le tecnologie assistive per le persone con disabilità sono in continua evoluzione e nuove linee guida e informazioni continuano ad essere pubblicate sul web. [ 47 ]

Sicurezza

JavaScript e il DOM consentono ai programmatori di utilizzarlo in modo improprio per introdurre script che eseguono codice con contenuto dannoso senza il consenso dell'utente, compromettendo così la sicurezza dell'utente.

Gli sviluppatori di browser tengono conto di questo rischio utilizzando due restrizioni. Innanzitutto, gli script vengono eseguiti in una sandbox in cui possono essere eseguite solo azioni relative al Web, non attività di programmazione generiche come la creazione di file. In secondo luogo, è limitato dalla stessa politica di origine: gli script di un sito Web non hanno accesso alle informazioni inviate a un altro sito Web (da un altro dominio) come nomi utente, password o cookie. La maggior parte dei difetti di sicurezza di JavaScript sono legati alla violazione di una di queste due restrizioni.

Esistono progetti come AdSafe o Secure ECMA script (SES) che forniscono livelli di sicurezza più elevati, soprattutto nel codice creato da terze parti (come gli annunci). [ 49 ] ​[ 50 ]

La Content Secure Policy (CSP) è il metodo principale previsto per garantire che solo codice attendibile possa essere eseguito su una pagina web.

Vulnerabilità tra siti

Un problema di sicurezza comune in JavaScript è il cross-site scripting o XSS, una violazione della policy della stessa origine. Le vulnerabilità XSS consentono a un utente malintenzionato di iniettare codice JavaScript nelle pagine Web visitate dall'utente. Uno di questi siti Web potrebbe essere quello di una banca, con l'attaccante in grado di accedere all'applicazione bancaria con i privilegi della vittima, che potrebbe rivelare informazioni segrete o trasferire denaro senza l'autorizzazione della vittima. Una soluzione alle vulnerabilità XSS consiste nell'utilizzare l'escape HTML durante la visualizzazione di informazioni da fonti non attendibili.

Alcuni browser includono una protezione parziale contro gli attacchi XSS riflessi (l'attaccante è nella stessa richiesta web). L'attaccante fornisce un URL che include codice dannoso. Tuttavia, anche gli utenti del browser sono vulnerabili ad altri attacchi XSS, come quelli in cui il codice dannoso è archiviato in un database. Solo la corretta progettazione delle applicazioni Web lato server può impedire totalmente XSS. Le vulnerabilità XSS possono verificarsi anche a causa di errori di esecuzione da parte degli sviluppatori di browser. [ 51 ]

Un'altra vulnerabilità è la falsificazione di richieste tra siti o CSRF. In CSRF, il codice del sito Web di attacco inganna il browser della vittima, consentendo all'attaccante di effettuare richieste per conto della vittima, rendendo impossibile per l'applicazione di destinazione (ad esempio una banca che effettua un trasferimento di denaro) di sapere se la richiesta è stata effettuata volontariamente dall'utente o da un attacco CSRF.

L'attacco funziona perché, se il sito di destinazione utilizza solo i cookie per autenticare le richieste della vittima, le richieste avviate dal codice dell'attaccante avranno le stesse credenziali di accesso legittime delle richieste avviate dall'utente.

In generale, la soluzione a CSRF è introdurre un campo modulo nascosto il cui valore viene utilizzato per eseguire l'autenticazione, e non solo tramite cookie, su richieste che possono avere effetti duraturi. Anche il controllo dell'intestazione del referer HTTP può aiutare.

"JavaScript hijacking" è un tipo di attacco CSRF in cui un tag <script> sul sito Web dell'attaccante sfrutta una vulnerabilità nella pagina del sito della vittima che provoca la restituzione di informazioni private, sotto forma di codice JSON o JavaScript. Le possibili soluzioni sono:

  • che un token di autenticazione sia richiesto nei parametri delle richieste POST e GET per quelle richieste che richiedono la restituzione di informazioni utente private.
  • usa POST e non GET per le richieste che restituiscono informazioni private

Strumenti di sviluppo

In JavaScript, avere un debugger diventa necessario quando si sviluppano applicazioni grandi e non banali. Poiché possono esserci differenze di implementazione tra i diversi browser (soprattutto in termini di DOM), è utile avere accesso a un debugger per ciascuno dei browser che la nostra applicazione web avrà come target. [ 52 ]

I debugger Web sono disponibili per Internet Explorer, Firefox, Safari, Google Chrome e Opera. [ 53 ]

Sono disponibili tre debugger per Internet Explorer : Microsoft Visual Studio è il più avanzato dei tre, seguito da vicino da Microsoft Script Editor (un componente di Microsoft Office ) [ 54 ] e infine Microsoft Script Debugger, che è molto più basilare dell'altro due, anche se è gratuito. L' IDE gratuito Microsoft Visual Web Developer Express offre una versione limitata della funzionalità di debug JavaScript in Microsoft Visual Studio. Internet Explorer ha incluso strumenti per sviluppatori dalla versione 8 (mostrato premendo il tasto F12). Le applicazioni Web all'interno di Firefox possono essere sottoposte a debug utilizzando il componente aggiuntivo Firebug o il vecchio debugger Venkman. Firefox ha anche una console di errore di base integrata, che registra e valuta JavaScript. Registra anche gli errori e gli avvisi CSS . Opera include una serie di strumenti chiamati Dragonfly. [ 55 ] Web Inspector di WebKit include un debugger JavaScript [ 56 ] utilizzato in Safari , insieme a una versione modificata di Google Chrome .

Esistono alcuni strumenti di supporto per il debug, anch'essi scritti in JavaScript e creati per essere eseguiti sul Web. Un esempio è il programma JSLint , sviluppato da Douglas Crockford , che ha scritto molto sul linguaggio. JSLint analizza il codice JavaScript in modo che sia conforme a una serie di standard e linee guida per garantire funzionalità e manutenibilità adeguate.

Vedi anche

Riferimenti

  1. ^ Douglas Crockford su JavaScript funzionale (2:49): "[JavaScript] è il linguaggio funzionale più popolare al mondo. JavaScript è ed è sempre stato, almeno dalla [versione] 1.2, un linguaggio di programmazione funzionale."
  2. ^ "Copia archiviata" . Archiviato dall'originale il 12 aprile 2015 . Estratto il 23-11-2010 . 
  3. ^ M. Domínguez-Dorado,. Tutta la programmazione. N. 12. Pagine. 48-51. Editoriale Iberprensa (Madrid). DL M-13679-2004. Settembre 2005. Database lato client con DB JavaScript . 
  4. ^ "JavaScript" . Rete di sviluppatori Mozilla . Estratto il 16 settembre 2016 . 
  5. «Informazioni su JavaScript - JavaScript | MDN» . developer.mozilla.org (in inglese americano) . Estratto il 4 luglio 2022 . 
  6. ^ "Introduzione" . web.stanford.edu . Estratto il 4 luglio 2022 . 
  7. ^ Eich, Brendan (13 agosto 2008). ECMAScript Harmony . Estratto il 22 luglio 2015 . 
  8. ^ campusMVP (19 giugno 2015). "ECMAScript 6 è ora uno standard chiuso" . Estratto il 22 luglio 2015 . 
  9. Linguaggi di programmazione utilizzati su Internet e World Wide Web (WWW) (spagnolo)
  10. ^ JavaScript: la guida definitiva, 6a edizione
  11. http://tsdr.uspto.gov/#caseNumber=75026640&caseType=SERIAL_NO&searchType=statusSearch
  12. Marchi Oracle .
  13. "Informazioni su JavaScript " . Estratto il 29 agosto 2013 . "JavaScript è un marchio o un marchio registrato di Oracle negli Stati Uniti e in altri paesi." 
  14. Comunicato stampa Netscape (spagnolo)
  15. "Capitolo 2: Per iniziare" . Guida JavaScript lato server . Netscape Communications Corporation. 1998 . Estratto 25-04-2012 . 
  16. ^ Mike Morgan (1996). "Capitolo 6: Netscape Internet Application Framework" . Utilizzo di Netscape™ LiveWire™, edizione speciale . Quella. Archiviato dall'originale il 21 dicembre 2012 . Estratto il 19 maggio 2013 . 
  17. ^ "Javascript lato server: ritorno con una vendetta" . Leggi Scrivi Web . 17 dicembre 2009 Archiviata dall'originale il 2 giugno 2012 . Estratto il 28 maggio 2012 . 
  18. ^ "L'obiettivo di Node è fornire un modo semplice per creare programmi di rete scalabili" . Informazioni su Node.js . Gioioso. 
  19. ^ "JavaScript: il linguaggio di programmazione più incompreso del mondo" . crockford.com . Estratto il 19 maggio 2009 . 
  20. ^ Kris Kowal (1 dicembre 2009). "Lo sforzo di CommonJS imposta JavaScript sulla strada per il dominio del mondo" . Ars Tecnica . Pubblicazioni Condé Nast . Estratto il 18 aprile 2010 . 
  21. ^ ECMA International (giugno 2015). "Standard ECMA-262 6a edizione" . 
  22. ^ campusMVP (19 giugno 2015). "ECMAScript 6 è già uno standard chiuso" . Estratto il 22 luglio 2015 . 
  23. ^ "Tabella di compatibilità del browser ECMAScript 6 (inglese)" . 
  24. ^ ECMA International (giugno 2016). "Standard ECMA-262 7a edizione" . 
  25. ^ ECMA International (giugno 2016). "Specifica del linguaggio ECMAScript 2016" . 
  26. ^ Flanagan, 2006 , p. 16.
  27. ^ Flanagan, 2006 , p. 176–178.
  28. Proprietà dell'oggetto funzione
  29. ^ Flanagan, 2006 , p. 141.
  30. ^ "Eredità e catena di prototipi" . Rete di sviluppatori Mozilla . Mozilla . Estratto il 6 aprile 2013 . 
  31. ^ Herman, David (2013). Javascript efficace . Addison-Wesley. p. 83. ISBN  9780321812186 . 
  32. ^ Haverbeke, Marjin (2011). Javascript eloquente . Non pressa per amido. pp. 95 -97. ISBN  9781593272821 . 
  33. ^ Katz, Yehuda. "Capire i "Prototipi" in JavaScript" . Estratto il 6 aprile 2013 . 
  34. ^ Herman, David (2013). Javascript efficace . Addison-Wesley. pp. 125-127. ISBN  9780321812186 . 
  35. ^ Haverbeke, Marijn (2011). JavaScript eloquente . Non pressa per amido. pp. 139-149 . ISBN  978-1593272821 . 
  36. ^ Robert Nyman, Getters And Setter With JavaScript – Code Samples And Demos , pubblicato il 29 maggio 2009, consultato il 2 gennaio 2010.
  37. ^ John Resig, JavaScript Getters and Setter , 18 luglio 2007, accesso 2 gennaio 2010
  38. http://www.ecma-international.org/publications/standards/Ecma-262.htm
  39. ^ "var - JavaScript - MDN" . La rete di sviluppatori Mozilla . Estratto il 22 dicembre 2012 . 
  40. ^ "Specifica del linguaggio ECMAScript - ECMA-262 Edition 5.1" . Ecma Internazionale . Estratto il 22 dicembre 2012 . 
  41. ^ "console" . Rete di sviluppatori Mozilla . Mozilla . Estratto il 6 aprile 2013 . 
  42. ^ "Tracciamento JavaScript - Piwik" . Piwik . Archiviato dall'originale il 31 ottobre 2013 . Estratto il 31 marzo 2012 . 
  43. ^ Hamilton, Naomi (31 giugno 2008). "La A-Z dei linguaggi di programmazione: JavaScript" . computerworld.com.au. 
  44. ^ Peter-Paul Koch, Rilevamento di oggetti
  45. ^ Peter-Paul Koch, Mission Impossible - posizione del mouse
  46. ^ Peter-Paul Koch, Rilevamento browser
  47. ^ abc Flanagan , 2006 , pp. 262–263.
  48. "Creazione di JavaScript accessibile" . WebAIM . Estratto l'8 giugno 2010 . 
  49. ADsafe - Rendere JavaScript sicuro per la pubblicità
  50. Script ECMA sicuro (SES)
  51. MozillaZine, vulnerabilità di Mozilla Cross-Site Scripting segnalata e corretta
  52. "Debug avanzato con JavaScript" . alistapart.com. 3 febbraio 2009 . Estratto il 28 maggio 2010 . 
  53. ^ "La console di debug JavaScript" . javascript.about.com. 28 maggio 2010 . Estratto il 28 maggio 2010 . 
  54. ^ Sviluppo JScript in Microsoft Office 11 (MS InfoPath 2003)
  55. "Opera libellula" . Software Opera. Archiviato dall'originale il 22 agosto 2011 . Estratto il 19 maggio 2013 . 
  56. ^ "Presentazione di Drosera - Surfin' Safari" . Webkit.org. 28 giugno 2006 . Estratto il 19 maggio 2009 . 

Collegamenti esterni