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