Š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()?
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函数将打印123和1( 的本地值y)。这是因为eval可以本地访问正在运行的闭包。jQuery 实现可以利用这些行为(以及在许多浏览器中eval完全不可靠且不一致的事实)。
注意:上面的代码在 Firefox 8 中测试,您的情况可能会有所不同:)
| 归档时间: |
|
| 查看次数: |
2489 次 |
| 最近记录: |