W3docs

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 defined

Veja 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

  • delete em uma variável, função ou argumento de função é um SyntaxError.
  • Literais octais como 010 são proibidos (use 0o10).
  • eval e arguments não podem receber atribuições nem ser usados como nomes de variáveis.
  • Palavras reservadas como implements, interface, private, public nã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 com import ou 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 this permissivo. 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.

Prática

Prática
O que a diretiva 'use strict' faz no JavaScript?
O que a diretiva 'use strict' faz no JavaScript?
Was this page helpful?