Menu

Strict Mode no JavaScript: o que o 'use strict' faz

Entenda o que o strict mode do JavaScript muda no seu código, como ativá-lo e por que módulos ES e classes já vêm com ele ligado por padrão.

Strict mode: uma versão mais rigorosa do JavaScript

O JavaScript tem uma história longa e carrega muitas decisões questionáveis — atribuições que silenciosamente criam variáveis globais, um this que muda de significado dependendo de como você chama a função, parâmetros duplicados que simplesmente... funcionavam. Como quebrar qualquer uma dessas coisas quebraria a web inteira, o TC39 (o comitê que mantém a linguagem) escolheu outro caminho: um modo opcional que apara essas arestas.

Esse modo opcional é o strict mode. Você ativa com uma única linha no topo do arquivo ou da função:

index.js
Output
Click Run to see the output here.

Rode isso e você vai receber um ReferenceError: x is not defined. Sem a diretiva, o mesmo código cria tranquilamente uma variável global chamada x e imprime 10. Mesma linguagem, dois conjuntos de regras bem diferentes.

A diretiva 'use strict'

A diretiva nada mais é do que uma string literal — 'use strict'; ou "use strict";. Ela precisa ser a primeira instrução do script ou da função. Se houver qualquer coisa antes dela, mesmo que seja uma expressão solta, o engine trata aquilo como uma string comum e simplesmente ignora a diretiva.

index.js
Output
Click Run to see the output here.

Dá pra limitar o strict mode a uma única função colocando a diretiva dentro dela. Na prática, ninguém mais faz isso — ou você escreve módulos (que já são strict por padrão) ou ativa o arquivo inteiro.

O que o strict mode realmente muda

O strict mode não é uma regra só; é um pacote delas. Os destaques:

  • Atribuir valor a uma variável não declarada lança erro em vez de criar uma global.
  • Dentro de uma chamada de função normal, this é undefined, e não o objeto global.
  • Parâmetros com nomes duplicados (function f(a, a) {}) viram erro de sintaxe.
  • Atribuir a propriedades somente-leitura lança erro em vez de falhar silenciosamente.
  • Tentar deletar uma variável ou função simples lança erro.
  • Algumas palavras reservadas para o futuro (implements, interface, package, private, protected, public, static, yield) não podem ser usadas como nome de variável.

Um tour rápido:

index.js
Output
Click Run to see the output here.

Em todos esses casos, a ideia é a mesma: o motor do JavaScript detectou um possível erro mais cedo. É basicamente isso que o strict mode entrega de valor.

O bug silencioso da variável global

Esse é, de longe, o maior motivo do strict mode existir. Sem ele, um simples erro de digitação vira uma variável global:

// Modo não estrito (não faça isso)
function setup() {
    usernmae = 'Ada';   // erro de digitação — cria window.usernmae
}

setup();
console.log(username);  // undefined — a variável real nunca foi definida

O programa roda. Nenhum erro. O bug só aparece mais tarde, quando alguma coisa que deveria ler username encontra undefined. No strict mode, esse mesmo typo dispara um erro na hora em que executa, e você resolve em segundos em vez de horas.

O JavaScript moderno já vem em strict mode por padrão

Aqui vai o detalhe que costuma confundir muita gente: a maior parte do JavaScript que você escreve hoje roda em strict mode, mesmo sem você ter digitado 'use strict' em lugar nenhum.

Existem duas fontes principais dessa strictness automática:

  • Módulos ES. Qualquer arquivo .mjs, qualquer <script type="module"> e tudo que é carregado via import/export roda em strict mode. Não precisa de diretiva.
  • Corpos de classe. Todo código dentro de um class { ... } é strict, mesmo que o arquivo ao redor não seja.
index.js
Output
Click Run to see the output here.

Então, quando é que você realmente precisa escrever 'use strict'; na mão? Só em scripts clássicos — aquele JS antigão carregado com uma tag <script> simples, ou arquivos mais velhos de Node.js que usam require sem bundler de módulos. Em projetos novos, os módulos já cuidam disso pra você.

Strict mode muda o this em funções comuns

Tem um comportamento que vale destacar porque sempre pega os iniciantes desprevenidos. Fora do strict mode, quando você chama uma função comum sem nenhum objeto antes dela, o this aponta pro objeto global (window no navegador, global no Node). Já no strict mode, ele vira undefined:

index.js
Output
Click Run to see the output here.

Normalmente é isso mesmo que você quer. Se this for undefined, um bug causado por ter esquecido de fazer o bind de um método aparece na hora. Já se ele apontar silenciosamente para o objeto global, o bug fica escondido até alguma coisa quebrar lá na frente.

O que o strict mode não faz

O strict mode é um aperto tanto em tempo de compilação quanto em tempo de execução — ele não te dá tipagem, não pega acessos a null, nem avisa sobre variáveis não usadas. Essas tarefas são do TypeScript, do ESLint e do seu editor. Encare o strict mode como uma correção para um conjunto específico de armadilhas da linguagem, não como uma rede de proteção completa.

E não confunda com "JavaScript moderno". Dá pra escrever código horrível com strict mode ativado e código excelente sem a diretiva. Ele só dificulta alguns erros bem específicos.

O que fica de lição

  • 'use strict'; no topo de um arquivo ou função ativa uma variante mais rígida do JavaScript.
  • Erros de digitação deixam de criar variáveis globais, this para de virar silenciosamente o objeto global, e várias outras armadilhas viram erros de verdade.
  • Módulos ES e corpos de class já rodam em strict mode automaticamente — raramente você precisa escrever a diretiva na mão.
  • O objetivo é pegar bugs mais cedo, não liberar recursos novos.

A seguir: comentários

Você já viu diretivas, ponto e vírgula e as regras que o motor leva a sério. Agora vamos para as anotações que você deixa para quem vai ler o código depois — como funcionam os comentários em JavaScript e quando vale a pena escrevê-los.

Perguntas frequentes

O que é o strict mode no JavaScript?

O strict mode é uma variante opcional do JavaScript que transforma uma série de erros silenciosos em exceções de verdade. Para ativar, basta colocar a string 'use strict'; no topo do arquivo ou de uma função. Ele deixa a linguagem mais rígida: atribuir valor a uma variável não declarada dispara erro, nomes de parâmetros duplicados são proibidos, e o this dentro de uma chamada de função comum passa a ser undefined em vez do objeto global.

Como ativar o strict mode no JavaScript?

Coloque 'use strict'; como a primeiríssima instrução do script ou da função. Nada pode vir antes — nem mesmo uma linha em branco sem comentário — senão a engine trata aquilo como uma string comum e ignora. Na prática, você raramente precisa escrever isso hoje em dia: módulos ES (arquivos .mjs ou <script type="module">) e o corpo de qualquer class já rodam em strict mode automaticamente.

Por que usar o strict mode no JavaScript?

Porque ele pega bugs mais cedo. Um erro de digitação como usernmae = 'Ada' cria uma variável global silenciosamente no modo padrão; no strict mode, o código lança um ReferenceError na hora. Ele também reserva palavras-chave futuras, barra nomes de propriedades duplicados em engines mais antigas e deixa o comportamento do this previsível — tudo isso torna o código bem mais fácil de entender.

Ainda preciso escrever 'use strict' no JavaScript moderno?

Normalmente não. Módulos ES e corpos de class já são strict por padrão, e a maioria dos projetos atuais cai em uma dessas categorias. Você só precisa declarar 'use strict'; explicitamente em scripts clássicos no estilo antigo — aqueles carregados com uma tag <script> simples, sem type="module".

Aprenda a programar com o Coddy

COMEÇAR