A função de eval é na verdade muito simples. É passar uma string para o interpretador JS, e o interpretador Javascript irá interpretar a string em código Javascript e executá-la.
Veja o exemplo mais simples:
Copie o código do código da seguinte forma:
<script type="texto/javascript">
eval("alerta(1+1)");
roteiro>
É muito simples, interprete a string no código JS e execute-a, e 2 aparecerá.
Claro, o exemplo acima é apenas um brinquedo e ninguém seria estúpido o suficiente para usá-lo na prática. Acho que a maneira mais básica de usar a função eval é no DOM. Por exemplo, se tivermos div1, div2 e div3, não há como obter nosso ID ao usar document.getElementByID. use-o em um loop for. Use eval para unir esse programa. Por exemplo:
Copie o código do código da seguinte forma:
<script type="texto/javascript">
for (var loop = 1; loop < 10; loop++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
roteiro>
Depois de falar sobre o uso mais básico, acredito que todos ainda estão interessados nesta função. Se esta função tivesse apenas alguns usos, seria muito chato. Então vamos dar uma olhada na função eval() pouco a pouco.
Vamos começar com o escopo de eval e dar uma olhada nesta função:
Copie o código do código da seguinte forma:
<script type="texto/javascript">
avaliação("var i=3");
alerta(eu);
roteiro>
O código é muito simples e o resultado pode aparecer 3. A seguir, compare este código:
Copie o código do código da seguinte forma:
<script type="texto/javascript">
var teste = função () {
avaliação("var i=3");
alerta(eu);
}
teste();
alerta(eu);
roteiro>
O resultado é que 3 aparece primeiro e depois indefinido.
Então explique: o código executado dinamicamente pela função eval() não cria um novo escopo, e seu código é executado no escopo atual. Em outras palavras, a função eval() também pode usar este argumento e outros objetos no escopo atual.
No IE, uma função muito semelhante a eval() é suportada chamada: execScript(). Podemos escrever um código simples.
Copie o código do código da seguinte forma:
<script type="texto/javascript">
var teste = função () {
execScript("var i=3");
alerta(eu);
}
teste();
alerta(eu);
roteiro>
Como resultado, dois 3 apareceram. Isso também mostra as características da função execScript. Em primeiro lugar, é semelhante a eval. Ele pode interpretar strings em código JS e executá-lo, mas seu escopo não é o escopo atual. o escopo global. Quando colocamos o código acima no Firefox e no Google Chrome e o testamos: descobrimos que o código no execScript é inválido no Firefox, o que também ilustra um problema com a compatibilidade do navegador do código execScript.
Surge então a questão: como podemos reunir as “vantagens” destas duas funções, ou seja, compatibilidade global + navegador. Eu pesquisei on-line e resumi sozinho, que provavelmente é assim:
Copie o código do código da seguinte forma:
<script type="texto/javascript">
var StrongEval = função (código) {
if (window.navigator.userAgent.indexOf("MSIE") >= 1) {
execScript(código);
}
if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
janela.eval(código);
}
outro {
execScript(código);
}
};
var Teste = função () {
StrongEval("var i=3");
}
Teste();
alerta(eu);
roteiro>
Isso o torna perfeitamente compatível com FF e IE. O código essencial é que eval e window.eval não são equivalentes em FF.
Além disso, também podemos usar eval+with para realizar alguns truques estranhos.
De um modo geral, podemos escrever código como este:
Copie o código do código da seguinte forma:
varobj=função(){
isto.a = 1;
isto.b = 2;
isto.c = 5;
isto.fun=função(){
isto.c = isto.a + isto.b;
}
};
var o = new obj();
o.diversão();
alerta(oc);
Ou isto:
Copie o código do código da seguinte forma:
varobj = {
um: 1,
b: 2,
c: 5,
diversão: função () {
isto.c = isto.a + isto.b;
}
}
Ou isto:
Copie o código do código da seguinte forma:
varobj=função(){
isto.a = 1;
isto.b = 2;
isto.c = 5;
};
obj.prototype.fun=função(){
isto.c = isto.a + isto.b;
}
var o = new obj();
o.diversão();
alerta(oc);
Não importa o que aconteça, você está cansado desse sentimento? Então tomemos uma abordagem muito diferente, para que pelo menos seja um pouco mais confortável para os sentidos.
Copie o código do código da seguinte forma:
<script type="texto/javascript">
var funtemp=função(){
c = a + b;
}
varobj = {
um: 1,
b: 2,
c: 5
};
muito divertido;
com (obj) {
eval("diversão = " + funtemp);
}
diversão();
alerta(obj.c);
roteiro>
Este é muito forçado e tão bom que não vamos discutir se parece confortável ou não. Vamos discutir tal situação.
Copie o código do código da seguinte forma:
<roteiro>
varDBCommon=função(){
alerta("1.");
alerta("2.");
alerta("3.");
alerta("4.");
alerta("5."); CloseConnection();
}
var SQLServerCommon = {
CreateConnection: function () { alert("Estabelecer conexão com o SQL Server");
OpenConnection: function () { alert("Abrir conexão do SQL Server");
CreateCommand: function () { alert("Criar comando SQL Server" });
ExcuteCommand: function () { alert("Executar comando do servidor DSQL");
CloseConnection: function () { alert("Fechar conexão do SQL Server");
};
var OracleCommon = {
CreateConnection: function () { alert("Estabelecer conexão ¢Oracle" });
OpenConnection: function () { alert("Abrir conexão aOracle" });
CreateCommand: function () { alert("Criar ¨comando Oracle" });
ExcuteCommand: function () { alert("Executar comando DOracle" });
CloseConnection: function () { alert("Fechar?Conexão Oracle" });
};
com (SQLServerCommon) {
eval("forSQLServer=" + DBCommon);
}
com (OracleCommon) {
eval("forOracle=" + DBCommon);
}
forSQLServer();
forOracle();
roteiro>
Podemos pensar nisso como um padrão de método de modelo simples? hehe. Também podemos chamar isso usando eval e with para alterar o contexto da função.
Mas, novamente, Eval raramente é usado em situações gerais e podemos evitá-lo completamente.