¿Por qué es una mala idea utilizar la función de evaluación de JavaScript?

Resuelto Brian Singh asked hace 16 años • 25 respuestas

La función de evaluación es una forma potente y sencilla de generar código dinámicamente, entonces, ¿cuáles son las advertencias?

Brian Singh avatar Sep 18 '08 02:09 Brian Singh
Aceptado
  1. El uso inadecuado de eval abre su código a ataques de inyección

  2. La depuración puede ser más desafiante (sin números de línea, etc.)

  3. El código evaluado se ejecuta más lentamente (no hay oportunidad de compilar/almacenar en caché el código evaluado)

Editar: Como @Jeff Walden señala en los comentarios, el punto 3 es menos cierto hoy que en 2008. Sin embargo, si bien es posible que se almacenen en caché los scripts compilados, esto solo se limitará a los scripts que se evalúen repetidamente sin modificaciones. Un escenario más probable es que esté evaluando scripts que han sufrido ligeras modificaciones cada vez y, como tales, no se pudieron almacenar en caché. Digamos que ALGÚN código evaluado se ejecuta más lentamente.

Prestaul avatar Sep 17 '2008 19:09 Prestaul

La evaluación no siempre es mala. Hay ocasiones en las que es perfectamente apropiado.

Sin embargo, eval es actual e históricamente sobreutilizado masivamente por personas que no saben lo que están haciendo. Desafortunadamente, eso incluye a personas que escriben tutoriales de JavaScript y, en algunos casos, esto puede tener consecuencias de seguridad o, más a menudo, simples errores. Entonces, cuanto más podamos hacer para poner un signo de interrogación sobre la evaluación, mejor. Cada vez que usas eval necesitas verificar lo que estás haciendo, porque es probable que puedas hacerlo de una manera mejor, más segura y más limpia.

Para dar un ejemplo muy típico, para establecer el color de un elemento con una identificación almacenada en la variable 'patata':

eval('document.' + potato + '.style.color = "red"');

Si los autores del tipo de código anterior tuvieran una idea sobre los conceptos básicos de cómo funcionan los objetos JavaScript, se habrían dado cuenta de que se pueden usar corchetes en lugar de nombres de puntos literales, obviando la necesidad de evaluación:

document[potato].style.color = 'red';

...que es mucho más fácil de leer y tiene menos errores.

(Pero entonces, alguien que /realmente/ supiera lo que hacía diría:

document.getElementById(potato).style.color = 'red';

que es más confiable que el viejo y dudoso truco de acceder a elementos DOM directamente desde el objeto del documento).

bobince avatar Sep 17 '2008 20:09 bobince