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

时间:2011-11-22 16:43:50

标签: javascript json eval

  

可能重复:
  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()

时调用它

请关闭完整的副本

1 个答案:

答案 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();

前两个函数调用将打印123x的全局值)和undefinedy的全局值。

两个eval函数将打印1231y的本地值)。这是因为eval具有对其中运行的闭包的本地访问权限。这些行为(以及eval在许多浏览器中完全不可靠和inconsistent的事实)可以通过jQuery实现来利用。

注意:以上在Firefox 8中测试的代码,您的里程可能会有所不同:)

相关问题