
Che cos’è lo strict mode?
Lo strict mode è arrivato con ECMAScript 5 (ES5). È una variante più severa e più limitata di JavaScript, che segnala come errori gli sbagli normalmente gestiti in silenzio. Per esempio, in modalità non strict, se inizializzi una variabile senza dichiararla con la parola chiave var (x = 5, per dire), l’interprete JavaScript dà per scontato che tu intendessi una variabile globale e, se quella variabile non esisteva, ne crea una al volo.
Anche le funzioni deprecate possono generare errori in strict mode. Di conseguenza lo strict mode riduce i bug e migliora la sicurezza e le prestazioni complessive della tua applicazione.
Attivare lo strict mode
Per attivare lo strict mode ti basta aggiungere la stringa « use strict » all’inizio dello script, come nell’esempio che segue:
"use strict";
x = 5; // ReferenceError: x is not defined
console.log(x);Se metti la direttiva « use strict » come prima riga del tuo programma JavaScript, lo strict mode vale per tutto lo script. Puoi però attivarlo anche solo dentro una funzione, così:
x = 5;
console.log(x); // 5
function sayHello() {
"use strict";
str = "Hello World!"; // ReferenceError: str is not defined
console.log(str);
}
sayHello();Da sapere: la direttiva « use strict » viene riconosciuta solo all’inizio di uno script o di una funzione. Tutti i browser moderni la supportano, tranne Internet Explorer 9 e le versioni precedenti. I browser che non la supportano la ignorano in silenzio e analizzano il JavaScript in modalità non strict.
Le restrizioni generali dello strict mode
Lo strict mode cambia sia la sintassi sia il comportamento a runtime. Nelle sezioni che seguono vediamo le restrizioni generali che vengono applicate:
Le variabili non dichiarate non sono ammesse
Come già sai, in strict mode tutte le variabili vanno dichiarate. Se assegni un valore a un identificatore che non è una variabile dichiarata, viene lanciato un ReferenceError.
"use strict";
function doSomething() {
msg = "Hello world!"; // ReferenceError: msg is not defined
return msg;
}
console.log(doSomething());Non si può cancellare una variabile o una funzione
In strict mode, provare a cancellare una variabile o una funzione genera un errore di sintassi. In modalità non strict lo stesso tentativo fallisce in silenzio e l’espressione delete restituisce false.
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxErrorAllo stesso modo, se provi a cancellare una funzione in strict mode ottieni un errore di sintassi:
"use strict";
function sum(a, b) {
return a + b;
}
delete sum; // SyntaxErrorI nomi di parametro duplicati non sono ammessi
In strict mode viene generato un errore di sintassi se la dichiarazione di una funzione ha due o più parametri con lo stesso nome. In modalità non strict non succede niente.
"use strict";
function test(a, a) { // SyntaxError
return a * a;
}
console.log(square(2, 2));eval() non può modificare lo scope
In strict mode, per ragioni di sicurezza, il codice passato a eval() non può dichiarare o modificare variabili né definire funzioni nell’ambiente circostante, come invece può fare in modalità non strict.
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not definedeval e arguments non si possono usare come identificatori
In strict mode i nomi eval e arguments sono trattati come parole chiave, quindi non si possono usare come nomi di variabili, nomi di funzioni, nomi di parametri e così via.
"use strict";
var eval = 10; // SyntaxError
console.log(eval);L’istruzione with non è ammessa
In strict mode l’istruzione with non è ammessa. L’istruzione with aggiunge le proprietà e i metodi di un oggetto allo scope corrente. Le istruzioni annidate dentro un blocco with possono così richiamare quelle proprietà e quei metodi direttamente, senza citare l’oggetto.
"use strict";
// Senza with
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;
// Con with
var radius2 = 5;
with(Math) { // SyntaxError
var area2 = PI * radius2 * radius2;
} Scrivere su una proprietà in sola lettura non è ammesso
In strict mode, assegnare un valore a una proprietà non scrivibile, a una proprietà con il solo getter o a una proprietà inesistente lancia un errore. In modalità non strict questi tentativi falliscono in silenzio.
"use strict";
var personne = {name: "Damien", age: 25};
Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeErrorAggiungere una proprietà a un oggetto non estensibile non è ammesso
In strict mode anche i tentativi di creare nuove proprietà su oggetti non estensibili o inesistenti lanciano un errore. In modalità non strict, invece, falliscono in silenzio.
"use strict";
var person = {name: "Damien", age: 25};
console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); // blocca l'oggetto personne
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeErrorI numeri ottali non sono ammessi
In strict mode i numeri ottali (le cifre precedute da uno zero, per esempio 010, 0377) non sono ammessi. In modalità non strict, invece, sono supportati da tutti i browser. In ES6 i numeri ottali si scrivono premettendo 0o al numero, cioè 0o10, 0o377 e così via.
"use strict";
var x = 010; // SyntaxError
console.log(parseInt(x));Negli esempi qui sopra si vede bene come lo strict mode aiuti a evitare gli errori comuni che spesso passano inosservati mentre scrivi un programma JavaScript.
Le parole chiave riservate per il futuro non sono ammesse
Lo strict mode limita l’uso delle parole chiave riservate alle versioni future del linguaggio.
Secondo lo standard ECMAScript 6 (o ES6), queste sono parole chiave riservate in strict mode: await, implements, interface, package, private, protected, public, e static. Per la massima compatibilità, comunque, è meglio evitare del tutto le parole riservate come nomi di variabili o di funzioni nel tuo programma.
Suggerimento: le parole riservate, dette anche parole chiave, sono parole speciali che fanno parte della sintassi di JavaScript, per esempio
var,if,for,functione così via.
···


