Usando eval para ejecutar una cadena de código en JavaScript
La función eval
en JavaScript permite ejecutar código contenido en una cadena de texto.
La sintaxis básica es:
let resultado = eval(codigo);
Por ejemplo:
let codigo = 'alert("Hola")';
eval(codigo); // Muestra una alerta con el mensaje "Hola"
El código dentro de la cadena puede ser extenso, incluir saltos de línea, declaraciones de funciones, variables, etc.
El resultado de eval
es el resultado de la última expresión evaluada.
Por ejemplo:
let valor = eval('1 + 1');
alert(valor); // Muestra 2
let valor = eval('let i = 0; ++i');
alert(valor); // Muestra 1
El código evaluado se ejecuta en el entorno léxico actual, por lo que puede acceder a las variables externas:
let a = 1;
function f() {
let a = 2;
eval('alert(a)'); // Muestra 2
}
f();
También puede modificar variables externas:
let x = 5;
eval("x = 10");
alert(x); // Muestra 10, valor modificado
En modo estricto, eval
tiene su propio entorno léxico. Las funciones y variables declaradas dentro de eval
no son accesibles fuera de su ámbito:
'use strict';
eval("let x = 5; function f() {}");
alert(typeof x); // undefined, la variable no existe fuera del eval
// La función f tampoco es accesible
Sin use strict
, eval
comparte el entorno léxico con el código que lo rodea, por lo que las variables y funciones declaradas dentro de eval
pueden ser accesibles fuera de él.
Uso de eval
En la programación moderna, eval
se usa muy raramente. Se suele decir que «eval es malvado» debido a los riesgos de seguridad y mantenibilidad que introduce.
Hace mucho tiempo, JavaScript era un lenguaje mucho más limitado y muchas cosas solo se podían lograr con eval
. Sin embargo, esas limitaciones se superaron hace más de una década.
Hoy en día, casi no hay razones para usar eval
. Si alguien lo está utilizando, probablemente pueda reemplazarse con una construcción más moderna del lenguaje o un módulo de JavaScript.
Ten en cuenta que la capacidad de eval
para acceder a variables externas puede tener efectos secundarios no deseados.
Los minimizadores de código (herramientas que comprimen el código JavaScript para su producción) renombran las variables locales para hacer el código más pequeño. Esto normalmente es seguro, pero no si se usa eval
porque las variables locales pueden ser accedidas desde el código evaluado. Por lo tanto, los minimizadores evitan renombrar variables que podrían ser visibles para eval
, lo que afecta negativamente la tasa de compresión.
El uso de variables locales dentro de eval
también se considera una mala práctica de programación, ya que dificulta el mantenimiento del código.
Hay dos maneras de evitar estos problemas:
Si el código evaluado no necesita acceder a variables externas, usa
window.eval(...)
:De esta manera, el código se ejecuta en el contexto global:
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // Muestra 1, la variable global
}
Si el código evaluado necesita variables locales, usa new Function
y pásalas como argumentos:
let f = new Function('a', 'alert(a)');
f(5); // Muestra 5
La construcción
new Function
crea una función desde una cadena de texto en el contexto global, por lo que no puede acceder a las variables locales. Es más claro pasar las variables necesarias como argumentos, como en el ejemplo anterior.
Resumen
- Una llamada a
eval(codigo)
ejecuta el código en la cadena de texto y devuelve el resultado de la última expresión evaluada. eval
se usa raramente en JavaScript moderno y generalmente no es necesario.- Puede acceder y modificar variables locales externas, lo que se considera una mala práctica.
- Para evaluar código en el contexto global, usa
window.eval(codigo)
. - Si el código necesita datos del contexto externo, usa
new Function
y pásalos como argumentos.