Menu

Modo estricto en JavaScript: qué hace 'use strict'

Qué cambia realmente el modo estricto de JavaScript, cómo se activa y por qué los módulos y las clases ya lo traen puesto de serie.

El modo estricto es una variante más rigurosa de JavaScript

JavaScript tiene una historia larga, y arrastra consigo muchas decisiones discutibles: asignaciones que crean variables globales sin avisar, un this que cambia de significado según cómo llames a la función, nombres de parámetros duplicados que simplemente... funcionaban. Romper cualquiera de esas cosas rompería media web, así que TC39 (el comité que mantiene el lenguaje) optó por otra vía: un modo opcional en el que se liman esas asperezas.

Ese modo opcional se llama modo estricto ('use strict'). Se activa con una sola línea al principio de un archivo o de una función:

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

Al ejecutar ese código, vas a obtener un ReferenceError: x is not defined. Sin la directiva, ese mismo código crea tranquilamente una variable global llamada x e imprime 10. Mismo lenguaje, dos reglas distintas.

La directiva 'use strict'

La directiva no es más que una cadena literal: 'use strict'; o "use strict";. Debe ir como primera instrucción del script o de la función. Si pones cualquier cosa antes (incluso una expresión suelta), el motor la interpreta como una cadena cualquiera y la ignora.

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

Puedes limitar el modo estricto a una sola función metiendo la directiva dentro de ella. En la práctica, ya nadie hace esto: o escribes módulos (que son estrictos por defecto) o activas el modo estricto en todo el archivo.

Qué cambia realmente con el modo estricto

El modo estricto no es una sola regla, sino un paquete completo. Lo más destacado:

  • Asignar un valor a una variable no declarada lanza un error en vez de crear una variable global.
  • this dentro de una llamada a función normal vale undefined, no el objeto global.
  • Repetir nombres de parámetros (function f(a, a) {}) es un error de sintaxis.
  • Asignar a propiedades de solo lectura lanza un error en lugar de fallar en silencio.
  • Borrar una variable o función sin más lanza un error.
  • Ciertas palabras reservadas a futuro (implements, interface, package, private, protected, public, static, yield) no se pueden usar como nombres de variable.

Un pequeño recorrido:

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

Cada uno de esos casos es "el motor detectó un posible error antes de que explotara". Ese es todo el argumento de venta.

El bug silencioso de las variables globales

Esta es, con diferencia, la razón principal por la que existe el modo estricto. Sin él, una simple errata se convierte en una variable global:

// Non-strict mode (don't do this)
function setup() {
    usernmae = 'Ada';   // typo — creates window.usernmae
}

setup();
console.log(username);  // undefined — the real variable was never set

El programa arranca. No da error. El bug aparece más tarde, cuando algo que debería haber leído username se encuentra con undefined. En modo estricto, ese mismo typo revienta al instante, y lo arreglas en segundos en vez de horas.

El JavaScript moderno ya viene en modo estricto

Aquí está el detalle que despista a mucha gente: la mayor parte del JavaScript que escribes hoy ya se ejecuta en modo estricto, sin que hayas puesto 'use strict' por ningún lado.

Hay dos grandes fuentes de modo estricto automático:

  • Módulos ES. Cualquier archivo .mjs, cualquier <script type="module"> y todo lo que importes con import/export corre en modo estricto. No hace falta la directiva.
  • Cuerpos de clase. Cada sentencia dentro de un class { ... } es estricta, aunque el archivo que la rodea no lo sea.
index.js
Output
Click Run to see the output here.

Entonces, ¿cuándo te toca a ti escribir 'use strict'; a mano? Solo en los scripts clásicos: JS a la vieja usanza cargado con una etiqueta <script> pelada, o archivos de Node.js antiguos que usan require sin empaquetado de módulos. Para cualquier cosa nueva, los módulos ya se encargan por ti.

El modo estricto cambia this en funciones normales

Hay un comportamiento que merece la pena destacar porque suele pillar por sorpresa a quienes están empezando. En modo no estricto, si llamas a una función normal sin un objeto delante, this queda ligado al objeto global (window en el navegador, global en Node). En cambio, con this en modo estricto, queda ligado a undefined:

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

Eso suele ser justo lo que buscas. Si this vale undefined, el bug por haberte olvidado de hacer el bind de un método salta al instante. Si en cambio apunta silenciosamente al objeto global, el error queda escondido hasta que algo más adelante revienta.

Lo que el modo estricto no hace

La directiva 'use strict' aprieta las tuercas en tiempo de compilación y ejecución, pero no te da tipos, no detecta accesos a null y tampoco avisa de variables sin usar. Esas tareas son para TypeScript, ESLint y tu editor. Piensa en el modo estricto como un parche para un conjunto concreto de trampas del lenguaje, no como una red de seguridad completa.

Tampoco es sinónimo de "JavaScript moderno". Puedes escribir código horrible en modo estricto y código excelente sin la directiva. Lo único que hace es dificultar ciertos errores puntuales.

Lo que te llevas

  • 'use strict'; al principio de un archivo o una función activa una variante más estricta de JavaScript.
  • Los typos dejan de crear variables globales, this deja de convertirse silenciosamente en el objeto global y algunas otras trampas clásicas pasan a ser errores.
  • Los módulos ES y los cuerpos de class ya están en modo estricto automáticamente, así que casi nunca necesitas escribir la directiva a mano.
  • Va de cazar bugs antes, no de desbloquear funcionalidades nuevas.

Siguiente parada: los comentarios

Ya has visto directivas, puntos y coma y las reglas que al motor le importan. Ahora toca las notas que dejas para quien venga después: cómo funcionan los comentarios en JavaScript y cuándo merece la pena escribirlos.

Preguntas frecuentes

¿Qué es el modo estricto en JavaScript?

El modo estricto es una variante opcional de JavaScript que convierte en errores reales una serie de fallos que, de otra forma, pasarían en silencio. Se activa colocando la cadena 'use strict'; al principio de un archivo o de una función. Básicamente, aprieta las tuercas del lenguaje: asignar a una variable no declarada lanza un error, los nombres de parámetros duplicados están prohibidos y this, dentro de una llamada a una función normal, vale undefined en lugar de apuntar al objeto global.

¿Cómo se activa el modo estricto en JavaScript?

Pon 'use strict'; como primerísima instrucción del script o de la función. No puede haber nada antes, ni siquiera una línea en blanco con un comentario; si no, se interpreta como una cadena normal y corriente. En el código moderno casi nunca hace falta escribirlo a mano: los módulos ES (archivos .mjs o <script type="module">) y el cuerpo de cualquier class ya están en modo estricto por defecto.

¿Por qué conviene usar el modo estricto?

Porque caza los bugs antes. Una errata como usernmae = 'Ada' crea una variable global sin avisar en modo normal; en modo estricto lanza un ReferenceError. Además, reserva palabras clave de futuras versiones, prohíbe nombres de propiedad duplicados en motores antiguos y hace que this se comporte de forma predecible. Todo eso hace que el código sea mucho más fácil de razonar.

¿Hace falta escribir 'use strict' hoy en día?

Normalmente no. Los módulos ES y los cuerpos de class ya son estrictos por defecto, y casi cualquier proyecto moderno entra en una de esas dos categorías. Solo necesitas poner 'use strict'; de forma explícita en los scripts clásicos de toda la vida, es decir, los que se cargan con una etiqueta <script> sin type="module".

Aprende a programar con Coddy

COMENZAR