评估JSON字符串 - eval()与新函数()

Šim*_*das 9 javascript json eval

可能重复:
jQuery使用(new Function("return"+ data))(); 而不是eval(数据); 解析JSON,为什么?

给定一个表示有效JSON字符串的字符串,这两种解析方法之间是否存在差异:

var str, obj;

str = '{"prop":"value"}';

// method 1:
obj = eval( '(' + str + ')' );

// method 2:
obj = ( new Function( 'return (' + str + ');' ) )();
Run Code Online (Sandbox Code Playgroud)

我注意到jQuery使用第二种方法来解析JSON字符串(在没有内置JSON解析器的环境中).我想知道他们为什么不使用第一种方法.为什么要创建一个函数对象并在可以使用时调用它eval()

请完整关闭

Mik*_*sen 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();
Run Code Online (Sandbox Code Playgroud)

前两个函数调用将打印123( 的全局值x) 和undefined, 的全局值y

这两个eval函数将打印1231( 的本地值y)。这是因为eval可以本地访问正在运行的闭包。jQuery 实现可以利用这些行为(以及在许多浏览器中eval完全不可靠且不一致的事实)。

注意:上面的代码在 Firefox 8 中测试,您的情况可能会有所不同:)


归档时间:

查看次数:

2489 次

最近记录:

14 年,7 月 前