SHINE.LI

一个行走在互联网边缘的工程师

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题: 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这种方式去初始化变量
posted on 2012-11-16 11:13  SHINE.LI  阅读(1593)  评论(0编辑  收藏  举报