En JavaScript, puede usar la función eval () para analizar el código JavaScript en una cadena y devolver el resultado de ejecución del código correspondiente:
La copia del código es la siguiente:
console.log (eval ("42 * 2")); // 84
Eval () es esencialmente una función de un objeto global de JavaScript. Por ejemplo, el código anterior es equivalente a:
La copia del código es la siguiente:
console.log (this.eval ("42 * 2")); // 84
Sin embargo, cuando se usa la declaración eval (), el primer método mencionado anteriormente generalmente se adopta, es decir, ignora el objeto global y use eval () directamente.
Uso de eval ()
Por las siguientes dos razones, a menos que realmente lo necesite, debe intentar evitar usar la instrucción eval () en su código:
1. Lógicamente hablando, las cadenas deben usarse para almacenar contenido e información durante la operación del programa, en lugar de almacenar una lógica de cálculo específica.
2. Dado que el parámetro eval () es una cadena, y no puede ser léxico para una cadena, el intérprete JavaScript no puede optimizar para la instrucción Eval () de llamada.
Valor de retorno de eval ()
El valor de retorno de eval () sigue las siguientes reglas:
1. Si el parámetro de eval () no es una cadena, eval () devolverá directamente el parámetro.
2. Si el parámetro de eval () es una cadena, entonces eval () analiza la cadena en el código y la ejecuta, y devuelve el resultado de la última línea de ejecución del código.
3. Si la cadena no se puede analizar en un código legítimo, eval () lanzará un error de SyntaxError.
4. Si una cadena se puede analizar en código legal, pero se informa un error durante la ejecución de este código, entonces el error se informará a la instrucción eval () y se lanza por eval ().
La copia del código es la siguiente:
console.log (eval ([1,2,3])); // [1, 2, 3]
console.log (typeof eval ([1,2,3])); // objeto
console.log (eval ("42 */2")); // SyntaxError
console.log (eval ("42 * 2; 22 * 3;")); // 66. eval devuelve el resultado de la última expresión/declaración
console.log (eval ("null.ToString ()")); // typeError, la excepción en el código eval-ed se propagará fuera de eval ().
entorno variable
Eval () en JavaScript tiene una característica importante: el código en la cadena de parámetros eval () puede acceder a variables en el código externo, y también puede exponer las variables recién creadas en el código de cadena de parámetros al código externo. Es decir, si la cadena de parámetros eval () se puede analizar legalmente, JS reemplazará el código analizado con la línea donde se encuentra eval ():
La copia del código es la siguiente:
// entorno variable
var a = 108;
console.log (eval ("function double (x) {return x*2;} a = double (a)"));
console.log (a); // 216
console.log (doble (33)); // 66
Vale la pena señalar que el requisito previo para implementar la función anterior es que el código en la cadena de parámetros eval () se puede analizar legalmente. Además de corregir la sintaxis del código, JS también requiere que el código en la cadena de parámetro eval () esté "autoorganizado": el código solo debe tener sentido en términos del código en la cadena de parámetros. Por ejemplo, es imposible pasar una cadena como "retorno"; a la función eval ():
La copia del código es la siguiente:
función test () {
var s = "prueba";
eval ("return s;");
}
test (); // syntaxError: return no en función
Si usa la función eval () directamente, las variables accedidas por el código en la cadena de parámetros eval () son aquellas variables en la función donde se encuentra la declaración eval (), es decir, el entorno variable utilizado por la función eval () es el "entorno variable local". Si no usa la función eval () directamente, pero usa una nueva variable que también apunta a la función eval (), entonces las variables a las que se accede por el código en la cadena de parámetros correspondientes son variables globales, es decir, el entorno variable utilizado por la función eval () es "entorno variable global":
La copia del código es la siguiente:
// entorno variable local y entorno variable global
var renombrado = eval;
var x = "origen", y = "origen";
función f () {
var x = "nuevo";
eval ("x += 'cambiado';");
regresar x;
}
función g () {
var y = "nuevo";
renombrado ("y += 'cambiado';");
regresar y;
}
console.log (f (), x); // Origen NewChanged
console.log (g (), y); // nuevo OriginChanged
Sin embargo, vale la pena señalar que el comportamiento en IE6, 7 y 8 es diferente. En IE6, 7 y 8, incluso si se renombra la función eval (), todavía se usa el "entorno variable local".