Цитата в ответе Ника намекает на это. Это не большая разница, но ощущение, что eval
«хуже», чем new Function
. Не с точки зрения безопасности - они оба одинаково бесполезны перед лицом ненадежного ввода, но, надеюсь, ваше веб-приложение не возвращает ненадежные строки JSON - но с точки зрения странного уровня языка и, следовательно, сопротивления оптимизации.
В частности:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
дает 2
. Строка ed eval
оперировала областью локальной переменной victim
! Это то, что обычная пользовательская функция никогда не сможет сделать; eval
может сделать это только потому, что это темная магия.
Использование обычной функции вместо этого убирает этот элемент магии:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
в вышеприведенном, возвращенное a
остается 1
; новая функция может работать только со своими локальными переменными или глобальными window.a
.
Это знание позволяет инструментам анализа кода - которые могут включать механизмы JavaScript и особенно умные минификаторы - применять больше оптимизаций. Например, вторая функция victim
может иметь переменную a
, полностью оптимизированную до return 1
. Одно использование eval
и много потенциальных оптимизаций не будут выполнимы.
Конечно, на практике для такой крошечной функции, как JSON eval
er, заметной разницы не будет, но в целом мысль такова:
- по возможности избегать обоих подходов (оба они запрещены в строгом режиме пятого издания ECMAScript);
- если вам нужно его использовать,
new Function
предпочтительнее eval
, если только вам действительно не нужен код для доступа к локальным переменным вызывающей функции.