El modo estricto es una nueva característica de ECMAScript 5. Le permite colocar todo el programa, o una función, en un contexto de operación "estricto". Este contexto estricto evita ciertas operaciones y arroja más excepciones.
Mientras que ECMAScript 5 es compatible con el retroceso con ECMAScript 3, en modo estricto, todas las características que no están favorecidas en ECMAScript 3 están deshabilitadas (o un error) en lugar de compatibles.
Habilitar el modo estricto tiene los siguientes beneficios:
1. Coge algunos errores de programación y arroje excepciones.
2. Evite que se realicen algunas operaciones relativamente "inseguras" (como acceder a variables globales) y se arrojan excepciones.
3. Desactive algunas características confusas.
La mayoría de la información sobre el modo estricto se puede encontrar en la página 223 del código ES5 [PDF].
(Nota: el modo estricto de Ecmascript 5 es diferente del modo estricto de Firefox)
Cómo habilitar el modo estricto
Agregue esta declaración al comienzo del programa para habilitar el modo estricto para todo el script:
La copia del código es la siguiente:
'Use estricto';
También puede habilitar el modo estricto solo dentro de la función, para que no afecte el exterior:
La copia del código es la siguiente:
función imstrict () {
'Use estricto';
// ... tu código ...
}
Una declaración que habilita el modo estricto es solo una cadena normal "use estricto", sin ninguna nueva sintaxis. Esto significa que no habrá impacto negativo en el antiguo navegador.
Una aplicación práctica de habilitar el modo estricto dentro de una función es definir toda la biblioteca de clases JavaScript dentro de una función de modo estricto, para que no afecte el código externo:
La copia del código es la siguiente:
// Código no rictamente ...
(función(){
"Use estricto";
// Defina su biblioteca estrictamente ...
}) ();
// Código no rictamente ...
Entonces, ¿qué cambios se han realizado en scripts en modo estricto?
Variables y propiedades
Asignar una variable indefinida fallará en lugar de usar esta variable como una variable global.
Escribir una propiedad con una propiedad de escritura falsa, eliminar una propiedad con una propiedad configurable con un falso o agregar una propiedad con una propiedad extensible con un falso, dará como resultado un error (estas características están previamente accesorios). En el pasado, estas operaciones no arrojaron excepciones, sino que simplemente fallaron en silencio.
Realizar operaciones de eliminación en variables, funciones o parámetros de función causará un error.
La copia del código es la siguiente:
var foo = 'test';
función test () {}
eliminar foo; // Error
Eliminar prueba; // Error
función test2 (arg) {
eliminar arg; // Error
}
Definir la misma propiedad dentro de un contenedor de objeto provocará la excepción:
La copia del código es la siguiente:
// Error
{foo: true, foo: falso}
evaluación
Se prohíbe cualquier uso del nombre "eval" (el propósito principal es apuntar la función eval a una variable u propiedad del objeto).
La copia del código es la siguiente:
// Todos generan errores ...
obj.eval = ...
obj.foo = eval;
var eval = ...;
para (var eval en ...) {}
función eval () {}
prueba de función (eval) {}
función (eval) {}
nueva función ("eval")
Además, declarar nuevas variables a través de Eval también no será válida:
La copia del código es la siguiente:
eval ("var a = false;");
imprimir (typeOf a); // indefinido
función
Reescribir argumentos El objeto causará un error:
La copia del código es la siguiente:
argumentos = [...]; // no permitido
Los parámetros con el mismo nombre causarán un error:
La copia del código es la siguiente:
(función (foo, foo) {}) // error
Acceso a los argumentos. Caller y argumentos. Callee lanza una excepción. Por lo tanto, cualquier función anónima que deba usarse debe llamarse primero, por ejemplo:
La copia del código es la siguiente:
setTimeout (function luego () {
// hacer cosas ...
setTimeOut (más tarde, 1000);
}, 1000);
Los argumentos, las propiedades de la persona que llaman y la calle de la función ya no existen, y la operación para definirlos también está prohibido.
La copia del código es la siguiente:
función test () {}
test.caller = 'Caller'; // Error
Finalmente, se ha resuelto un error de larga data (y muy molesto): cuando se usa nulo o indefinido como el primer parámetro de la función.prototype.call o function.prototype.apply Method, esta función de dentro de la función apuntará al objeto global. Y el modo estricto evitará su ejecución y lanzará excepciones:
La copia del código es la siguiente:
(function () {...}). Llame (NULL); // Excepción
con() { }
La declaración con () {} se cuelga por completo en modo estricto.