Modo Estricto
- Formato:
lectura
- Duración:
15 min
El modo estricto realiza cambios en la semántica normal de javascript. Un
aspecto importante es que el modo estricto elimina errores silenciosos, lo que
obligó a escribir un código mejor y no cometer errores.
La directiva use strict es una directiva que no supone una instrucción de
código, sino que indica el modo en que el navegador debe ejecutar el código
JavaScript.
Podríamos hablar de dos modos de ejecución JavaScript: normal mode
, que es el
que hemos estudiado hasta ahora, y el strict mode
, que vamos a explicar.
Invocando el modo estricto
Para invocar el modo estricto, sólo tienes que escribir “use strict”; en tu
archivo javascript, por ejemplo.
'use strict';
Ahora que ya sabe cómo invocar el modo estricto, vamos a ver un ejemplo rápido.
Ejemplo rápido
'use strict';
foo = 'Alexandra'; // Uncaught ReferenceError: foo is not defined
Es necesario declarar la variable.
'use strict';
var foo = 'Guilherme'; // It works!
El modo estricto cambia la sintaxis y el comportamiento en tiempo de ejecución. Los cambios generalmente caen dentro de estas categorías: cambios que convierten erratas en errores (como errores de sintaxis o en tiempo de ejecución), cambios que simplifican como una variable particular es calculada, cambios que simplifian el uso de eval y arguments, cambios que hacen más fácil escribir JavaScript "seguro", y cambios que anticipan la evolución futura de EMACScript.
Convirtiendo erratas en errores
El modo estricto cambia algunos errores de sintaxis tolerados en modo no estricto y los convierte en errores. JavaScript fue diseñado de modo que fuera fácil para programadores novatos, y puede haber operaciones semánticas que deberían ser errores pero son tratadas como libres de error. A veces esto sirve para solucionar el problema en el momento, pero puede crear problemas más graves en el futuro. El modo estricto trata las erratas como errores, para que puedan ser descubiertas y subsanadas inmediatamente.
En primer lugar, el modo estricto hace imposible crear variables globales por accidente. En JavaScript no estricto, si se escribe mal una variable en una asignación, se creará una nueva propiedad en el objeto globlal y el código continuará "trabajando" como si nada (aunque es posible que el código asi escrito falle en el futuro, en concreto, en JavaScript más moderno). En modo estricto, cualquier asignación que produzca variables globales por accidente lanzará un error.
En segundo lugar, el modo estricto lanza una excepción en asignaciones que de
otro modo fallarían silenciosamente. Por ejemplo, NaN es una variable que no
puede ser asignada. En un código normal, asignar a NaN
una variable no tiene
efectos; el programador no recibe ningún mensaje de error. En cambio, en modo
estricto, si se intenta asignar un valor a NaN
, el programador recibirá una
exepción. Cualquier asignación que falle silenciosamente en código normal
(asignaciones a una propiedad de no escritura, asignaciones a una propiedad get,
asignaciones a una nueva propiedad o a un objecto no extendible) lanzará una
exepción en modo estricto:
"use strict";
// Asignación a un no-escritura global
var undefined = 5;
var Infinity = 5;
// Asignación a una propiedad de no-escritura
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // lanza un TypeError
// Asignación a una propiedad de tipo getter
var obj2 = { get x() { return 17; } };
obj2.x = 5; // lanza un TypeError
// Asignación a una nueva propiedad en un objeto no-extendible
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // lanza un TypeError
En tercer lugar, el modo estricto lanza una excepción al intentar eliminar propiedades no eliminables (mientra que en código normal el intento no tendría ningún efecto):
"use strict";
delete Object.prototype; // lanza TypeError