问题: eval(Response.text) 会报错,而需要这样来写 eval('(' + response.text + ')');
例如:
1 var jsonStr = "{'a:':'b'}"; 2 var object = eval(jsonStr); //会报错 3 var object = eval('(' + jsonStr + ')'); //则会正确解析
原因:
1. 不加括号eval时,js会把{}当成代码块,而'a':'b'当成语句来进行解析,那么肯定会报语法错误;
2. '(' + jsonStr + ')'后,代码字符串变成 ({'a':'b'}),那么该代码是个正确的js赋值代码
那么,对于将字符串解析成function,js中存在两个:eval 和 new Function,他们的区别在于:作用域不同,具体表现为:
1 var str = 'console.log(a)'; 2 var a = 0; 3 (function() { 4 var a = 1; 5 eval('(' + str + ')'); //返回1 6 window.eval('(' + str + ')'); //返回0 7 (new Function('return ' + str))(); //返回0 8 })(); 9
对于JS的函数作用域来说,变量作用域有任意层级,即 其他函数内部定义的函数可以调用父函数的局部变量,而内部函数里定义的函数不仅可以调用父函数的局部变量,还可以调用祖父函数的局部变量,以此类推。 —— 摘自 《Javascript编程精解》
因此,对于上述例子来说,window.eval和new Function都是全局作用域的,即他们只能调用全局变量;而eval是局部函数,即他可以调用其父函数的局部变量。
PS:函数如何声名为全局函数,存在以下方式:
- 直接在全局作用域下声明变量
- 是把变量绑定在window上
- 是不加var 直接赋值
- 用new Function和window.eval这种方式去初始化变量