"Modo Strict" es una nueva sintaxis definida en ECMA-262 Edition 5, lo que indica que debe ejecutarse utilizando una sintaxis de JavaScript Strict. Algunos métodos de escritura utilizados en el pasado lanzarán excepciones de SyntaxError, como:
1. Sin declaración de var antes de la variable
2. Use la sintaxis octal: var n = 023 y var s = "/047"
3. Use con declaraciones
4. Use Eliminar para eliminar un nombre de variable (no el nombre del atributo): Eliminar myVariable
5. Use Eval o argumentos como nombre o nombre de función variable
6. Use palabras reservadas futuras (tal vez usadas en Ecmascript 6): implementos, interfaz, permiso, paquete, privado, protegido, público, estático y de rendimiento como nombres o nombres de funciones variables
7. Use la declaración de función en el bloque de instrucciones: if (a <b) {function f () {}}
8. Otros errores
8.1. Use dos nombres de atributos idénticos en el tamaño subfacio de objetos: {A: 1, B: 3, A: 7}
8.2. Use dos nombres de parámetros idénticos en los parámetros de función: función f (a, b, b) {}
Estos se explican en detalle a continuación.
1. ¿Por qué usar "modo estricto"
El propósito de establecer un "modelo estricto" es principalmente el siguiente:
1. Elimine algunos aspectos irrazonables e imperfectos de la sintaxis de JavaScript y reduzca algunos comportamientos extraños;
2. Elimine algunas inseguridades en el código que se ejecuta y garantice la seguridad del código en funcionamiento;
3. Mejorar la eficiencia del compilador y aumentar la velocidad de operación;
4. Establezca las bases para la nueva versión de JavaScript en el futuro.
El "modo estricto" refleja la dirección de desarrollo más razonable, más segura y rigurosa de JavaScript. Los navegadores convencionales, incluido IE 10, ya lo han apoyado, y muchos proyectos importantes han comenzado a adoptarlo en su totalidad.
Por otro lado, el mismo código puede tener diferentes resultados de ejecución en "modo estricto"; Algunas declaraciones que se pueden ejecutar en "modo normal" no se ejecutarán en "modo estricto". Dominar estos contenidos lo ayudará a comprender a JavaScript con más cuidado y en profundidad, lo que lo convierte en un mejor programador.
Este artículo dará una introducción detallada al "modelo estricto".
2. Declarar "modo estricto"
Declarar "modo estricto" es simple y solo tiene una declaración:
La copia del código es la siguiente: "Use estricto";
Nota: Los navegadores más antiguos lo tratarán como una cadena normal y la ignorarán.
3. Declarar la ubicación y la relación contextual del "modo estricto"
El "modo estricto" afecta principalmente el alcance donde se encuentra. Si se usa en funciones, no convertirá el alcance global y otras funciones no utilizadas en "modo estricto". Es decir, el alcance de una declaración de patrón estricto depende de su contexto. Si el modo estricto se declara en un contexto global (fuera del alcance de una función), todo el código en el programa está en modo estricto. Si se declara un patrón estricto en una función, todo el código en la función está en un patrón estricto. Por ejemplo, en el siguiente ejemplo, todo el código está en modo estricto, y las declaraciones variables fuera de la función causarán un error de sintaxis: "Las variables no se definen en modo estricto". Hay dos formas de llamar al "modo estricto" y son adecuados para diferentes ocasiones.
1. para todo el archivo de script
Poner "Use Strict" en la primera línea del archivo de script y todo el script se ejecutará en "Modo estricto". Si esta declaración de línea no está en la primera línea, no es válida y todo el script se ejecuta en "modo normal". Esto requiere una atención especial si los archivos de código de diferentes modos se fusionan en un archivo.
(Estrictamente hablando, siempre y cuando la declaración que produce el resultado de ejecución real no esté precedido, "usar estricto" puede no estar en la primera línea, como directamente siguiendo un punto y coma vacío).
La copia del código es la siguiente:
<script>
"Use estricto";
console.log ("Este es el modo estricto");
</script>
<script>
console.log ("Este es modo normal");
</script>
El código anterior indica que hay dos piezas de código JavaScript en una página web a su vez. La etiqueta de script anterior es el modo estricto, el último no lo es.
2. Para una sola función
Poner "use estricto" en la primera línea del cuerpo de la función, y toda la función se ejecuta en "modo estricto".
La copia del código es la siguiente:
función estrict () {
"Use estricto";
devolver "Este es un patrón estricto";
}
function noTrict () {
devolver "Este es el modo normal";
}
3. Sueltos para archivos de script
Debido a que el primer método de llamada no es propicio para la fusión de archivos, es mejor tomar prestado el segundo método y colocar todo el archivo de script en una función anónima que se ejecuta de inmediato.
La copia del código es la siguiente:
(función (){
"Use estricto";
// algún código aquí
}) ();
4. Sintaxis y cambios de comportamiento en "modo estricto"
El "modo estricto" ha realizado algunos cambios en la sintaxis y el comportamiento de JavaScript.
1. Declaración explícita de variables globales
En el modo normal, al usar variables, no tenemos que usar var para declarar (declarar explícitamente), pero en modo estricto, debemos usar VAR para declarar antes de usar variables, de lo contrario se producirá un error.
La copia del código es la siguiente:
"Use estricto";
V = 1; // se informa un error, V no se declara
para (i = 0; i <2; i ++) {// Se informó un error, no fui declarado
}
Por lo tanto, en modo estricto, las variables deben declararse con el comando VAR antes de usar.
2. ANIA ESTÁTICA
Una característica del lenguaje JavaScript es que permite la "unión dinámica", es decir, a qué objetos pertenecen ciertas propiedades y métodos, no se determina en el momento de la compilación, sino en tiempo de ejecución.
El modo estricto impone algunas restricciones a la unión dinámica. En algunos casos, solo se permite la unión estática. En otras palabras, a qué objeto los atributos y los métodos pertenecen se determina durante la etapa de compilación. Esto ayudará a mejorar la eficiencia de la compilación, facilitar el código de leer y menos accidentes.
Específicamente, los siguientes aspectos están involucrados.
(1) El uso con declaraciones está prohibido
Porque la declaración con la declaración no se puede determinar en el momento de la compilación, a qué objeto pertenece el atributo.
La copia del código es la siguiente:
"Use estricto";
var v = 1;
con (o) {// Error de sintaxis
V = 2;
}
(2) crear un alcance de evaluación
En el modo normal, el lenguaje JavaScript tiene dos ámbitos variables: alcance global y alcance de la función. El modo estricto crea un tercer alcance: evaluación de evaluación.
En el modo normal, el alcance de la declaración EVIS depende de si está en el alcance global o en el alcance funcional. En modo estricto, la instrucción EVAL en sí es un alcance y ya no puede generar variables globales. Las variables que genera solo se pueden usar dentro de Eval.
La copia del código es la siguiente:
"Use estricto";
var x = 2;
console.info (eval ("var x = 5; x")); // 5
console.info (x); // 2
3. Medidas de seguridad mejoradas
(1) Provger que esta palabra clave apunte a los objetos globales
La copia del código es la siguiente:
función f () {
¡Regresa! Esto;
}
// Devuelve falso, porque "esto" señala el objeto global "! Esto" es falso
función f () {
"Use estricto";
¡Regresa! Esto;
}
// Devuelve verdadero, porque en modo estricto, el valor de esto está indefinido, así que "! Esto" es cierto.
Por lo tanto, cuando usa el constructor, si olvida agregar nuevo, esto ya no apunta al objeto global, sino que informa un error.
La copia del código es la siguiente:
función f () {
"Use estricto";
esto.a = 1;
};
f (); // Error, esto no está definido
En la función de la función ordinaria f (), el valor de esto apuntará al objeto global. En modo estricto, el valor de esto apuntará a indefinido. Cuando la función se llama a través de la llamada y aplica, si el parámetro de valor aprobado es un valor primitivo (cadena, número, valor booleano), excepto para nulo y indefinido, entonces el valor de esto se convertirá en el objeto de envoltura correspondiente al valor original. Si el valor de este parámetro de valor está indefinido o nulo, el valor de esto apuntará al objeto global. En modo estricto, el valor de este valor es el valor de este parámetro de valor, sin ninguna conversión de tipo.
(2) prohibido atravesar la pila de llamadas dentro de la función
La copia del código es la siguiente:
función f1 () {
"Use estricto";
f1.caller; // Informar un error
f1.argumentos; // Informar un error
}
f1 ();
4. Deshabilitar la eliminación de variables
Las variables no se pueden eliminar en modo estricto. Solo las propiedades del objeto cuyas configurables están configuradas en True se pueden eliminar.
La copia del código es la siguiente:
"Use estricto";
var x;
eliminar x; // Error de sintaxis
var o = object.create (null, 'x', {
Valor: 1,
configurable: verdadero
});
eliminar buey; // Eliminar con éxito
5. Error explícito
En el modo normal, si asigna una propiedad de solo lectura de un objeto, no habrá errores y solo fallará en silencio. En modo estricto, se informará un error.
La copia del código es la siguiente:
"Use estricto";
var o = {};
Object.defineProperty (o, "V", {valor: 1, Writable: False});
ov = 2; // Informar un error
En modo estricto, si asigna una propiedad leída utilizando el método Getter, se informará un error.
La copia del código es la siguiente:
"Use estricto";
var o = {
get v () {return 1; }
};
ov = 2; // Informar un error
En modo estricto, agregar nuevos atributos a los objetos que se les prohíbe extender dará como resultado un error.
La copia del código es la siguiente:
"Use estricto";
var o = {};
Object.preventExtensions (o);
ov = 1; // Informar un error
En modo estricto, la eliminación de una propiedad sin elegir causará un error.
La copia del código es la siguiente:
"Use estricto";
eliminar objeto.prototype; // Informar un error
6. Cambiar el nombre de error
El modo estricto ha agregado algunos errores de sintaxis.
(1) Los objetos no pueden tener atributos con nombres duplicados
En el modo normal, si el objeto tiene múltiples atributos duplicados, el último atributo asignado anulará el valor anterior. En modo estricto, este es un error de sintaxis.
La copia del código es la siguiente:
"Use estricto";
var o = {
P: 1,
P: 2
}; // Error de sintaxis
(2) Las funciones no pueden tener parámetros con nombres duplicados
En el modo normal, si la función tiene múltiples parámetros con nombres duplicados, se puede leer con argumentos [i]. En modo estricto, este es un error de sintaxis.
La copia del código es la siguiente:
"Use estricto";
Función F (A, A, B) {// Error de sintaxis
devolver ;
}
7. La notación octal está prohibida
En el modo normal, si el primer bit de un entero es 0, significa que este es un número octal, como 0100 es igual a 64 en decimal. El modo estricto prohíbe esta representación. Si el primer bit del entero es 0, se informará un error.
La copia del código es la siguiente:
"Use estricto";
var n = 0100; // Error de sintaxis
8. Restricciones de objetos de argumentos
Los argumentos son objetos de parámetros de funciones, y el modo estricto limita su uso.
(1) No se permite asignar argumentos
La copia del código es la siguiente:
"Use estricto";
argumentos ++; // Error de sintaxis
var obj = {set p (argumentos) {}}; // Error de sintaxis
intente {} capt (argumentos) {} // error de sintaxis
Argumentos de función () {} // Error de sintaxis
var f = nueva función ("argumentos", "'usar estricto'; return 17;"); // Error de sintaxis
(2) los argumentos ya no rastrea los cambios en los parámetros
La copia del código es la siguiente:
función f (a) {
a = 2;
devolver [a, argumentos [0]];
}
f (1); // El modo normal es [2,2]
función f (a) {
"Use estricto";
a = 2;
devolver [a, argumentos [0]];
}
f (1); // El modo estricto es [2,1]
(3) Uso de argumentos. Callee está prohibido
Esto significa que no puede llamarse a sí mismo dentro de una función anónima.
La copia del código es la siguiente:
"Use estricto";
var f = function () {return arguments.callee; };
F(); // Informar un error
9. La función debe declararse en el nivel superior
En el futuro, las nuevas versiones de JavaScript introducirán "alcance a nivel de bloque". Para alinearse con la nueva versión, el modo estricto solo permite que las funciones se declaren en el nivel superior del alcance global o el alcance de la función. Es decir, no se le permite declarar funciones dentro de los bloques de código no función.
La copia del código es la siguiente:
"Use estricto";
if (true) {
Función f () {} // Error de sintaxis
}
para (var i = 0; i <5; i ++) {
función f2 () {} // Error de sintaxis
}
10. Mantenga las palabras
Para hacer la transición a una nueva versión de JavaScript en el futuro, se han agregado algunas palabras reservadas al modo estricto: implementos, interfaz, permiso, paquete, privado, protegido, público, estático, de rendimiento.
El uso de estas palabras como nombres de variables dará como resultado un error.
La copia del código es la siguiente:
paquete de funciones (protegido) {// Error de sintaxis
"Use estricto";
implementos var; // Error de sintaxis
}
Además, la quinta versión de ECMAScript también estipula otras palabras reservadas (clase, enum, exportación, extiende, importación, super), así como palabras reservadas constantes agregadas por los principales navegadores, que no pueden usarse como nombres variables.