Strict mode in JavaScript: come attivare use strict e cosa vieta

Che cos'è lo strict mode? È arrivato con ECMAScript 5 (ES5) ed è una variante più severa di JavaScript, che segnala come errori gli sbagli normalmente gestiti in silenzio. In modalità non strict, se assegni un valore a una variabile senza dichiararla, l'interprete te ne crea una globale.

Strict mode in JavaScript: come attivare use strict e cosa vieta

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:

javascript
"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ì:

javascript
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.

javascript
"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.

javascript
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxError

Allo stesso modo, se provi a cancellare una funzione in strict mode ottieni un errore di sintassi:

javascript
"use strict";
function sum(a, b) {
    return a + b;
}
delete sum; // SyntaxError

I 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.

javascript
"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.

javascript
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined

eval 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.

javascript
"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.

javascript
"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.

javascript
"use strict";

var personne = {name: "Damien", age: 25};

Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeError

Aggiungere 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.

javascript
"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"; // TypeError

I 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.

javascript
"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, function e così via.

···

JavaScript

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.