Modo estricto de JavaScript: qué es y cómo usar use strict

Modo estricto de JavaScript: qué es y cómo usar use strict

¿Qué es el modo estricto?

El modo estricto se introdujo en ECMAScript 5 (ES5). Es un modo más restringido del lenguaje JavaScript que convierte en errores lo que normalmente se trata en silencio. Por ejemplo, en modo no estricto, si inicializas una variable sin declararla con la palabra clave var (por ejemplo x = 5, ), el intérprete de JavaScript dará por hecho que te referías a una variable global y, si esa variable no existía, la creará automáticamente.

Además, las funciones obsoletas también pueden generar errores en modo estricto. Así, el modo estricto reduce los fallos y mejora la seguridad y el rendimiento general de tu aplicación.

Activar el modo estricto

Para activar el modo estricto basta con añadir la cadena «use strict» al principio de tu script, como en el ejemplo siguiente:

javascript
"use strict";
x = 5; // ReferenceError: x is not defined
console.log(x);

Si añades la directiva «use strict» como primera línea de tu programa JavaScript, el modo estricto se aplica a todo el script. Pero también puedes activarlo únicamente dentro de una función, así:

javascript
x = 5;
console.log(x); // 5
function sayHello() {
    "use strict";
    str = "Hello World!"; // ReferenceError: str is not defined
    console.log(str);
}
sayHello();

Ten en cuenta: la directiva «use strict» solo se reconoce al principio de un script o de una función. Todos los navegadores modernos admiten la directiva «use strict» salvo Internet Explorer 9 y versiones anteriores. Además, los navegadores que no la admiten la ignoran en silencio y analizan el JavaScript en modo no estricto.

Restricciones generales en modo estricto

El modo estricto cambia a la vez la sintaxis y el comportamiento en ejecución. En las secciones siguientes repasamos las restricciones generales que se aplican en modo estricto:

Las variables no declaradas no están permitidas

Como ya sabes, en modo estricto todas las variables deben declararse. Si asignas un valor a un identificador que no es una variable declarada, se lanza un ReferenceError.

javascript
"use strict";

function doSomething() {
    msg = "Hello world!"; // ReferenceError: msg is not defined
    return msg;
}
console.log(doSomething());

Borrar una variable o una función no está permitido

En modo estricto, si intentas borrar una variable o una función se genera un error de sintaxis. En modo no estricto, ese intento falla en silencio y la expresión delete se evalúa como false.

javascript
"use strict";
var person = {name: "Damien", age: 25};
delete person; // SyntaxError

Lo mismo pasa al intentar borrar una función en modo estricto: obtienes un error de sintaxis.

javascript
"use strict";
function sum(a, b) {
    return a + b;
}
delete sum; // SyntaxError

Duplicar el nombre de un parámetro no está permitido

En modo estricto se genera un error de sintaxis si una declaración de función tiene dos o más parámetros con el mismo nombre. En modo no estricto no se produce ningún error.

javascript
"use strict";

function test(a, a) { // SyntaxError
    return a * a;
}
console.log(square(2, 2));

El método de evaluación no puede modificar el ámbito

En modo estricto, por razones de seguridad, el código que se pasa a eval() no puede declarar ni modificar variables, ni definir funciones en el entorno, como sí puede hacerlo en modo no estricto.

javascript
"use strict";
eval("var x = 5;");
console.log(x); // ReferenceError: x is not defined

eval y arguments no pueden usarse como identificadores

En modo estricto, los nombres eval y arguments se tratan como palabras clave, así que no pueden usarse como nombres de variables, de funciones, de parámetros de función, etc.

javascript
"use strict";
var eval = 10; // SyntaxError
console.log(eval);

La instrucción with no está permitida

En modo estricto, la instrucción with no está permitida. La instrucción with añade las propiedades y los métodos del objeto al ámbito actual. Así, las instrucciones anidadas dentro de with pueden llamar a las propiedades y los métodos del objeto directamente, sin referenciarlo.

javascript
"use strict";

// Sin with
var radius1 = 5;
var area1 = Math.PI * radius1 * radius1;

// Con with
var radius2 = 5;
with(Math) { // SyntaxError
    var area2 = PI * radius2 * radius2;
} 

Escribir en una propiedad de solo lectura no está permitido

En modo estricto, asignar un valor a una propiedad no escribible, a una propiedad de solo lectura o a una propiedad inexistente lanza un error. En modo no estricto, esos intentos fallan en silencio.

javascript
"use strict";

var personne = {name: "Damien", age: 25};

Object.defineProperty(personne, "genre", {value: "homme", writable: false});
personne.genre = "femme"; // TypeError

Añadir una propiedad nueva a un objeto no extensible no está permitido

En modo estricto, los intentos de crear propiedades nuevas en objetos no extensibles o inexistentes también lanzan un error. En modo no estricto, en cambio, esos intentos fallan en silencio.

javascript
"use strict";

var person = {name: "Damien", age: 25};

console.log(Object.isExtensible(personne)); // true
Object.freeze(personne); //  bloquear el objeto personne
console.log(Object.isExtensible(personne)); // false
personne.genre = "homme"; // TypeError

Los números octales no están permitidos

En modo estricto, los números octales (cifras precedidas de un cero, por ejemplo 010, 0377) no están permitidos. En modo no estricto, todos los navegadores los aceptan. En ES6, los números octales se admiten prefijando el número con 0o, es decir 0o10, 0o377, etc.

javascript
"use strict";

var x = 010; // SyntaxError
console.log(parseInt(x));

En los ejemplos anteriores se ve con claridad cómo el modo estricto ayuda a evitar errores habituales que suelen pasar inadvertidos al escribir un programa JavaScript.

Las palabras clave reservadas para el futuro no están permitidas

El modo estricto impone restricciones al uso de las palabras clave que están reservadas para el futuro.

Según las últimas normas de ECMAScript 6 (o ES6), estas palabras clave quedan reservadas en modo estricto: await, implements, interface, package, private, protected, public y static. Aun así, por compatibilidad, conviene evitar las palabras reservadas como nombres de variables o de funciones en tu programa.

Consejo: las palabras reservadas, también llamadas palabras clave, son palabras especiales que forman parte de la sintaxis del lenguaje JavaScript, por ejemplo var, if, fo, function, etc.

···

JavaScript

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.