O que é "use strict" em JavaScript e por que discutem sobre ele?
\n\nVocê já escreveu código JavaScript que funcionava "de forma estranha"? Uma variável se declarava sozinha, this apontava para o objeto global em vez do que você esperava, e um erro era simplesmente engolido em silêncio? Bem-vindo ao mundo do JS "sujo".
A diretiva "use strict" não é uma função nem um operador. É literalmente um interruptor de modo para seu script ou função. Quando você escreve "use strict" no início de um arquivo ou função, você diz ao motor JavaScript: "Ei, não me perdoe meus erros. Seja mais rigoroso, mas mais honesto".
Este tópico é uma das perguntas mais populares no Stack Overflow (milhares de visualizações). Vamos entender o que exatamente o modo estrito faz, por que foi criado e como usá-lo sem dar um tiro no pé.
\n\nComo ativar o modo estrito?
\n\nApenas duas maneiras:
\n\n- \n
- Globalmente (para todo o script):
"use strict";na primeira linha do arquivo. \n - Localmente (para uma função):
"use strict";na primeira linha do corpo da função. \n
// Modo estrito global\n"use strict";\nlet x = 10;\n\n// Modo estrito local\nfunction myFunc() {\n "use strict";\n let y = 20;\n}\n\nImportante: Se você misturar código estrito e não estrito no mesmo arquivo (por exemplo, ao concatenar scripts), podem surgir problemas. É melhor usar o modo estrito para funções individuais ou módulos (módulos ES6 são automaticamente estritos).
\n\nTop 5 erros que "use strict" previne
\n\nO principal objetivo do "use strict" é transformar erros "silenciosos" do JavaScript em exceções explícitas (erros que são lançados e podem ser capturados). Aqui estão os 5 casos mais comuns.
1. Proibição da criação implícita de variáveis globais
\n\nIsso é clássico. No modo normal, se você esquecer de escrever var, let ou const, a variável se torna automaticamente global. Isso pode levar a bugs difíceis de encontrar.
// Sem "use strict"\nfunction sum(a, b) {\n total = a + b; // Erro? Não. total se tornou uma variável global!\n}\nsum(2, 3);\nconsole.log(total); // 5 — funciona, mas é terrível.\n\n// Com "use strict"\n"use strict";\nfunction sumStrict(a, b) {\n total = a + b; // ReferenceError: total is not defined\n}\nsumStrict(2, 3); // Erro! O código falha instantaneamente.\n\nComo evitar? Sempre declare variáveis. Use let e const em vez de var para evitar hoisting e variáveis globais acidentais.
2. Atribuição de valor a propriedades não graváveis
\n\nNo modo normal, o JavaScript ignora silenciosamente a tentativa de alterar NaN, undefined ou um objeto congelado. No modo estrito, um erro é lançado.
"use strict";\n\n// Tentativa de sobrescrever NaN\nNaN = 123; // TypeError: Cannot assign to read only property 'NaN'\n\n// Tentativa de alterar um objeto congelado\nconst obj = Object.freeze({name: "Alice"});\nobj.name = "Bob"; // TypeError: Cannot assign to read only property 'name'\n\nComo evitar? Não tente redefinir constantes embutidas. Use Object.freeze() de forma consciente.
3. Exclusão de variáveis, funções e argumentos
\n\nVocê não pode excluir uma variável declarada com var ou let, nem excluir uma função. No modo normal, isso é simplesmente ignorado.
"use strict";\n\nvar x = 10;\ndelete x; // SyntaxError: Delete of an unqualified identifier in strict mode.\n\nfunction foo() {}\ndelete foo; // SyntaxError\n\nComo evitar? Não use delete para variáveis. Ele é necessário apenas para excluir propriedades de objetos: delete obj.prop.