Modo estricto de JavaScript ("use strict")
El modo estricto es una característica clave de JavaScript, introducida en ECMAScript 5, que convierte errores silenciosos en excepciones explícitas.
Qué es "use strict"
JavaScript fue diseñado en 1995 para nunca fallar ante código incorrecto — los errores se ignoraban en silencio para mantener las páginas web funcionando. Ese comportamiento permisivo oculta errores. El modo estricto es una variante opcional del lenguaje, introducida en ECMAScript 5 (2009), que convierte muchos de esos errores silenciosos en errores explícitos y elimina algunas características heredadas confusas.
Se activa con una directiva de cadena literal:
"use strict";Esta página explica dónde colocar la directiva, exactamente qué cambia y por qué el código moderno (módulos y clases) ya es estricto sin necesidad de hacer nada.
Cómo activar el modo estricto
La directiva debe ser la primera instrucción — una cadena simple, antes de cualquier otro código. Si algo la precede (incluso una expresión perdida), se trata como una cadena ordinaria y se ignora, sin ninguna advertencia.
Script completo o módulo
Coloca "use strict"; al principio del archivo para aplicarlo a todo lo que sigue:
"use strict";
// Every statement in this file now runs in strict mode.
function doStuff() {
// strict here too
}Una sola función
Puedes limitar el modo estricto a una función colocando la directiva al inicio de su cuerpo. El resto del archivo permanece en modo no estricto ("sloppy"). Esto es útil cuando se añade comportamiento estricto a un archivo heredado extenso, función por función.
function strictFn() {
"use strict";
return arguments; // strict behavior, just inside here
}
function sloppyFn() {
return arguments; // legacy behavior
}No hay forma de desactivar el modo estricto una vez que un ámbito es estricto. La directiva es unidireccional.
Qué cambia realmente el modo estricto
Las diferencias son pocas en número, pero detectan errores reales. Estas son las que encontrarás con más frecuencia.
Asignar a una variable no declarada lanza un error
En modo no estricto, x = 10 sin var/let/const crea silenciosamente una variable global — una fuente clásica de fugas de memoria y errores tipográficos. El modo estricto lo rechaza:
"use strict";
undeclaredVariable = 10; // ReferenceError: undeclaredVariable is not definedConsulta el objeto global y el ámbito de variables para entender por qué los globales accidentales son tan perjudiciales.
Las asignaciones incorrectas lanzan errores en lugar de fallar silenciosamente
Escribir en una propiedad de solo lectura, una propiedad de solo getter, o un objeto no extensible falla silenciosamente en modo no estricto. El modo estricto lanza un TypeError, para que lo detectes de inmediato:
"use strict";
const obj = {};
Object.defineProperty(obj, "x", { value: 1, writable: false });
obj.x = 2; // TypeError: Cannot assign to read only property 'x'this es undefined en llamadas a funciones simples
Cuando llamas a una función normal directamente (no como método), el modo no estricto establece this como el objeto global. El modo estricto lo deja como undefined, lo que revela errores donde un método se ha desvinculado de su objeto:
"use strict";
function whoAmI() {
return this;
}
console.log(whoAmI()); // undefined (in sloppy mode this would be the global object)Los nombres de parámetros duplicados están prohibidos
"use strict";
function add(a, a) { // SyntaxError: Duplicate parameter name not allowed in this context
return a + a;
}Otras restricciones
deletesobre una variable, función o argumento de función es unSyntaxError.- Los literales octales como
010no están permitidos (usa0o10). - A
evalyargumentsno se les puede asignar un valor ni usarlos como nombres de variable. - Las palabras reservadas como
implements,interface,private,publicno pueden usarse como identificadores.
Los módulos y las clases son siempre estrictos
A menudo no necesitas escribir "use strict"; en absoluto, porque dos de los contextos modernos más comunes son estrictos de forma automática:
- Módulos ES. Cualquier archivo cargado como módulo (
<script type="module">, un archivo importado conimport, o un archivo.mjs) se ejecuta en modo estricto. La directiva es redundante allí. - Cuerpos de clases. Todo el código dentro de una declaración o expresión
class { ... }es estricto, independientemente del archivo circundante.
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
}
}Debido a esto, la mayor parte del código escrito hoy en día ya está efectivamente en modo estricto. La directiva "use strict"; importa principalmente para archivos <script> clásicos que no son módulos y para bases de código más antiguas.
Cuándo usarlo
- Scripts nuevos que no son módulos: añade
"use strict";al principio. Es un seguro gratuito contra globales accidentales y fallos silenciosos. - Módulos y clases: no hay nada que hacer — ya eres estricto.
- Archivos heredados: adóptalo de forma incremental, función por función, y vuelve a probar. Cambiar todo un archivo no estricto a modo estricto puede exponer código que dependía en secreto de globales accidentales o de un
thisno estricto. Consulta el antiguo "var" para conocer el comportamiento heredado relacionado que vale la pena limpiar al mismo tiempo.
Resumen
El modo estricto es un dialecto más riguroso y seguro de JavaScript que se activa con la directiva "use strict"; al principio de un script o función. Bloquea los globales implícitos, lanza errores en asignaciones incorrectas, establece this como undefined en llamadas simples y prohíbe parámetros duplicados y algunas sintaxis heredadas. Los módulos ES y los cuerpos de clases lo habilitan automáticamente, por lo que la razón principal para escribirlo a mano es para archivos de script clásicos y código más antiguo.