[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/eval [Back]  [Original]

eval() - JavaScript | MDN

Esta pgina foi traduzida do ingls pela comunidade. Saiba mais e junte-se comunidade MDN Web Docs.

View in English Always switch to English

eval()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since julho de 2015.

Resumo

A funo eval() computa um cdigo JavaScript representado como uma string.

In this article

Sintaxe

js
eval(string);

Parmetros

string

Uma sequncia de caracteres que representa uma expresso JavaScript, declarao, ou sequncia de declaraes. A expresso pode incluir variveis e propriedades de objetos existentes.

Retorno

o valor computado do cdigo passado para a funo. Se o valor estiver vazio, retornar undefined.

Descrio

eval() uma funo de propriedade do objeto global (window).

O argumento da funo eval() uma string. Se a string representa uma expresso, eval() avalia a expresso. Se o argumento representa uma ou mais declaraes em JavaScript, eval() avalia as declaraes. No chame o eval() para avaliar uma expresso aritmtica; JavaScript avalia expresses aritmticas automaticamente.

Se voc construir uma expresso aritmtica como uma string, voc pode usar eval() para calcular o resultado depois. Por exemplo, suponha que voc tenha uma varivel x. Voc pode adiar a avaliao de uma expresso envolvendo x atribuindo o valor de string da expresso, dizer "3 * x + 2", a uma varivel, e, em seguida, chamando eval() em um ponto posterior no seu script.

Se o argumento de eval() no uma string, eval() retorna o argumento inalterado. No exemplo a seguir, o construtor String especificado, e eval() retorna um objeto String em vez de avaliar a string.

js
eval(new String("2 + 2")); // retorna um objeto String contendo "2 + 2"
eval("2 + 2"); // retorna 4

Voc pode contornar esta limitao de forma genrica usando toString().

js
var expression = new String("2 + 2");
eval(expression.toString()); // retorna 4

Se voc usar a funo eval indiretamente, invocando-a por outra referncia alm de eval, a partir do ECMAScript 5 funciona no escopo global ao invs do escopo local. Significa que, por exemplo, aquelas declaraes de funes criam funes globais e que o cdigo que est sendo avaliado no tem acesso s variveis locais dentro do escopo onde est sendo chamada.

js
function test() {
  var x = 2,
    y = 4;
  console.log(eval("x + y")); // Chamada direta, usa o escopo local, resulta em 6
  var geval = eval; // equivalente a chamar eval no escopo global
  console.log(geval("x + y")); // Chamada indireta, usa o escopo global, lana uma exceo ReferenceError porque `x` no foi declarado
  (0, eval)("x + y"); // outro exemplo de chamada indireta
}

Nunca use eval!

eval() uma funo perigosa, que executa o cdigo passado com os privilgios do caller. Se voc executar o eval() com uma sequncia de caracteres que podem ser afetados por uma parte maliciosa, voc pode acabar executando cdigo malicioso na mquina do usurio com as permisses da sua pgina/extenso. Mais importante ainda, o cdigo de terceiros pode ver o escopo em que eval() foi chamado, o que pode levar a possveis ataques como Function no suscetvel.

eval() geralmente mais lento do que as alternativas, uma vez que tem de invocar o interpretador JS, enquanto muitos outros construtores so otimizados por engines de JS modernos.

Os interpretadores modernos convertem javascript em cdigo de mquina. Resumindo, o nome das variveis ser desmanchado. Portanto, o uso de eval forar o navegador a fazer buscas caras para descobrir o endereo e seu valor no cdigo de mquina. Alm disso, novos valores podem ser introduzidos em eval como mudanas no tipo da varivel, fazendo o navegador recalcular todo o cdigo de mquina gerado anteriormente. Felizmente, existem alternativas mais seguras (e rpidas) ao eval() para usos comuns.

Acessando propriedades dos membros

Voc no deve utilizar eval() para converter nomes de propriedades em propriedades. Considere o seguinte exemplo onde as propriedades do objeto a ser acessado no so conhecidas at o cdigo ser executado. Isso pode ser feito com eval:

js
var obj = { a: 20, b: 30 };
var propname = getPropName(); //retorna "a" ou "b"

eval("var result = obj." + propname);

No entanto, eval() no necessrio aqui. De fato, sua utilizao no recomendada. Ao invs disso, utilize os operadores de acesso, que so mais rpidos e seguros:

js
var obj = { a: 20, b: 30 };
var propname = getPropName(); //retorna "a" ou "b"
var result = obj[propname]; //  obj[ "a" ]  o mesmo como obj.a

Utilize funes ao invs de avaliar snippets de cdigo

JavaScript possui first-class functions, o que significa que voc pode passar os argumentos para outras APIs, armazen-los em variveis e propriedades de objeto, e assim por diante. Muitas APIs de DOM foram desenvolvidas com isso em mente, ento voc pode (e deve) escrever:

js
// ao invs de setTimeout(" ... ", 1000) use:
setTimeout(function() { ... }, 1000);

// ao invs de elt.setAttribute("onclick", "...") use:
elt.addEventListener("click", function() { ... } , false);

Closures so teis como forma de criar funces parametrizveis sem concatenar strings.

Analisando JSON (convertendo string para objetos JavaScript)

Se a string para a qual voc est chamando o eval() contm dados (por exemplo, um array: "[1, 2, 3]"), ao invs de cdigo, voc deve considerar mudar para JSON, que permite a string usar um subconjunto de sintaxe Javascript para representar dados. Veja tambm Downloading JSON and JavaScript in extensions.

Perceba que como a sintaxe JSON limitada comparada com a sintaxe JavaScript, muitos literais JavaScript vlidos no sero analisados como JSON. Por exemplo, trailing commas no so permitidas em JSON, e nomes de propriedades (keys) em literais de objetos devem ser colocados entre aspas. Certifique-se de usar um serializados JSON para gerar strings que sero analisadas como JSON mais tarde.

Passar dados em vez de cdigos

Por exemplo, uma extenso concebida para raspar contedos de pginas web pode ter as regras de raspagem definidas no XPath em vez de cdigo JavaScript.

Rodando o cdigo com privilgios limitados

Se voc precisa executar o cdigo, considere execut-lo com privilgios limitados. Esse conselho se aplica principalmente para extenses e aplicaes XUL, que podem usar Components.utils.evalInSandbox para obter o resultado.

Exemplos

Os exemplos a seguir mostram o retorno do document.write. No JavaScript rodando no server-side, voc pode obter o mesmo resultado chamando o mtodo write()ao invs de usar o document.write().

Exemplo: Usando eval

No cdigo a seguir, ambas as declaraes contendo eval() retornam 42. A primeira avalia a string "x + y + 1"; a segunda avalia a string "42".

js
var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // returns 42
eval(z); // returns 42

Exemplo: Using eval to evaluate a string of JavaScript statements

O exemplo a seguir usa eval() para avaliar a string str. Essa string consiste de instrues JavaScript que abrem uma caixa de dilogo de alerta e atribuem ao z o valor de 42 se x for cinco, e do contrrio, atribui 0 a z. Quando a segunda instruo executada, eval() far com que essas instrues sejam executadas e tambm ir avaliar o conjunto de instrues e retornar o valor atribudo a z.

js
var x = 5;
var str = "if (x == 5) {alert('z is 42'); z = 42;} else z = 0; ";

document.write("<P>z is ", eval(str));

Exemplo: A ltima expresso avaliada

eval() retorna o valor da ltima expresso avaliada.

js
var str = "if ( a ) { 1+1; } else { 1+2; }";
var a = true;
var b = eval(str); // returns 2

alert("b is : " + b);

a = false;
b = eval(str); // returns 3

alert("b is : " + b);

Exemplo: avaliar uma string definindo a funo necessria "(" and ")" como prefixo e sufixo

js
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // return undefined
var fct2 = eval(fctStr2); // return a function

Especificaes

Specification
ECMAScript 2027 LanguageSpecification
# sec-eval-x

Compatibilidade com navegadores

Veja tambm


Web Proxy Viewer  |  New URL  |  Original Page