Strict mode en JavaScript: reglas y diferencias | Nicolás Garzón
Strict mode aplica reglas más rigurosas que convierten ciertos comportamientos silenciosos o ambiguos en errores.
JavaScript
Copiar "use strict" ;
undeclaredValue = 10 ;
La directiva debe aparecer al inicio del script, dentro del directive prologue.
JavaScript
Copiar "use strict" ;
const value = 10 ; Puede haber comentarios antes, pero no una sentencia que termine el prologue.
JavaScript
Copiar console. log ( "start" ) ;
"use strict" ; Aquí el string es una expresión normal y no activa strict mode para el script.
JavaScript
Copiar function calculate ( ) {
"use strict" ;
return this ;
} Afecta esa función y el código definido bajo su contexto estricto.
No es necesario activar todo el archivo para probar una función antigua de forma aislada.
JavaScript
Copiar export function calculate ( ) {
} El código de módulos ECMAScript se ejecuta en strict mode sin escribir la directiva.
En proyectos modernos con import y export, agregar "use strict" en cada archivo normalmente es redundante.
JavaScript
Copiar class Counter {
increment ( ) {
}
} Todas las partes de una declaración o expresión de clase utilizan semántica estricta.
En un script clásico no estricto, una asignación a un nombre no resuelto podía crear una propiedad global.
JavaScript
Copiar function saveName ( name ) {
userName = name;
} JavaScript
Copiar "use strict" ;
function saveName ( name ) {
userName = name;
} Esto detecta errores tipográficos cerca del origen.
JavaScript
Copiar const settings = Object. freeze ( {
theme : "dark" ,
} ) ; JavaScript
Copiar "use strict" ;
settings. theme = "light" ;
Escribir propiedades no escribibles.
Agregar propiedades a objetos no extensibles.
Eliminar propiedades no configurables.
Asignar a setters inexistentes en ciertos casos.
Sin strict mode, algunas operaciones podrían fallar sin cambiar nada y sin lanzar, haciendo más difícil detectar el bug.
JavaScript
Copiar function readThis ( ) {
"use strict" ;
return this ;
}
readThis ( ) ; En código no estricto, una llamada simple podía sustituir this por el objeto global.
Strict mode conserva undefined, lo que evita que una función modifique el global accidentalmente.
JavaScript
Copiar function setName ( name ) {
"use strict" ;
this . name = name;
}
setName ( "Nicolás" ) ;
JavaScript
Copiar function readThis ( ) {
"use strict" ;
return this ;
} JavaScript
Copiar readThis . call ( null ) ;
readThis . call ( undefined ) ;
readThis . call ( 10 ) ; En funciones no estrictas, null y undefined podían convertirse al global y los primitivos envolverse en objetos.
Código no estricto tradicional:
JavaScript
Copiar function example ( value ) {
value = 20 ;
console. log ( arguments[ 0 ] ) ;
} Podía mostrar 20 porque el parámetro y arguments[0] estaban enlazados.
JavaScript
Copiar function example ( value ) {
"use strict" ;
value = 20 ;
console. log ( arguments[ 0 ] ) ;
}
example ( 10 ) ; Cambiar uno no cambia automáticamente el otro.
En código moderno, rest parameters expresan mejor listas de argumentos.
JavaScript
Copiar function example ( value, value ) {
"use strict" ;
} Las funciones con parámetros no simples —defaults, rest o destructuring— ya tienen restricciones propias y no pueden contener una directiva "use strict" en su cuerpo.
JavaScript
Copiar function example ( value = 0 ) {
"use strict" ;
} Si necesitas strict mode, utiliza un módulo o coloca la función dentro de un contexto estricto exterior.
JavaScript
Copiar "use strict" ;
with ( settings) {
console. log ( theme) ;
}
with vuelve ambigua la resolución de nombres y dificulta optimización y lectura. El código moderno debe usar acceso explícito.
JavaScript
Copiar console. log ( settings. theme) ; JavaScript
Copiar "use strict" ;
delete user;
delete trabaja con propiedades, no con bindings léxicos.
JavaScript
Copiar delete object. user; Esta operación puede ser válida si la propiedad es configurable.
Strict mode prohíbe ciertas formas octales antiguas y escapes heredados ambiguos.
JavaScript
Copiar "use strict" ;
const value = 010 ;
La sintaxis moderna explícita es:
JavaScript
Copiar const value = 0o10 ; JavaScript
Copiar "use strict" ;
eval ( "var hidden = 10" ) ;
console. log ( hidden) ;
Las declaraciones creadas dentro del eval estricto no se filtran al scope exterior de la misma forma que podían hacerlo en código no estricto.
Aun así, evita eval salvo necesidades muy específicas. Strict mode no elimina sus riesgos de claridad, seguridad y optimización.
Strict mode reserva ciertos identificadores relacionados con características futuras o sintaxis del lenguaje.
No necesitas memorizar la lista para trabajar normalmente. Linters y parsers modernos detectan estas construcciones.
JavaScript
Copiar "use strict" ;
let value = 10 ;
value = "ten" ; Sigue siendo válido. Strict mode no impide que una variable reciba valores de tipos diferentes.
Tampoco valida respuestas de APIs ni contratos de objetos.
Strict mode reduce comportamientos problemáticos, pero no aísla código ni evita:
Acceso a APIs autorizadas por el entorno.
XSS.
Manipulación del DOM.
Solicitudes de red.
Lectura de variables accesibles.
Uso inseguro de eval.
La seguridad requiere controles del entorno y diseño de datos.
Reglas menos ambiguas permiten que motores y analizadores razonen mejor sobre el código.
El beneficio principal para quien programa es la corrección: errores que antes podían pasar silenciosamente ahora aparecen cerca de su origen.
No dependas de promesas genéricas de rendimiento; escribe código claro y mide rutas críticas.
En una aplicación basada en módulos:
JavaScript
Copiar import { createOrder } from "./orders.js" ; En scripts antiguos incrustados directamente:
HTML
Copiar < script src = " legacy.js" > </ script> la directiva puede seguir siendo relevante.
Al migrar código antiguo, activar strict mode puede revelar errores que antes eran silenciosos. Corrígelos; no retires la directiva solo para esconderlos.
Colocar "use strict" después de otra sentencia.
Repetir la directiva en todos los módulos sin saber que ya son estrictos.
Creer que strict mode añade tipos estáticos.
Pensar que vuelve seguro cualquier uso de eval.
Esperar que valide datos externos.
Usar una directiva dentro de una función con parámetros default, rest o destructuring.
Confundir el this de una función normal con el comportamiento léxico de una arrow function.
Desactivar strict mode cuando revela un bug real.
Strict mode convierte varios fallos silenciosos en errores.
Se activa mediante una directiva al inicio de un script o función.
Los módulos y las clases ya son estrictos.
Evita globales accidentales.
Una llamada simple deja this como undefined.
Parámetros y arguments no permanecen enlazados.
Prohíbe construcciones ambiguas como with y sintaxis octal heredada.
No es un sistema de tipos ni un sandbox.
¿Por qué esta directiva no funciona?
JavaScript
Copiar function example ( value = 0 ) {
"use strict" ;
return value;
} Respuesta La función tiene una lista de parámetros no simple por el valor predeterminado. No puede contener una directiva use strict en su cuerpo. Debe ejecutarse dentro de un módulo o contexto estricto exterior.
Diseño de código confiable reúne las prácticas que reducen estados inválidos y hacen que los fallos sean más fáciles de detectar y manejar.