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

eval - JavaScript | MDN

Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de 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 julio de 2015.

Resumen

La funcin eval() evala un cdigo JavaScript representado como una cadena de caracteres (string), sin referenciar a un objeto en particular.

In this article

Sintaxis

js
eval(cadena de caracteres o string)

Parmetros

cadena de caracteres (string)

Una cadena de caracteres (string) que representa una expresin, sentencia o secuencia de sentencias en JavaScript. La expresin puede incluir variables y propiedades de objetos existentes.

Valores retornados o devueltos

El valor que resulta de la evaluacin del cdigo proporcionado. Si este valor est vaco. undefined (artculo en ingls) es devuelto.

Descripcin

eval() es una propiedad de la funcin del objeto global.

El argumento de la funcin eval es una cadena de caracteres. Si la cadena de caracteres representa una expresin, eval() evala la expresin. Si el argumento representa una o ms sentencias JavaScript, eval() evala las sentencias. No se debe llamar a eval() para evaluar una expresin aritmtica; ya que JavaScript evala las expresiones aritmticas automticamente.

Si construye una expresin aritmtica como una cadena de caracteres, puede usar eval() para evaluarla ms tarde. Por ejemplo, suponga que tiene la variable x. Puede posponer la evaluacin de una expresin que involucre a x mediante la asignacin del valor de la cadena de caracteres de la expresin, asignando "3 * x + 2" a la variable, y entonces llamar a eval() posteriormente en el script.

Si el argumento de eval() no es una cadena de caracteres, eval() devuelve el argumento sin cambio. En el siguiente ejemplo, el constructor String es especificado, y eval() devuelve un objeto String en lugar de evaluar la cadena de caracteres.

eval(new String("2 + 2")); // devuelve un objeto String que contiene "2 + 2"
eval("2 + 2");             // devuelve 4

Puede trabajar sobre esta limitacin de una manera genrica utilizando toString().

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

Si utiliza la funcin eval() indirectamente, invocndola a travs de una referencia distinta de eval, a partir de ECMAScript 5, sta funciona en el mbito global en lugar de hacerlo en el mbito local; esto quiere decir, por ejemplo, que las declaraciones de funcin crean funciones globales, y que el cdigo siendo evaluado no tiene acceso a las variables locales dentro del mbito en donde est siendo llamada.

js
function test() {
  var x = 2,
    y = 4;
  console.log(eval("x + y")); // Llamada directa, utiliza el mbito local, el resultado es 6
  var geval = eval;
  console.log(geval("x + y")); // Llamada indirecta, utiliza el mbito global, atravs de ReferenceError por que `x` es indefinida
}

No utilice eval innecesariamente

eval() es una funcin peligrosa, quel ejecuta el cdigo el cual es pasado con los privilegios de quien llama. Si ejecuta eval() con una cadena de caracteres que podra ser afectada por un elemento malicioso, podra terminar ejecutando cdigo malicioso dentro de la computadora del usuario con los permisos de su pgina o extensin web . Ms importante an, una parte del cdigo de terceros podra accesar al mbito en el cual eval() fue invocada, lo que puede permitir la entrada a posibles ataques de formas a las que el constructor Function (art. en ingls) el cual es similar, no es susceptible.

eval() es generalmente tambin ms lenta que otras alternativas desde que se invoca en el intrprte de JS, mientras que otros muchos constructores son optimizados por los motores JS modernos.

Existen alternativas ms seguras (y rpidas) que eval() para casos de uso comn.

Accediendo a propiedades de los miembros

No debera utilizar eval() con el fin de convertir nombres de propiedades en propiedades. Observe el siguiente ejemplo en el cual la funcin getNombreCampo(n) devuelve el nombre del elemento del formulario especificado como una cadena. La primera sentencia asigna el valor de cadena del tercer elemento del formulario a la variable campo. La segunda sentencia utiliza eval para mostrar el valor del elemento del formulario.

var campo = getNombreCampo(3);
document.write("El campo llamado ", campo, " tiene un valor de ", eval(campo + ".value"));

Sin embargo, eval() no es necesario en este cdigo. De hecho, su uso aqu no se recomienda. En su lugar, utilice los operadores de miembro (art. en ingls), que son mucho ms rpidos y seguros:

js
var campo = getFieldName(3);
document.write("El campo llamado ", campo, " tiene un valor de ", campo[valor]);

Considere ahora este nuevo ejemplo, en donde la propiedad del objeto a ser accesado no es conocida hasta que el cdigo es ejecutado. Esto puede hacerse con eval:

js
var obj = { a: 20, b: 30 };
var nombreProp = obtenerNombreProp(); // devuelve "a" o "b"

eval("var resultado = obj." + nombreProp);

Y con el uso de los accesores de propiedades (artculo en ingls), el cual es mucho ms rpido y seguro, sera as:

js
var obj = { a: 20, b: 30 };
var nombreProp = obtenerNombreProp(); // devuelve "a" o "b"
var resultado = obj[nombreProp]; //  obj[ "a" ] es el mismo que obj.a

Puede incluso utilizar este mtodo para acceder a las propiedades de los descendientes. Utilizando eval() esto sera de la siguiente forma:

js
var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // returns e.g. "a.b.c"

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

Evitando eval(), esto podra hacerse dividiendo la ruta de propiedad y haciendo un bucle a travs de las diferentes propiedades:

js
function getDescendantProp(obj, desc) {
  var arr = desc.split(".");
  while (arr.length) {
    obj = obj[arr.shift()];
  }
  return obj;
}

var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // returns e.g. "a.b.c"
var result = getDescendantProp(obj, propPath);

Estableciendo una propiedad que funcione de modo similar:

js
function setDescendantProp(obj, desc, value) {
  var arr = desc.split(".");
  while (arr.length > 1) {
    obj = obj[arr.shift()];
  }
  obj[arr[0]] = value;
}

var obj = { a: { b: { c: 0 } } };
var propPath = getPropPath(); // returns e.g. "a.b.c"
var result = setDescendantProp(obj, propPath, 1); // test.a.b.c will now be 1

Utilice funciones en lugar de evaluar fragmentos de cdigo

JavaScript tiene funciones de primera clase(artculo en ingls), lo que quiere decir que usted puede pasar funciones como argumentos a otras APIs, almacenarlas en variables y propiedades de objetos, etc. Muchas APIs de DOM estn diseadas con esto en mente, o sea que usted puede (y debera) escribir:

js
// instead of setTimeout(" ... ", 1000) use:
setTimeout(function() { ... }, 1000);

// instead of elt.setAttribute("onclick", "...") use:
elt.addEventListener("click", function() { ... } , false);

Las clausuras o cierres(art. en ingls) son muy tiles como forma de crear funciones parametrizadas sin la concatenacin de cadenas de caracteres o strings.

Analizando JSON (convirtiendo cadenas de caracteres (strings) hacia objetos de JavaScript)

Si la cadena de caracteres que usted esta llamando eval() contiene datos (por ejemplo, un array: "[1, 2, 3]"), en contraposicin al cdigo, debera considerar un cambio a JSON (art. en ingls), el cual permite a la cadena de caracteres utilizar un subconjunto de sintaxis de JavaScript para representar los datos. Vea tambin Descargando JSON y JavaScript en extensiones (art. en ingls).

Observe, que ya que la sintaxis de JSON es limitada en comparacin con la sintaxis de JavaScript, muchas literales vlidas de JavaScript no sern analizadas como JSON. Por ejemplo, seguir comas no est permitido en JSON, y los nombres de propiedades (keys) en literales de objeto deben ser entrecomilladas. Asegrese de utilizar un serializados de JSON para generar cadenas de caracteres que posteriormente sean analizadas como JSON.

Pasar datos en lugar de cdigo

Por ejemplo, una extensin diseada para arrastar contenido de pginas web podra tener reglas de arrastre definidas en XPath (art. en ingls) en lugar de cdigo JavaScript.

Ejecutar cdigo sin privilegos limitados

Si usted debe ejecutar cdigo, considere ejecutarlo con privilegios reducidos. Este consejo aplica principalmente para las extensiones y las aplicaciones XUL, para lo cual puede utilizar Components.utils.evalInSandbox (art. en ingls).

Ejemplos

Los siguientes ejemplos muestran el resultado usando document.write. En JavaScript del lado servidor, puede mostrar el mismo resultado llamando a la funcin write en vez de document.write.

Utlizando eval

En el siguiente cdigo, las dos sentencias que contienen eval devuelven 42. La primera evala la cadena "x + y + 1"; la segunda evala la cadena "42".

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

Utilizando eval para evaluar una cadena de caracteres (string) como sentencias de JavaScript

El siguiente ejemplo utiliza eval para evaluar una cadena de caracteres str. Esta cadena consiste de sentencias de JavaScript que abren un dilogo Alert y asignan a z un valor de 42 si x es cinco, y asigna 0 a z en caso contrario. Cuando se ejecuta la segunda sentencia, eval ocasionar que estas sentencias sean ejecutadas, y tambin evaluar el conjunto de sentencias y devolver que el valor es asignado a z.

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

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

La ltima expresin es evaluada

eval() devuelve el valor de la ltima expresin evaluada

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

console.log("b is : " + b);

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

console.log("b is : " + b);

eval como una cadena de caracteres (string) definiendo funciones requiere "(" y ")" como prefijo y sufijo

js
var fctStr1 = "function a() {}";
var fctStr2 = "(function a() {})";
var fct1 = eval(fctStr1); // devuelve undefined
var fct2 = eval(fctStr2); // deuelve una funcin

Especificaciones

Specification
ECMAScript 2027 LanguageSpecification
# sec-eval-x

Compatibilidad con navegadores

Vea Tambin


Web Proxy Viewer  |  New URL  |  Original Page