Modo Estrito do JavaScript ("use strict")
JavaScript é uma linguagem de programação versátil e amplamente utilizada. O modo estrito é um recurso fundamental do JavaScript, introduzido para tornar o código mais seguro e livre de erros silenciosos.
O que é "use strict"
O JavaScript foi criado em 1995 para nunca travar com código inválido — erros eram silenciosamente ignorados para manter as páginas web funcionando. Esse comportamento tolerante esconde bugs. O modo estrito é uma variante opcional da linguagem, introduzida no ECMAScript 5 (2009), que transforma muitos desses erros silenciosos em erros explícitos e remove algumas funcionalidades legadas confusas.
Você o ativa com uma diretiva de string literal:
"use strict";Esta página cobre onde colocar a diretiva, o que exatamente ela muda e por que o código moderno (módulos e classes) já é estrito sem que você precise fazer nada.
Como Ativar o Modo Estrito
A diretiva deve ser a primeira instrução — uma string simples, antes de qualquer outro código. Se algo vier antes dela (mesmo uma expressão perdida), ela será tratada como uma string comum e ignorada, sem nenhum aviso.
Script ou módulo inteiro
Coloque "use strict"; no topo do arquivo para aplicá-lo a tudo abaixo:
"use strict";
// Every statement in this file now runs in strict mode.
function doStuff() {
// strict here too
}Uma única função
Você pode restringir o modo estrito a uma única função colocando a diretiva no topo do seu corpo. O restante do arquivo permanece no modo permissivo ("não estrito"). Isso é útil ao adicionar comportamento estrito a um arquivo legado grande, uma função por vez.
function strictFn() {
"use strict";
return arguments; // strict behavior, just inside here
}
function sloppyFn() {
return arguments; // legacy behavior
}Não há como desativar o modo estrito uma vez que um escopo é estrito. A diretiva é unidirecional.
O que o Modo Estrito Realmente Muda
As diferenças são poucas em número, mas pegam bugs reais. Aqui estão as que você encontrará com mais frequência.
Atribuir a uma variável não declarada lança um erro
No modo permissivo, x = 10 sem var/let/const cria silenciosamente uma variável global — uma fonte clássica de vazamentos e erros de digitação. O modo estrito rejeita isso:
"use strict";
undeclaredVariable = 10; // ReferenceError: undeclaredVariable is not definedVeja o objeto global e escopo de variável para entender por que globais acidentais são tão prejudiciais.
Atribuições inválidas lançam erros em vez de falhar silenciosamente
Escrever em uma propriedade somente leitura, uma propriedade apenas com getter ou um object não extensível falha silenciosamente no modo permissivo. O modo estrito lança um TypeError, para que você descubra imediatamente:
"use strict";
const obj = {};
Object.defineProperty(obj, "x", { value: 1, writable: false });
obj.x = 2; // TypeError: Cannot assign to read only property 'x'this é undefined em chamadas de função simples
Quando você chama uma função normal diretamente (não como método), o modo permissivo define this como o objeto global. O modo estrito o deixa undefined, o que expõe erros onde um método é desvinculado de seu object:
"use strict";
function whoAmI() {
return this;
}
console.log(whoAmI()); // undefined (in sloppy mode this would be the global object)Nomes de parâmetros duplicados são proibidos
"use strict";
function add(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context
return a + a;
}Outras restrições
deleteem uma variável, função ou argumento de função é umSyntaxError.- Literais octais como
010são proibidos (use0o10). evaleargumentsnão podem receber atribuições nem ser usados como nomes de variáveis.- Palavras reservadas como
implements,interface,private,publicnão podem ser usadas como identificadores.
Módulos e Classes São Sempre Estritos
Muitas vezes você não precisa escrever "use strict"; de forma alguma, porque dois dos contextos modernos mais comuns são estritos automaticamente:
- Módulos ES. Qualquer arquivo carregado como módulo (
<script type="module">, um arquivo importado comimportou um arquivo.mjs) é executado em modo estrito. A diretiva é redundante lá. - Corpos de classe. Todo o código dentro de uma declaração ou expressão
class { ... }é estrito, independentemente do arquivo ao redor.
class Counter {
// This method is strict even with no directive anywhere in the file.
bump() {
return this; // undefined if called detached, like any strict function
}
}Por causa disso, a maior parte do código escrito hoje já está efetivamente em modo estrito. A diretiva "use strict"; importa principalmente para arquivos <script> clássicos sem módulo e bases de código mais antigas.
Quando Usá-lo
- Novos scripts sem módulo: adicione
"use strict";no topo. É uma proteção gratuita contra globais acidentais e falhas silenciosas. - Módulos e classes: nada a fazer — você já está no modo estrito.
- Arquivos legados: adote incrementalmente, função por função, e re-teste. Mudar um arquivo permissivo inteiro para o modo estrito pode expor código que dependia secretamente de globais acidentais ou de
thispermissivo. Veja o antigo "var" para comportamentos legados relacionados que vale a pena limpar ao mesmo tempo.
Resumo
O modo estrito é um dialeto mais rigoroso e seguro do JavaScript, ativado com a diretiva "use strict"; no topo de um script ou função. Ele bloqueia globais implícitas, lança erros em atribuições inválidas, define this como undefined em chamadas simples e proíbe parâmetros duplicados e algumas sintaxes legadas. Módulos ES e corpos de classe o ativam automaticamente, então o principal motivo para escrevê-lo manualmente é para arquivos de script clássicos e código mais antigo.