La cita en la respuesta de Nick lo insinúa. No es realmente una gran diferencia, pero la sensación es que eval
es 'peor' que new Function
. No en términos de seguridad, ambos son igualmente inútiles frente a los datos que no son de confianza, pero con suerte su webapp no está devolviendo cadenas JSON que no son de confianza, sino en términos de rareza a nivel de lenguaje y, por lo tanto, resistencia a la optimización.
Específicamente:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
da 2
.¡La cadena ed eval
ha operado en el alcance de variable local de victim
! Esto es algo que una función común escrita por el usuario nunca podría hacer; eval
solo puede hacerlo porque es magia oscura.
Utilizando una función regular en vez quita este elemento de la magia:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
en lo anterior, el a
regresado queda 1
; la nueva Función solo puede operar en sus propias variables locales o en el window.a
global.
Ese conocimiento permite que las herramientas de análisis de código, que pueden incluir motores de JavaScript y particularmente minificadores inteligentes, apliquen más optimizaciones. Por ejemplo, la segunda función victim
podría tener la variable a
completamente optimizada a return 1
. Un uso de eval
y muchas optimizaciones potenciales no serán factibles.
Por supuesto, en la práctica por una pequeña función como un er JSON eval
, no va a haber una diferencia notable, pero en general el pensamiento es:
- evitar ambos enfoques siempre que sea posible (que ambos no están permitidos en el modo estricto de ECMAScript Fifth Edition);
- si tiene que usar uno,
new Function
es preferible a eval
, a menos que realmente necesite el código para acceder a las variables locales de la función de llamada.
mal es tan eval hace – Anurag