El modo estricto (strict mode) es una característica de JavaScript que permite aplicar reglas más estrictas y seguras al código, lo que previene errores comunes, como el uso de variables no declaradas o la asignación silenciosa de propiedades. Se activa incluyendo la directiva "use strict";
.
El uso del modo estricto ayuda a crear un código más limpio, robusto y fácil de optimizar por los motores de JavaScript.
El origen del modo estricto se explica por dos características fundamentales de JavaScript. La primera es que, en sus inicios, este lenguaje fue diseñado para ser permisivo y accesible, incluso tolerante con errores de principiante. La segunda característica está relacionada con la necesidad de garantizar la compatibilidad hacia atrás a medida que el lenguaje evolucionaba.
Como resultado, JavaScript aplica por defecto reglas poco rigurosas, pues mantiene esas características originales. Pero con la llegada del modo estricto en ECMAScript 5 (2009), se introdujo una forma de escribir código más seguro sin comprometer el funcionamiento del código antiguo. Cuando se activa, algunos comportamientos que JavaScript permite de manera “relajada”, generan error.
Activar el modo estricto
Para activar el modo estricto en nuestro código se debe incluir la directiva "use strict";
(o 'use strict';
, con comilla simple) al inicio del programa o de una función. Si se coloca al principio del archivo, todo el programa funcionará de manera “moderna”. Si se coloca en una función, solo se aplicará a esa función. Las clases y los módulos de JavaScript ya lo habilitan de forma automática.
A todo el archivo
Para aplicar el modo estricto de forma global, que abarque todo el archivo JavaScript, se debe escribir "use strict";
en la primera línea del archivo. Todo el código del archivo pasará a funcionar en modo estricto.
Por ejemplo:
"use strict";
x = 10;
Este código devolverá un error diciendo que «la variable x no está definida».
Dentro de una función
Para que se aplique el modo estricto en una función, debe incluirse la directiva "use strict";
dentro de las llaves ({}
), siendo la primera instrucción. Si se encuentra en una posición intermedia, el modo estricto será ignorado.
Ejemplo incorrecto:
function ejemplo() {
x = 10;
"use strict";
y = 20;
}
En JavaScript, la directiva "use strict";
solo se reconoce si está al inicio del ámbito (scope), que en este caso es la función ejemplo()
.
Ejemplo correcto:
function ejemplo() {
"use strict";
x = 10;
y = 20;
}
En módulos y clases
En la actualidad, no siempre es necesario indicar de forma explícita la directiva "use strict";
. Por ejemplo, todo el código que se encuentra dentro de un módulo de JavaScript ya está en modo estricto de manera automática.
Lo mismo ocurre con las clases, que también fueron introducidas en la versión ECMAScript 6 (ES2015), igual que los módulos. Por tanto, el cuerpo de una clase siempre se ejecuta bajo las reglas del modo estricto.
Ventajas
Una de las ventajas más importantes del modo estricto es la eliminación de errores silenciosos. Por defecto, el intérprete de JavaScript ignora o falla de forma silenciosa al intentar realizar ciertas operaciones, tales como asignar valores a propiedades de solo lectura o a variables no declaradas.
De hecho, el modo estricto mejora la seguridad al evitar la creación de variables globales accidentales. Sin el modo estricto, la asignación a una variable no declarada crea una variable global, lo que contamina el ámbito global y puede llevar a conflictos con otras partes del código. El modo estricto lo impide.
Otra ventaja destacable es que el modo estricto prohíbe el uso de sintaxis que puede dificultar la optimización del código por parte del motor de JavaScript. Dicho de otra manera, permite que los motores de JavaScript optimicen el código de manera más eficiente, lo que generalmente resulta en una ejecución más rápida.
Además, ayuda a escribir código más legible y mantenible. Al hacer que ciertos errores sean explícitos, se fomenta una programación más cuidadosa, con más rigor. Esto será beneficioso tanto por el desarrollador que lo escribe como para cualquier otra persona que tenga que leer o modificar el código en el futuro.
Finalmente, el modo estricto contribuye a garantizar la compatibilidad futura del lenguaje. Al prohibir ciertas construcciones que puedan dar problemas, se sientan las bases para que las nuevas versiones de JavaScript (ECMAScript) puedan evolucionar sin romper el código de programas ya escritos.
Restricciones
Variables no declaradas: el modo estricto evita la creación de variables globales accidentales. En el modo normal, si se asigna un valor a una variable no declarada, JavaScript la crea automáticamente en el ámbito global. Esto puede contaminar el ámbito (scope) global, causando efectos secundarios inesperados.
Uso de this
en funciones: en una función normal que no pertenece a un objeto, this
se vincula por defecto al objeto global (window
o global
). Esto es a menudo una fuente de errores difícil de depurar. Pero con el modo estricto activado, this
es undefined
en lugar de apuntar al objeto global.
Propiedades de solo lectura: cuando se intenta modificar el valor de una propiedad de solo lectura, no configurable o que forma parte de un objeto sellado o congelado, por defecto, JavaScript ignora la operación y la permite, de forma silenciosa. En cambio, el modo estricto impide modificar propiedades inmutables.
Parámetros de función duplicados: por defecto, en JavaScript se puede declarar una función con parámetros que tengan el mismo nombre. Entonces, el intérprete usa el último valor asignado, lo que puede ser muy confuso y llevar a errores de lógica. El modo estricto no permite nombres de parámetros duplicados.
Uso de delete
: el modo estricto restringe el uso del operador delete
a solo las propiedades de objetos. Por tanto, no se puede usar en variables, funciones o parámetros de función. En el modo normal, esta acción falla de forma silenciosa, lo que puede ser muy engañoso para un desarrollador.
Identificadores reservados: el modo estricto impide el uso de ciertas palabras reservadas como nombres de variables, funciones o parámetros. En el modo normal, algunas de estas palabras se pueden usar sin que salte error: arguments
, eval
, implements
, interface
, let
, package
, private
, public
, static
y yield
. Esta restricción fomenta un código más limpio.