Nella loro ossessione di allineare i letterali numerici, lo sviluppatore ha inavvertitamente inizializzato la variabile b
con un letterale ottale. La modalità non rigorosa interpreterà questo come un valore letterale numerico con valore 24
(in base 10). Tuttavia, la modalità rigorosa genererà un errore.
Scopo
Storicamente, JavaScript è stato confuso su come le funzioni sono nell'ambito. A volte sembrano avere un ambito statico, ma alcune funzionalità li fanno comportare come se fossero con ambito dinamico. Questo è confuso, rendendo i programmi difficili da leggere e comprendere. L'incomprensione provoca bug. È anche un problema per le prestazioni. L'ambito statico consentirebbe che l'associazione variabile si verifichi in fase di compilazione, ma il requisito per l'ambito dinamico implica che l'associazione deve essere rinviata al tempo di esecuzione, che comporta una significativa penalizzazione delle prestazioni.
La modalità rigorosa richiede che tutta l'associazione delle variabili sia eseguita staticamente. Ciò significa che le funzioni che in precedenza richiedevano l'associazione dinamica devono essere eliminate o modificate. In particolare, l'istruzione with viene eliminata e la capacità della funzione eval di manomettere l'ambiente del suo chiamante è fortemente limitata.
Uno dei vantaggi del codice rigoroso è che strumenti come YUI Compressor
possono fare un lavoro migliore durante l'elaborazione.
Variabili globali implicite
JavaScript ha implicato variabili globali. Se non dichiari esplicitamente una variabile, una variabile globale viene dichiarata implicitamente per te. Questo rende la programmazione più semplice per i principianti perché possono trascurare alcune delle loro faccende domestiche di base. Ma rende la gestione di programmi più grandi molto più difficile e degrada in modo significativo l'affidabilità. Pertanto, in modalità rigorosa, le variabili globali implicite non vengono più create. Dovresti dichiarare esplicitamente tutte le tue variabili.
Perdita globale
Esistono diverse situazioni che potrebbero causare this
l'associazione all'oggetto globale. Ad esempio, se si dimentica di fornire il new
prefisso quando si chiama una funzione di costruzione, quella di costruzione this
verrà associata inaspettatamente all'oggetto globale, quindi invece di inizializzare un nuovo oggetto, manometterà invece silenziosamente le variabili globali. In queste situazioni, la modalità rigorosa sarà invece legarsi this
a undefined
, che causerà il costruttore un'eccezione invece, permettendo l'errore da rilevare molto prima.
Guasto rumoroso
JavaScript ha sempre avuto proprietà di sola lettura, ma non è stato possibile crearle da soli fino a quando la Object.createProperty
funzione di ES5 non ha rivelato tale funzionalità. Se si tentasse di assegnare un valore a una proprietà di sola lettura, fallirebbe silenziosamente. L'assegnazione non cambierebbe il valore della proprietà, ma il programma procederà come se fosse. Questo è un rischio di integrità che può far sì che i programmi vadano in uno stato incoerente. In modalità rigorosa, il tentativo di modificare una proprietà di sola lettura genererà un'eccezione.
Octal
La rappresentazione dei numeri ottale (o base 8) era estremamente utile quando si eseguiva la programmazione a livello di macchina su macchine le cui dimensioni delle parole erano un multiplo di 3. Per lavorare con il mainframe CDC 6600, che aveva una dimensione delle parole di 60 bit, era necessario ottale. Se potessi leggere ottale, potresti guardare una parola di 20 cifre. Due cifre rappresentavano il codice operativo e una cifra identificava uno degli 8 registri. Durante la lenta transizione da codici macchina a linguaggi di alto livello, si riteneva utile fornire moduli ottali nei linguaggi di programmazione.
In C, è stata selezionata una rappresentazione estremamente sfortunata dell'ottalità: zero iniziale. Quindi in C, 0100
significa 64, non 100, ed 08
è un errore, non 8. Ancora più sfortunatamente, questo anacronismo è stato copiato in quasi tutti i linguaggi moderni, incluso JavaScript, dove viene utilizzato solo per creare errori. Non ha altro scopo. Quindi, in modalità rigorosa, le forme ottali non sono più consentite.
Eccetera
Gli argomenti pseudo array diventano un po 'più simili a array in ES5. In modalità rigorosa, perde le sue callee
e caller
proprietà. Questo rende possibile passare il tuo arguments
codice non attendibile senza rinunciare a molti contesti confidenziali. Inoltre, la
arguments
proprietà delle funzioni viene eliminata.
In modalità rigorosa, i tasti duplicati in una funzione letterale produrranno un errore di sintassi. Una funzione non può avere due parametri con lo stesso nome. Una funzione non può avere una variabile con lo stesso nome di uno dei suoi parametri. Una funzione non può avere le delete
sue variabili. Un tentativo su
delete
una proprietà non configurabile ora genera un'eccezione. I valori primitivi non sono implicitamente racchiusi.
ECMAScript 5 aggiunge un elenco di parole riservate. Se li usi come variabili o argomenti, la modalità rigorosa genererà un errore. Le parole riservate sono: