Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

eval()

Esta tradução está incompleta. Ajude atraduzir este artigo.

Resumo

O método eval() avalia código JavaScript representado como uma string.

Sintaxe

eval(string)

Parâmetros

string
Uma seqüência de caracteres que representa uma expressão JavaScript, declaração, ou sequência de declarações. A expressão pode incluir variáveis e propriedades de objetos existentes.

Descrição

eval() é uma propriedade função do objeto global (window).

O argumento da função eval() é uma string. Se a string representa uma expressão, eval() avalia a expressão. Se o argumento representa uma ou mais declarações de JavaScript, eval() avalia as declarações. Não chame o eval() para avaliar uma expressão aritmética; JavaScript avalia expressões aritméticas automaticamente.

Se você construir uma expressão aritmética como uma string, você pode usar eval() para avaliá-lo em um momento posterior. Por exemplo, suponha que você tenha uma variável x. Você pode adiar a avaliação de uma expressão envolvendo x atribuindo o valor de string da expressão, dizer "3 * x + 2", a uma variável, e, em seguida, chamando eval() em um ponto posterior no seu script.

Se o argumento de eval() não é 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.

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

Você pode contornar esta limitação de forma genéria usando toString().

var expression = new String("2 + 2");
eval(expression.toString());

Você não pode indiretamente usar a função eval invocando-a através de um nome diferente de eval(); se o fizer, poderá ocorrer um erro de execução. Por exemplo, você não deve usar o seguinte código:

var x = 2;
var y = 4;
var myEval = eval;
myEval("x + y");

Não use eval desnecessariamente!

eval() é uma função perigosa, que executa o código passado com os privilégios do caller. Se você executar o eval() com uma sequência de caracteres que podem ser afetados por uma pessoa maliciosa, você pode acabar executando código malicioso na máquina do usuário com as permissões da sua página/extensão. Mais importante ainda, o código de terceiros pode ver o escopo em que eval() foi chamado, o que pode levar a possíveis ataques como  Function não é susceptível.

eval() é geralmente mais lento do que as alternativas, uma vez que tem de invocar o interpretador JS, enquanto muitas outras construções são otimizado por mecanismos de JS modernos.

Existem alternativas mais seguradas (e rápidas) ao eval() para usos comuns.

Acessando propriedades dos membros

Você não deve utilizar eval() para converter nomes de propriedades em propriedades. Considere o seguinte exemplo onde as propriedades do objeto a ser acessado não são conhecidas até o código ser executado. Isso pode ser feito com eval:

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

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

No entanto, eval() não é necessário aqui. De fato, sua utilização não é recomendada. Ao invés disso, utilize os operadores de acesso, que são mais rápidos e seguros:

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

Utilize funções ao invés de avaliar snippets de código

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

// ao invés de setTimeout(" ... ", 1000) use:
setTimeout(function() { ... }, 1000); 

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

Closures são úteis como forma de criar funcções parametrizáveis sem concatenar strings.

Analisando JSON (convertendo string para objetos JavaScript)

If the string you're calling eval() on contains data (for example, an array: "[1, 2, 3]"), as opposed to code, you should consider switching to JSON, which allows the string to use a subset of JavaScript syntax to represent data. See also Downloading JSON and JavaScript in extensions.

Note that since JSON syntax is limited compared to JavaScript syntax, many valid JavaScript literals will not parse as JSON. For example, trailing commas are not allowed in JSON, and property names (keys) in object literals must be enclosed in quotes. Be sure to use a JSON serializer to generate strings that will be later parsed as JSON.

Pass data instead of code

For example, an extension designed to scrape contents of web-pages could have the scraping rules defined in XPath instead of JavaScript code.

Run code with limited privileges

If must run code, consider running it with reduced privileges. This advice applies mainly to extensions and XUL applications, which can use Components.utils.evalInSandbox for this.

Examples

The following examples display output using document.write. In server-side JavaScript, you can display the same output by calling the write() function instead of using document.write().

Example: Using eval

In the following code, both of the statements containing eval() return 42. The first evaluates the string "x + y + 1"; the second evaluates the string "42".

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

Example: Using eval to evaluate a string of JavaScript statements

The following example uses eval() to evaluate the string str. This string consists of JavaScript statements that open an alert dialog box and assign z a value of 42 if x is five, and assigns 0 to z otherwise. When the second statement is executed, eval() will cause these statements to be performed, and it will also evaluate the set of statements and return the value that is assigned to z.

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

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

Example: Last expression is evaluated

eval() returns the value of the last expression evaluated.

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);

Example: eval a string defining function required "(" and ")" as prefix and suffix

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

 

Especificações

Especificação Status Comentário
ECMAScript 1st Edition. Standard Definição inicial
ECMAScript 5.1 (ECMA-262)
The definition of 'eval' in that specification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'eval' in that specification.
Standard  

Compatibilidade de navegador

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Gecko-specific notes

  • Historically eval() had an optional second argument, specifying an object in whose context the evaluation was to be performed. This argument was non-standard, and was removed from SpiderMonkey in Gecko 1.9.1 (Firefox 3.5). See bug 442333.

Veja também

Etiquetas do documento e colaboradores

 Colaboradores desta página: michaelycus, dayvsonlima
 Última atualização por: michaelycus,