
La función eval() JavaScript estima el valor del código representado en una cadena de texto.
Estructura de la función eval()
eval(string)
string
Una cadena que representa una expresión, una expresión de código o una serie de expresiones de código en JavaScript, y la expresión también puede contener variables y propiedades de objetos preexistentes.
Valor que esta devuelve
La función eval() en javascript devolverá el valor de la última expresión cuyo valor se evaluó y, si es nulo, se devolverá el valor undefined
.
Características generales
La función eval()
es una propiedad del objeto global. Acepta un argumento que es una cadena. Si esa cadena representa una o más expresiones, la función eval()
estimará su valor. No llame a la función eval()
para estimar el valor de expresiones matemáticas, ya que JavaScript evalúa automáticamente las expresiones.
Si construye una expresión como una cadena de texto, puede usar la función eval()
para estimar su valor en un momento posterior. Por ejemplo, digamos que tiene la variable x
, puede aplazar la estimación de una expresión que incluye la variable x
asignando esa expresión a una variable (el valor de esa cadena de texto es "3 * x + 2"
) y luego llamar a la función eval()
en un punto posterior del programa.
Si el tipo de argumento pasado a la función no es eval()
una cadena, entonces la función devuelve el argumento eval()
tal como es. En el siguiente ejemplo usamos la función constructora String
, y la función devolvió el eval()
objeto en String
lugar de estimar el valor de la cadena:
eval(new String('2 + 2')); // String object containing "2 + 2" eval('2 + 2'); // 4
Puede sortear esta limitación utilizando la función toString()
:
var expression = new String('2 + 2'); eval(expression.toString());
Si usa la función eval() en javascript indirectamente, es decir, haciendo referencia a ella en lugar de eval
directamente, entonces la función eval
estimará su valor en el dominio público en lugar del dominio local a partir de ECMAScript 5.1.
Esto significa que las expresiones de declaración de función crearán funciones globales y el código que será evaluado no tendrá acceso a las variables locales en el dominio local que las llamó. Mire de cerca el siguiente ejemplo para desmitificar el ejemplo anterior:
function test() { var x = 2, y = 4; console.log(eval('x + y')); // una llamada directa que usa el dominio local y devuelve 6 var geval = eval; // Asignar una referencia de función a una variable de console.log(geval('x + y')); // Una llamada indirecta que usa el dominio público y arrojará un ReferenceError porque `x` no está definido (0, eval)('x + y'); // Otro ejemplo de llamada indirecta }
Importante no usar la función eval
innecesariamente
Una función eval()
es una función peligrosa, que ejecutará el código que se le pasa con los mismos privilegios que el programa que la llamó. Si llama a la función eval()
con una cadena cuyo valor puede ser modificado por una parte malintencionada, terminará ejecutar código malicioso en la máquina del usuario con los mismos privilegios que su sitio o extensión. Además, el código malicioso puede ver lo que hay en el área de la llamada a la función eval()
, lo que aumenta el alcance del ataque …
Tenga en cuenta que el uso de la función eval()es más lento que otras alternativas, ya que activa el intérprete de JavaScript, mientras que la mayoría de los motores JavaScript modernos pueden optimizar otros scripts. En las siguientes secciones, describiremos alternativas comunes a una función para eval()
varios usos comunes.
Propiedades del objeto
No utilice la función eval() para intentar acceder a propiedades de objetos, por ejemplo, tomemos el siguiente ejemplo en el que no sabremos el nombre de la propiedad a la que queremos acceder hasta que se ejecute el código. Vea cómo utilizar la función eval()
:
var obj = { a: 20, b: 30 }; var propName = getPropName(); // Devuelve "a" o "b" eval( 'var result = obj.' + propName );
Pero tenga en cuenta que la función eval()
no es necesaria aquí, y no se recomienda usarla aquí, pero deberíamos usar métodos para acceder a las propiedades , que son más seguros y rápidos:
var obj = { a: 20, b: 30 }; var propName = getPropName(); // Devuelve "a" o "b" var result = obj[ propName ]; // obj[ "a" ] = obj.a
Puede utilizar este método para acceder a las propiedades secundarias (que pertenecen a un objeto que pertenecen a otro objeto). Vea cómo usaremos la función eval()
aquí:
var obj = {a: {b: {c: 0}}}; var propPath = getPropPath(); // devolverá, por ejemplo, "abc" eval( 'var result = obj.' + propPath );
El uso de la función se puede evitar eval()
dividiendo la «ruta» de la propiedad y pasando las distintas propiedades:
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(); // devolverá, por ejemplo, "abc" var result = getDescendantProp(obj, propPath);
Se puede utilizar el mismo método que el anterior para establecer valores de propiedad:
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(); // devolverá, por ejemplo, "abc" var result = setDescendantProp(obj, propPath, 1); // test.a.b.c = 1
Usar funciones en lugar de estimar fragmentos de código. JavaScript tiene funciones de primera clase , lo que significa que las funciones pueden pasarse como argumentos a otras funciones, almacenarse en variables de objeto o propiedades, etc. Las API DOM están diseñadas con esto en mente, por lo que puede poner:
setTimeout(function() { ... }, 1000);
en lugar de:
setTimeout(" ... ", 1000)
o para poner:
elt.addEventListener('click', function() { ... } , false);
en lugar de:
elt.setAttribute("onclick", "...")
Convierta cadenas JSON en objetos JavaScript. Si la cadena de texto que pasó a la función eval()
contiene, por ejemplo, (matriz de datos "[1, 2, 3]"
) en lugar de software de códigos y expresiones, habilita la conversión recomendada al formato JSON, que permite el uso de la sección de cadena de texto de la estructura de JavaScript para representar datos.
Tenga en cuenta que JSON es limitado en relación con JavaScript, muchas de las cosas permitidas en JavaScript no se pueden usar en JSON, por ejemplo, no puede usar una coma al final de un objeto (coma al final) y nombres de propiedad (es decir, claves ) debe estar) entre comillas.
Ejemplos y aplicaciones en código
Hay dos expresiones en el siguiente ejemplo que usan una función eval()
que devolverá 22. La primera expresión estimará el valor de la cadena y la "x + y + 1"
segunda expresión estimará el valor de la cadena "22"
:
var x = 2 ; var y = 19 ; var z = '22' ; eval ( 'x + y + 1' ); // 22 eval ( z ); // 22
Use eval
para estimar el valor de expresiones. Usaremos la función eval()
en el siguiente ejemplo para estimar el valor de la cadena de texto str
, y esta cadena de texto contiene expresiones JavaScript que imprimen el valor de la variable z
y le asignan el valor 22
si el valor de la variable x
es igual a 5
, de lo contrario el se asignará valor 0
a la variable z
:
var x = 5; var str = "if (x == 5) {console.log('z is 22'); z = 22;} else z = 0;"; console.log('z is', eval(str)); // z is 22
Tenga en cuenta que el último valor de la cadena que se pasará a la función eval()
es el valor que se devolverá:
var x = 5; var str = "if (x == 5) {console.log('z is 22'); z = 22; x = 420; } else z = 0;"; console.log('x is', eval(str)); // z is 22 x is 420
Se devolverá el valor de la última expresión. La función eval()
devolverá el valor de la última expresión evaluada:
var str = 'if ( a ) { 1 + 1; } else { 1 + 2; }'; var a = true; var b = eval(str); // 2 console.log('b is', b); a = false; b = eval(str); // 3 console.log('b is', b);
Las expresiones para declarar funciones deben estar entre paréntesis. Al declarar funciones dentro de una cadena que se pasa a la función eval()
deben estar entre paréntesis, como en el siguiente ejemplo, en el que se devolverá el valor undefined
cuando no se utilicen paréntesis:
var fctStr1 = 'function a () {}' var fctStr2 = '(function a () {})' var fct1 = eval( fctStr1 ) // undefined var fct2 = eval( fctStr2 ) // function
Soporte de navegadores
Característica | Chrome | Firefox | IE | Ópera | Safari |
---|---|---|---|---|---|
Soporte básico | sí | sí | sí | sí | sí |
- Expresión const en JavaScript
- Expresión let en JavaScript
- Expresión var en JavaScript
- Expresión try…catch en JavaScript
- Expresión throw en JavaScript
- Continue en JavaScript
- Switch en JavaScript
- Expresiones if…else en JavaScript
- Declaración vacía o empty en JavaScript
- Break en JavaScript
- Sentencia block en JavaScript
- Arguments en JavaScript
- Promise en JavaScript
- Number en JavaScript
- Características JSON en JavaScript
- Array en JavaScript
- RegExp en JavaScript
- String en JavaScript
- Date en JavaScript
- Math en JavaScript
- URIError en JavaScript
- TypeError en JavaScript
- SyntaxError en JavaScript
- ReferenceError en JavaScript
- RangeError en JavaScript
- EvalError en JavaScript
- Características Boolean en JavaScript
- Error en JavaScript
- Función Symbol en JavaScript
- Constructor Function en JavaScript
- Constructor Object en JavaScript
- Función unescape() en JavaScript
- Función eval() en JavaScript
- Valor null en JavaScript
- Características Undefined en JavaScript
- Características NaN en JavaScript
- Características Infinity en JavaScript
- Función parseFloat() en JavaScript
- Función isNaN() en JavaScript
- Función isFinite() en JavaScript
- Función escape() en JavaScript
- Función encodeURIComponent() en JavaScript