Modo estrito do JavaScript: o que muda e como o ativar

O que é o modo estrito? Introduzido no ECMAScript 5, é uma variante mais restrita do JavaScript que levanta erros para enganos que normalmente passam em silêncio. Em modo não estrito, uma variável usada sem declaração torna-se uma variável global criada às escondidas.

Modo estrito do JavaScript: o que muda e como o ativar

O que é o modo estrito?

O modo estrito foi introduzido no ECMAScript 5 (ES5). É uma variante mais restrita da linguagem JavaScript, que levanta erros para enganos que normalmente passam em silêncio. Por exemplo, em modo não estrito, se inicializares uma variável sem a declarar com a palavra-chave var (x = 5, por exemplo), o interpretador JavaScript assume que te referias a uma variável global e, se essa variável não existir, cria-a por ti.

Além disso, as funções obsoletas também podem gerar erros em modo estrito. O modo estrito reduz assim os bugs e melhora a segurança e o desempenho geral da tua aplicação.

Ativar o modo estrito

Para ativar o modo estrito, basta acrescentar a string «use strict» no início do teu script, como no exemplo seguinte:

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

Se puseres a diretiva «use strict» como primeira linha do teu programa JavaScript, o modo estrito aplica-se a todo o script. Mas também podes ativá-lo apenas dentro de uma função, assim:

javascript
x = 5;
console.log(x); // 5
function sayHello() {
    "use strict";
    str = "Hello World!"; // ReferenceError: str is not defined
    console.log(str);
}
sayHello();

A saber: a diretiva «use strict» só é reconhecida no início de um script ou de uma função. Todos os browsers modernos suportam a diretiva «use strict» exceto o Internet Explorer 9 e versões anteriores. Além disso, os browsers que não a suportam ignoram-na em silêncio e analisam o JavaScript em modo não estrito.

As restrições gerais do modo estrito

O modo estrito altera ao mesmo tempo a sintaxe e o comportamento em execução. Nas secções seguintes, vemos as restrições gerais que ele aplica:

As variáveis não declaradas não são permitidas

Como já sabes, em modo estrito todas as variáveis têm de ser declaradas. Se atribuíres um valor a um identificador que não é uma variável declarada, é lançado um ReferenceError.

javascript
"use strict";

function doSomething() {
    msg = "Hello world!"; // ReferenceError: msg is not defined
    return msg;
}
console.log(doSomething());

Apagar uma variável ou uma função não é permitido

Em modo estrito, tentar apagar uma variável ou uma função gera um erro de sintaxe. Em modo não estrito, essa tentativa falha em silêncio e a expressão delete é avaliada como false.

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

Da mesma forma, ao tentares apagar uma função em modo estrito, obténs um erro de sintaxe:

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

Repetir o nome de um parâmetro não é permitido

Em modo estrito, é gerado um erro de sintaxe se uma declaração de função tiver dois ou mais parâmetros com o mesmo nome. Em modo não estrito, não acontece erro nenhum.

javascript
"use strict";

function test(a, a) { // SyntaxError
    return a * a;
}
console.log(square(2, 2));

O eval() não pode alterar o âmbito

Em modo estrito, por razões de segurança, o código passado a eval() não pode declarar nem alterar variáveis, nem definir funções no ambiente envolvente, como faz em modo não estrito.

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

eval e arguments não podem servir de identificadores

Em modo estrito, os nomes eval e arguments são tratados como palavras-chave, pelo que não podem ser usados como nomes de variáveis, nomes de funções, nomes de parâmetros de função, e assim por diante.

javascript
"use strict";
var eval = 10; // SyntaxError
console.log(eval);

A instrução with não é permitida

Em modo estrito, a instrução with não é permitida. A instrução with acrescenta as propriedades e os métodos do objeto ao âmbito atual. As instruções aninhadas dentro de um with podem então chamar essas propriedades e métodos diretamente, sem se referirem ao objeto.

javascript
"use strict";

// Sem with
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;

// Com with
var radius2 = 5;
with(Math) { // SyntaxError
    var area2 = PI * radius2 * radius2;
} 

Escrever numa propriedade só de leitura não é permitido

Em modo estrito, atribuir um valor a uma propriedade não gravável, a uma propriedade só com getter ou a uma propriedade inexistente lança um erro. Em modo não estrito, essas tentativas falham em silêncio.

javascript
"use strict";

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

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

Acrescentar uma propriedade a um objeto não extensível não é permitido

Em modo estrito, as tentativas de criar propriedades novas em objetos não extensíveis ou inexistentes lançam igualmente um erro. Já em modo não estrito, essas tentativas falham em silêncio.

javascript
"use strict";

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

console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); //  bloquear o objeto personne
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeError

Os números octais não são permitidos

Em modo estrito, os números octais (algarismos precedidos de um zero, por exemplo 010, 0377) não são permitidos. Em modo não estrito, no entanto, são suportados por todos os browsers. No ES6, os números octais passam a ser suportados com o prefixo 0o, ou seja 0o10, 0o377, etc.

javascript
"use strict";

var x = 010; // SyntaxError
console.log(parseInt(x));

Vê-se com clareza nos exemplos acima como o modo estrito te ajuda a evitar os erros comuns que tantas vezes passam despercebidos enquanto escreves um programa JavaScript.

As palavras-chave reservadas para o futuro não são permitidas

O modo estrito impõe restrições ao uso das palavras-chave que estão reservadas para versões futuras da linguagem.

Segundo a norma ECMAScript 6 (ou ES6) mais recente, estas são palavras-chave reservadas em modo estrito: await, implements, interface, package, private, protected, public e static. Ainda assim, para uma compatibilidade ótima, deves evitar usar palavras-chave reservadas como nomes de variáveis ou de funções no teu programa.

Dica: as palavras reservadas, também chamadas palavras-chave, são palavras especiais que fazem parte da sintaxe da linguagem JavaScript, por exemplo var, if, for, function, etc.

···

JavaScript

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.