Luc*_*eis 17 javascript jquery json
此链接向您显示jQuery (new Function("return " + data))();用于旧版浏览器,以解析JSON字符串而不是eval().
这有什么好处?如果JSON字符串不安全怎么办?
bob*_*nce 32
尼克答案中的引用暗示了这一点.这并不是一个很大的区别,但感觉eval比'更糟糕' new Function.不是在安全性方面 - 面对不受信任的输入它们同样无用,但希望你的webapp不会返回不受信任的JSON字符串 - 但是在语言级别的怪异方面,因此对优化的抵制.
特别:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
Run Code Online (Sandbox Code Playgroud)
给2.该eval编辑字符串已手术victim的局部变量的范围内!这是常规用户编写的功能永远不会做的事情; eval只能这样做,因为它是黑暗的魔法.
使用常规函数取而代之的是魔法元素:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
Run Code Online (Sandbox Code Playgroud)
在上面,归还a遗体1; 新函数只能在自己的局部变量或全局变量上运行window.a.
这些知识允许代码分析工具(可能包括JavaScript引擎,特别是聪明的minifiers)应用更多优化.例如,第二个victim函数可以将a变量完全优化到return 1.一种用途eval和许多潜在的优化是不可行的.
当然,在像JSON evaler 这样的小功能的实践中,没有明显的区别,但总的来说,思路是:
new Function最好是eval,除非你真的需要代码来访问调用函数的局部变量.Nic*_*ver 11
至于为什么jQuery专门使用new Function(),John Resig在jQuery论坛上回答了这个问题
使用eval会导致代码缩小器出现各种问题,因为不清楚eval中可能执行的是什么.查看该运行的最后结果,看起来新函数与eval相当,有时甚至略快.一个例外是Safari 4 - 但这些结果已过时,Safari 4附带了我们使用的原生JSON.parse实现.
| 归档时间: |
|
| 查看次数: |
9192 次 |
| 最近记录: |