Cargando...

Modo estricto

La línea de esta página es ReferenceError. El modo estricto corta unos errores que antes seguían en silencio. "use strict" va al principio. Desde ahí, size = "regular" sin let y sin const no fabrica un global: el motor lanza ReferenceError.

Ni la lista ni la página de errores

La lista de tareas terminó en done: buy tea. La página de errores lanzó new Error("missing size") a propósito, y catch leyó ese mensaje. Aquí no lanzas un Error tuyo. Lanza el motor, porque size nunca se declaró. console.error sigue sin lanzar.

El sitio de la directiva

"use strict" solo cuenta como primera sentencia del script, o como primera sentencia dentro de una función. Una cadena más abajo no cambia nada. Una función puede ser estricta y el resto no. Los módulos ya son estrictos, así que allí la directiva sobra.

setSize antes del ejemplo

setSize asigna size sin declararlo. La llamada está en try. No se crea un size global.

Asignación sin declarar

javascript
"use strict";
function setSize() {
size = "regular";
}
try {
setSize();
} catch (error) {
console.log(error.name);
}

El registro muestra ReferenceError. El arreglo es declarar: let size = "regular". Con drink en tea y ese size declarado, label puede devolver tea / regular. Escribir order.size es el otro arreglo que sí vale, porque ese nombre existe.

Llamar por el nombre o llamar al método

Llamar a la función por su nombre no fija this. En modo estricto this es undefined. Llamar al método sobre order fija this en ese objeto, así que this.drink es tea.

this en una llamada bare

javascript
"use strict";
function bare() {
return this;
}
const order = {
drink: "tea",
label() {
return this.drink;
}
};
console.log(bare());
console.log(order.label());

Los registros son undefined y después tea. No leas this.drink dentro de bare. No hay objeto, y esa lectura lanza.

Cuatro diferencias

A la izquierda está la conducta silenciosa de antes. A la derecha está lo que hace la directiva.

📊 Qué cambia la directiva

Conducta silenciosa antigua Con "use strict"
size = "regular" sin declaración crea un global ReferenceError
this en bare es el objeto global undefined
Parámetro repetido, gana el último SyntaxError
delete sobre una variable declarada devuelve false SyntaxError

Un parámetro repetido, o delete size, falla mientras el script se lee: es un SyntaxError y try no lo atrapa. El ReferenceError de la asignación ocurre cuando la función corre, y catch sí lo ve. delete order.drink sigue permitido en los dos modos si la propiedad se puede quitar.

La página

La página es un solo script estricto. La asignación falla y el nombre del error se escribe en la página.

Página con ReferenceError

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
"use strict";
const line = document.querySelector("#line");
try {
size = "regular";
} catch (error) {
line.textContent = error.name;
}
</script>
</body>
</html>

La línea se lee ReferenceError. No es done: buy tea. No es caught / missing size. Pon let delante de size y este catch deja de correr.

Cinco pasos cortos

  1. Ejecuta setSize bajo "use strict". El registro es ReferenceError.
  2. Cambia la asignación a let size = "regular". El lanzamiento desaparece.
  3. Llama a bare(). El valor es undefined.
  4. Llama a order.label(). El valor es tea.
  5. Lee la página. La línea es ReferenceError.

Tropiezos reales

  • Poner la directiva después de otra sentencia
  • Esperar que una asignación sin declarar cree un global
  • Leer this.drink dentro de una llamada bare
  • Atrapar un parámetro repetido con try
  • Leer la línea como done: buy tea
  • Leerla como caught / missing size

Quédate con esto

  • La directiva primero
  • size = "regular" sin declarar lanza ReferenceError
  • this en bare es undefined, y order.label() devuelve tea
  • Los parámetros repetidos y delete sobre una variable son SyntaxError
  • La línea de la página es ReferenceError

🧠 Pon a Prueba tu Conocimiento

Listo para Empezar

Pon a Prueba tu Conocimiento

Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema

❓
6
Preguntas
🎯
70%
Para Aprobar
♾️
∞
Tiempo
🔄
∞
Intentos

📝 Instrucciones

  • Lee cada pregunta cuidadosamente
  • Selecciona la mejor respuesta para cada pregunta
  • Puedes repetir el quiz tantas veces como quieras
  • Tu progreso se mostrará en la parte superior