尼克答案中的引言暗示了这一点。并没有太大的区别,但是感觉是
eval比还要“差”
new Function。不是安全性方面的-
面对不受信任的输入,它们都同样无用,但是希望您的Web应用程序不会返回不受信任的JSON字符串-而是基于语言级别的怪异,从而阻止了优化。
特别:
function victim() { var a= 1; eval('a= 2'); return a;}给
2。该
eval编辑字符串已在运行
victim的局部变量的范围内!这是常规的用户编写函数永远无法完成的;
eval只能这样做,因为它是黑魔法。
相反,使用常规函数可以消除此魔术元素:
function victim() { var a= 1; (new Function('a= 2;'))(); return a;}在上面,返回的
a遗骸
1;新函数只能对自己的局部变量或全局变量进行操作
window.a。
有了这些知识,代码分析工具(可能包括Javascript引擎,尤其是聪明的缩小器)可以进行更多优化。例如,第二个
victim函数可以将
a变量完全优化为
return1。一种用途
eval和许多潜在的优化措施将不可行。
当然在实践中,对于像JSONer这样的小功能
eval,不会有明显的区别,但是总的来说,思路是:
- 尽可能避免使用两种方法(ECMAscript Fifth Edition的严格模式均禁止使用这两种方法);
- 除非您确实需要代码来访问调用函数的局部变量,否则
new Function
最好使用,而eval
不是。



