La función de eval es realmente muy simple. Es pasar una cadena al intérprete JS, y el intérprete de Javascript interpretará la cadena en código Javascript y la ejecutará.
Tomemos el ejemplo más simple:
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
eval("alerta(1+1)");
guión>
Es muy simple: interprete la cadena en código JS y ejecútela, y aparecerá 2.
Por supuesto, el ejemplo anterior es sólo un juguete y nadie sería tan estúpido como para usarlo en la práctica. Creo que la forma más básica de usar la función eval es en el DOM. Por ejemplo, si tenemos div1, div2 y div3, entonces no hay forma de obtener nuestra ID cuando usamos document.getElementByID. Úselo en un bucle for. Utilice eval para unir dicho programa. Por ejemplo:
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
for (var bucle = 1; bucle < 10; bucle++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
guión>
Después de hablar sobre el uso más básico, creo que todos todavía están interesados en esta función. Si esta función solo tiene unos pocos usos, sería demasiado aburrido. Luego, echemos un vistazo a la función eval () poco a poco.
Comencemos con el alcance de eval y observemos esta función:
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
eval("var i=3");
alerta(yo);
guión>
El código es muy simple y el resultado puede aparecer 3. A continuación, compare este código:
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
var prueba = función () {
eval("var i=3");
alerta(yo);
}
prueba();
alerta(yo);
guión>
El resultado es que primero aparece 3 y luego indefinido.
Entonces explique: el código ejecutado dinámicamente por la función eval () no crea un nuevo alcance y su código se ejecuta en el alcance actual. En otras palabras, la función eval() también puede usar este argumento y otros objetos en el alcance actual.
En IE, se admite una función muy similar a eval(): execScript(). Podemos escribir un código simple.
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
var prueba = función () {
execScript("var i=3");
alerta(i);
}
prueba();
alerta(yo);
guión>
Como resultado, aparecieron dos 3. Esto también muestra las características de la función execScript. En primer lugar, es similar a eval. Puede interpretar cadenas en código JS y ejecutarlas, pero su alcance no es el alcance actual. el alcance mundial. Cuando probamos el código anterior en Firefox y Google Chrome: encontramos que el código en execScript no es válido en Firefox, lo que también ilustra un problema con la compatibilidad del código execScript con el navegador.
Entonces surge la pregunta, ¿cómo podemos combinar las "ventajas" de estas dos funciones, es decir, la compatibilidad global + del navegador? Busqué en línea y lo resumí yo mismo, que probablemente sea así:
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
var StrongEval = función (código) {
si (ventana.navigator.userAgent.indexOf("MSIE") >= 1) {
ejecutivoScript(código);
}
si (ventana.navigator.userAgent.indexOf("Firefox") >= 1) {
ventana.eval(código);
}
demás {
ejecutivoScript(código);
}
};
var Prueba = función () {
StrongEval("var i=3");
}
Prueba();
alerta(i);
guión>
De esta manera, puede ser perfectamente compatible con FF e IE. El código esencial es que eval y window.eval no son equivalentes en FF. Esto es algo muy extraño.
Además, también podemos usar eval+with para lograr algunos trucos extraños.
En un sentido general podemos escribir código como este:
Copie el código de código de la siguiente manera:
var obj = función () {
esto.a = 1;
esto.b = 2;
esto.c = 5;
this.fun = función () {
esto.c = esto.a + esto.b;
}
};
var o = nuevo objeto();
o.divertido();
alerta(oc);
O esto:
Copie el código de código de la siguiente manera:
var objeto = {
un: 1,
segundo: 2,
c: 5,
diversión: función () {
esto.c = esto.a + esto.b;
}
}
O esto:
Copie el código de código de la siguiente manera:
var obj = función () {
esto.a = 1;
esto.b = 2;
esto.c = 5;
};
obj.prototype.fun = función () {
esto.c = esto.a + esto.b;
}
var o = nuevo objeto();
o.divertido();
alerta(oc);
Pase lo que pase, ¿estás cansado de este sentimiento? Entonces adoptemos un enfoque muy diferente, para que al menos resulte más cómodo para los sentidos.
Copie el código de código de la siguiente manera:
<tipo de script="texto/javascript">
var funtemp = función () {
c = a + b;
}
var objeto = {
un: 1,
segundo: 2,
c: 5
};
diversión var;
con (obj) {
eval("diversion = " + funtemp);
}
divertido();
alerta(obj.c);
guión>
Éste es muy forzado y muy bueno. No vamos a discutir si parece cómodo o no. Analicemos tal situación.
Copie el código de código de la siguiente manera:
<guión>
varDBCommon = función () {
alerta("1."); CrearConexión();
alerta("2."); AbrirConexión();
alerta("3."); CrearComando();
alerta("4."); EjecutarComando();
alerta("5."); CerrarConexión();
}
var SQLServerCommon = {
CreateConnection: function () { alert("Establecer conexión con SQL Server" },
OpenConnection: function () { alert("Abrir conexión a SQL Server" },
CreateCommand: function () { alert("Crear comando de SQL Server" },
ExcuteCommand: function () { alert("Ejecutar comando del servidor DSQL" },
CerrarConexión: función () {alerta("Cerrar conexión de SQL Server");
};
var OráculoComún = {
CreateConnection: function () { alert("Establecer conexión Oracle" },
OpenConnection: function () { alert("Abrir una conexión Oracle" },
CreateCommand: function () { alert("Crear ¨comando Oracle" },
ExcuteCommand: function () { alert("Ejecutar comando DOracle" },
CerrarConexión: función () {alerta("¿Cerrar? Conexión Oracle");
};
con (SQLServerCommon) {
eval("forSQLServer=" + DBCommon);
}
con (OracleCommon) {
eval("forOracle=" + DBCommon);
}
paraSQLServer();
para Oracle();
guión>
¿Podemos pensar en esto como un patrón de método de plantilla simple? jeje. También podemos llamar a esto usando eval y with para cambiar el contexto de una función.
Pero, de nuevo, Eval rara vez se usa en situaciones generales y podemos evitarlo por completo.