W3docs

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 defined

Consulta 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

  • delete sobre una variable, función o argumento de función es un SyntaxError.
  • Los literales octales como 010 no están permitidos (usa 0o10).
  • A eval y arguments no se les puede asignar un valor ni usarlos como nombres de variable.
  • Las palabras reservadas como implements, interface, private, public no 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 con import, 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 this no 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.

Práctica

Práctica
¿Qué hace la directiva 'use strict' en JavaScript?
¿Qué hace la directiva 'use strict' en JavaScript?
Was this page helpful?