jQuery使用(new Function(“return”+ data))(); 而不是eval(数据); 解析JSON,为什么?
此链接向您显示jQuery使用(new Function("return " + data))();
对于旧版浏览器,要解析JSON字符串而不是eval()
。
这有什么好处? 如果JSON字符串不安全怎么办?
尼克答案中的引用暗示了这一点。 这并不是一个很大的区别,但感觉eval
比new Function
“更糟糕”。 不是在安全性方面 – 面对不受信任的输入,它们同样无用,但希望你的webapp不会返回不受信任的JSON字符串 – 但是在语言级别的怪异方面,因此对优化的抵制。
特别:
function victim() { var a= 1; eval('a= 2'); return a; }
给出2
。 eval
ed字符串已经在victim
的局部变量范围内运行! 这是常规用户编写的function永远不会做的事情; eval
只能这样做,因为它是黑魔法。
使用常规函数取而代之的是魔法元素:
function victim() { var a= 1; (new Function('a= 2;'))(); return a; }
在上面,返回a
遗骸仍为1
; 新函数只能在自己的局部变量或全局window.a
。
这些知识允许代码分析工具(可能包括JavaScript引擎,特别是聪明的minifiers)应用更多优化。 例如,第二个victim
函数可以将变量完全优化掉以return 1
。 使用eval
和许多潜在的优化是不可行的。
当然,在像JSON eval
er这样的小function的实践中,没有明显的区别,但总的来说,思路是:
- 尽可能避免两种方法(在ECMAScript第五版的严格模式中都不允许使用它们);
- 如果你必须使用一个,
new Function
优于eval
,除非你真的需要代码来访问调用函数的局部变量。
至于为什么jQuery专门使用new Function()
, John Resig在jQuery论坛上回答了这个问题
使用eval会导致代码缩小器出现各种问题,因为不清楚eval中可能执行的是什么。 查看该运行的最后结果,看起来新函数与eval相当,有时甚至略快。 唯一的例外是Safari 4 – 但这些结果已过时,Safari 4附带了我们使用的原生JSON.parse实现。
eval
function非常快。 但是,它可以编译和执行任何JavaScript程序 ,因此可能存在安全问题。 当源是可信的并且胜任时,指示使用eval
。 使用JSON解析器更安全 。 在基于XMLHttpRequest的Web应用程序中,只允许与提供该页面的同一源进行通信,因此它是可信的。 但它可能没有能力 。 如果服务器的JSON编码不严谨,或者它没有严格validation其所有输入,那么它可能会传送可能带有危险脚本的无效JSON文本。 eval函数将执行脚本,释放其恶意。
你到底对什么是安全的 ? 至少恶意代码不会被执行;)
另请参阅: 用于解析JSON的JavaScript eval()的替代方法
另一点可能是, new Function()
被认为比eval
快一点。
更新:
您基本上可以在jQuery的.parseJSON()
函数的注释中阅读相同的参数。