El patrón estricto introducido en ECMAScript5 permite a los desarrolladores tener un lenguaje JavaScript "mejor" al permitir que el entorno de ejecución de JavaScript se ocupe de algunos de los errores más comunes y difíciles de detectar en el proceso de desarrollo. Durante mucho tiempo, tenía dudas sobre el modo estricto porque solo Firefox admite el modo estricto. Pero hoy, todos los navegadores convencionales admiten el modo estricto en sus últimas versiones (incluidas IE10, Opera12 y Android 4, iOS5). Es hora de comenzar a usar el modo estricto.
¿Qué papel puede jugar el modelo estricto?
El patrón estricto introduce muchos cambios en JavaScript, y los dividí en dos categorías (obvias y sutiles). El objetivo de las mejoras menores es solucionar algunos problemas detallados en JavaScript actual, que no entraré en profundidad aquí; Si está interesado, lea el maravilloso documento escrito por Dmitry Soshnikov ECMA-262-5 en detalle Capítulo 2 Modo estricto. Principalmente introdujo los cambios obvios introducidos por el modo estricto, los conceptos que debe conocer antes de usar el modo estricto y esos cambios que más lo ayudan.
Antes de comenzar a aprender características específicas, recuerde que uno de los principales objetivos del modo estricto es permitirle depurar más rápido y más convenientemente. Es mejor lanzar un error explícito cuando el entorno de tiempo de ejecución descubre un problema que fallar en silencio o actuar de manera extraña (que a menudo es el caso con los entornos de ejecución de JavaScript que no encienden el modo estricto). El modo estricto arroja más errores, pero eso es bueno porque estos errores llamarán su atención y solucionarán muchos problemas potenciales que antes eran difíciles de detectar.
Eliminar con palabras clave
Primero, la instrucción With se elimina en el modo estricto, y el código que contiene la declaración con una excepción en el modo estricto. Entonces, el primer paso para usar el modo estricto: asegúrese de no usarlo en su código.
La copia del código es la siguiente:
// El siguiente código JavaScript arrojará un error en modo estricto
con (ubicación) {
alerta (href);
}
Evitar la asignación inesperada de valores a las variables globales
En segundo lugar, las variables locales deben declararse antes de la asignación. Antes de que el modo estricto esté habilitado, una variable global con el mismo nombre se crea automáticamente al copiar para una variable local no declarada. Este es uno de los errores más comunes en los programas de JavaScript, y al intentar hacer esto en modo estricto, se lanzarán excepciones explícitas.
La copia del código es la siguiente:
// La excepción se lanzará en modo estricto
(función() {
SomeUndeclaredVar = "foo";
} ());
Esto en la función ya no apunta al global por defecto
Otro cambio importante en el modo estricto es que esta función que no está definida o indefinida (nula o indefinida) no apunta al entorno global de forma predeterminada. Esto causará algunos errores de ejecución del código que dependen del comportamiento predeterminado de esto en la función, por ejemplo:
La copia del código es la siguiente:
window.color = "rojo";
función sayscolor () {
alerta (this.color);
}
// Se informará un error en modo estricto. Si no está en modo estricto, provocará "rojo"
SayColor ();
// Se informará un error en modo estricto. Si no está en modo estricto, provocará "rojo"
saycolor.call (nulo);
Esto permanecerá indefinido antes de ser asignado, lo que significa que cuando se ejecuta un constructor, se lanzará una excepción si no hay una nueva palabra clave clara antes.
La copia del código es la siguiente:
Función persona (nombre) {
this.name = name;
}
// Habrá un error en modo estricto
var me = persona ("nicholas");
En el código anterior, debido a que no hay nuevo antes, esto en la función se dejará indefinido. Como no puede establecer propiedades para indefinido, el código anterior arrojará un error. En los entornos de modo no rictamente, esto no se copia en la variable global de la ventana de forma predeterminada, y el resultado de la ejecución establecerá inesperadamente el atributo de nombre para la variable global de la ventana.
Prevenir renombes
Al escribir mucho código, las propiedades del objeto y los parámetros de función se establecen fácilmente accidentalmente en un nombre duplicado. El modo estricto lanzará explícitamente errores en este caso
La copia del código es la siguiente:
// Los nombres de variables repetidos informarán un error en modo estricto
function DoSomething (value1, value2, value1) {
//código
}
// Los nombres de los atributos de objeto aburrido informarán un error en modo estricto:
objeto var = {
foo: "bar",
Foo: "Baz"
};
El código anterior se considerará un error de sintaxis en modo estricto y le permitirá obtener indicaciones antes de la ejecución.
Safe Eval ()
Aunque la instrucción eval () no se eliminó al final, todavía se mejoró en modo estricto. El mayor cambio es que las variables y las declaraciones de funciones ejecutadas en eval () no crearán directamente las variables o funciones correspondientes en el alcance actual, por ejemplo:
La copia del código es la siguiente:
(función() {
eval ("var x = 10;");
// en modo no riguroso, alerta 10
// En modo estricto, se lanza una excepción porque X no está definido.
alerta (x);
} ());
Las variables o funciones creadas durante la ejecución de eval () se conservan en eval (). Pero puede obtener explícitamente el resultado de ejecución en eval () desde el valor de retorno de la instrucción eval (), por ejemplo:
La copia del código es la siguiente:
(función() {
resultado var = eval ("var x = 10, y = 20; x + y");
// Las declaraciones restantes se pueden ejecutar correctamente en modo estricto o no rictamente. (El resulto es de 30)
alerta (resultado);
} ());
Lanzar una excepción al modificar los atributos de solo lectura
ECMAScript5 también introduce la capacidad de establecer propiedades específicas de un objeto a solo lectura, o hacer que todo el objeto no modificado. Sin embargo, en modo no riguroso, intentar modificar una propiedad de solo lectura solo fallará en silencio. Es probable que esto le suceda durante su trato con algunas API nativas del navegador. El modo estricto lanzará explícitamente excepciones en este caso, recordándole que no está permitido modificar esta propiedad.
La copia del código es la siguiente:
Var Person = {};
Object.defineProperty (persona, "nombre" {
Writable: Falso,
Valor: "Nicholas"
});
// En modo no riguroso, el silencio falla, y se lanza una excepción en modo estricto.
persona.name = "John";
En el ejemplo anterior, el atributo de nombre está configurado en solo lectura. La ejecución de la modificación del atributo de nombre en el modo no riguroso no causará un error, pero la modificación no tendrá éxito. Pero el modo estricto claramente arrojará excepciones.
Nota: Se recomienda encarecidamente que habilite el modo estricto al especificar con los atributos de ECMAScript.
¿Cómo usarlo?
Es muy fácil habilitar el modo estricto en los navegadores modernos, solo necesita aparecer el siguiente comando en el código JavaScript
"Use estricto";
Aunque el código anterior parece ser solo una cadena que no da una cierta variable, en realidad significa que el motor JavaScript cambia al modo estricto (los navegadores que no admiten el modo estricto ignorarán el código anterior y no tendrán ningún impacto en la ejecución posterior). Aunque puede aplicar esta instrucción a una función global o global, aquí debemos recordarle que no habilite el modo estricto en un entorno global.
La copia del código es la siguiente:
// por favor no lo uses así
"Use estricto";
función dosomething () {
// Esta parte del código se ejecutará en modo estricto
}
función dosomethingElse () {
// Esta parte del código también se ejecutará en modo estricto
}
Aunque el código anterior no parece ser un gran problema. Pero cuando no es responsable de mantener todo el código introducido en la página, el uso de modo estricto de esta manera hará que tenga problemas causados por un código de terceros que no se esté preparando para el modo estricto.
Por lo tanto, es mejor usar instrucciones que habiliten el modo estricto en la función, por ejemplo:
La copia del código es la siguiente:
función dosomething () {
"Use estricto";
// El código en esta función se ejecutará en modo estricto
}
función dosomethingElse () {
// El código en esta función no se ejecutará en modo estricto
}
Si desea que el modo estricto se habilite en más de una función, use la expresión de la función invocada inmediatamente (IIFE):
La copia del código es la siguiente:
(función() {
"Use estricto";
función dosomething () {
// Esta función se ejecuta en modo estricto
}
función dosomethingElse () {
// Esta función también se ejecuta en modo estricto
}
} ());
en conclusión
Recomiendo encarecidamente que habilite el modo estricto JavaScript a partir de ahora, lo que puede ayudarlo a descubrir errores que no ha notado en su código. No lo habilite en un entorno global, pero puede usar IFIS tanto como sea posible (ejecute expresiones de funciones de inmediato) para aplicar patrones estrictos a múltiples funciones. Al principio, encontrará mensajes de error que nunca antes había encontrado, lo cual es normal. Cuando se habilite el modo estricto, asegúrese de probarlo en navegadores compatibles para descubrir nuevos problemas potenciales. No solo agregue una línea "Use estricto" al código y suponga que el código restante funcionará correctamente. Finalmente, comience a escribir mejor código en modo estricto.
Nota:
Aquí hay un resumen de las situaciones de soporte de modo estricto de cada navegador.
Puede probar el soporte de modo estricto del navegador actual en esta página.
Ventajas del modo estricto:
Facitar a JavaScript más
1. Esto ya no está encapsulado, y en modo normal, esto siempre ha sido un objeto.
2. Diversión. Caller y Fun. Los argumentos no son propiedades eliminables, y no se pueden establecer o recuperar.
3. Argumentos. Caller también es un atributo que no se puede eliminar, ni se puede establecer ni recuperarse.
Allanar el camino para futuras versiones de Ecmascript
1. Se agregaron las siguientes palabras reservadas: implementos, interfaz, letra, paquete, privado, protegido, público, estático y rendimiento.
2. La declaración del método debe colocarse en la parte delantera del script o método, y no se puede colocar en el medio de declaraciones, como si o para.