可能重复:
jQuery uses (new Function(“return ” + data))(); instead of eval(data); to parse JSON, why?
给定一个字符串表示有效的JSON字符串,这两种解析方法之间是否存在差异:
var str, obj;
str = '{"prop":"value"}';
// method 1:
obj = eval( '(' + str + ')' );
// method 2:
obj = ( new Function( 'return (' + str + ');' ) )();
我注意到jQuery使用第二种方法来解析JSON字符串(在缺少内置JSON解析器的环境中)。我想知道他们为什么不使用第一种方法。为什么要创建一个函数对象并在只能使用eval()
?
答案 0 :(得分:3)
eval
在声明的范围内执行。 Function
生成一个具有自己范围的新函数对象,并返回对该函数的引用,该函数可以被调用。
举个例子:
var x = 123;
var y;
function TestEval()
{
var y = 1;
Function("window.alert('Global x: ' + x);")(); //Prints 123
Function("window.alert('Local y: ' + y);")(); //Prints undefined
eval("window.alert('Global x: ' + x);"); //Prints 123
eval("window.alert('Local y: ' + y);"); //Prints 1
}
TestEval();
前两个函数调用将打印123
(x
的全局值)和undefined
,y
的全局值。
两个eval
函数将打印123
和1
(y
的本地值)。这是因为eval
具有对其中运行的闭包的本地访问权限。这些行为(以及eval
在许多浏览器中完全不可靠和inconsistent的事实)可以通过jQuery实现来利用。
注意:以上在Firefox 8中测试的代码,您的里程可能会有所不同:)