Movatterモバイル変換


[0]ホーム

URL:


  1. Tecnologia Web para desenvolvedores
  2. JavaScript
  3. Referência JavaScript
  4. Objetos Globais
  5. eval()

Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.

View in EnglishAlways switch to English

eval()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨julho de 2015⁩.

Resumo

A funçãoeval() computa um código JavaScript representado como uma string.

Sintaxe

js
eval(string);

Parâmetros

string

Uma sequê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.

Retorno

É o valor computado do código passado para a função. Se o valor estiver vazio, retornaráundefined.

Descrição

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

O argumento da funçãoeval() é uma string. Se a string representa uma expressão,eval() avalia a expressão. Se o argumento representa uma ou mais declarações em JavaScript,eval() avalia as declarações. Não chame oeval() 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 usareval() para calcular o resultado depois. 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, chamandoeval() em um ponto posterior no seu script.

Se o argumento deeval() não é uma string,eval() retorna o argumento inalterado. No exemplo a seguir, o construtorString é especificado, eeval() retorna um objetoString 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 limitação de forma genérica usandotoString().

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

Se você usar a funçãoevalindiretamente, invocando-a por outra referência além deeval,a partir do ECMAScript 5 funciona no escopo global ao invés do escopo local. Significa que, por exemplo, aquelas declarações de funções criam funções globais e que o código que está sendo avaliado não tem acesso às variáveis 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, lança uma exceção ReferenceError porque `x` não foi declarado  (0, eval)("x + y"); // outro exemplo de chamada indireta}

Nunca useeval!

eval() é uma função perigosa, que executa o código passado com os privilégios do caller. Se você executar oeval() com uma sequência de caracteres que podem ser afetados por uma parte 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 queeval() foi chamado, o que pode levar a possíveis ataques comoFunction não é suscetível.

eval() é geralmente mais lento do que as alternativas, uma vez que tem de invocar o interpretador JS, enquanto muitos outros construtores são otimizados porengines de JS modernos.

Os interpretadores modernos convertem javascript em código de máquina. Resumindo, o nome das variáveis será desmanchado. Portanto, o uso deeval forçará o navegador a fazer buscas caras para descobrir o endereço e seu valor no código de máquina. Além disso, novos valores podem ser introduzidos emeval como mudanças no tipo da variável, fazendo o navegador recalcular todo o código de máquina gerado anteriormente. Felizmente, existem alternativas mais seguras (e rápidas) aoeval() para usos comuns.

Acessando propriedades dos membros

Você não deve utilizareval() 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:

js
var obj = { a: 20, b: 30 };var propname = getPropName(); //retorna "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 osoperadores de acesso, que são mais rápidos 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 funções ao invés de avaliar snippets de código

JavaScript possuifirst-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:

js
// 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)

Se a string para a qual você está chamando oeval() contém dados (por exemplo, um array:"[1, 2, 3]"), ao invés de código, você deve considerar mudar paraJSON, que permite a string usar um subconjunto de sintaxe Javascript para representar dados. Veja tambémDownloading JSON and JavaScript in extensions.

Perceba que como a sintaxe JSON é limitada comparada com a sintaxe JavaScript, muitos literais JavaScript válidos não serão analisados como JSON. Por exemplo, trailing commas não são 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 serão analisadas como JSON mais tarde.

Passar dados em vez de códigos

Por exemplo, uma extensão concebida para raspar conteúdos de páginas web pode ter as regras de raspagem definidas noXPath em vez de código JavaScript.

Rodando o código com privilégios limitados

Se você precisa executar o código, considere executá-lo com privilégios limitados. Esse conselho se aplica principalmente para extensões e aplicações XUL, que podem usarComponents.utils.evalInSandbox para obter o resultado.

Exemplos

Os exemplos a seguir mostram o retorno dodocument.write. No JavaScript rodando no server-side, você pode obter o mesmo resultado chamando o métodowrite()ao invés de usar odocument.write().

Exemplo: Usandoeval

No código a seguir, ambas as declarações contendoeval() 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 42eval(z); // returns 42

Exemplo: Usingeval to evaluate a string of JavaScript statements

O exemplo a seguir usaeval() para avaliar a stringstr. Essa string consiste de instruções JavaScript que abrem uma caixa de diálogo de alerta e atribuem aoz o valor de 42 sex for cinco, e do contrário, atribui 0 az. Quando a segunda instrução é executada,eval() fará com que essas instruções sejam executadas e também irá avaliar o conjunto de instruções e retornará o valor atribuído 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 expressão é avaliada

eval() retorna o valor da última expressão avaliada.

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

Exemplo: avaliar uma string definindo a função necessária "(" and ")" como prefixo e sufixo

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

Especificações

Specification
ECMAScript® 2026 Language Specification
# sec-eval-x

Compatibilidade com navegadores

Veja também

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp