`
muyu
  • 浏览: 218513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

eval会把参数中的大括号视作复合语句的标识

阅读更多
var jsonStr = $('#jsonData').val();  
var json = eval('('+jsonStr+')'); 

 上面两行代码出自《用js模拟PHP的print_r功能 》,用来把接收到的json串转换为js中的对象。既然json串已经是一个完美的对象直接量了,为什么非要在两端加上括号,为什么不能做如下简写呢?

var json = eval(jsonStr);

 看了周爱民老师的《JAVASCRIPT语言精髓与编程实践 》P264的 5.2.2“动态执行过程中的语句、表达式与值”,才明白。

 

-----------

原因

-----------

eval把传入参数中的大括号视为一个复合语句的标识!比如

{name: "MyName", value:1}

 eval会按照如下步骤解析:

  1. 第一个冒号成了“标签声明”标识符;
  2. (“标签声明”的左操作数)name成了标签;
  3. “MyName”成了字符串直接量;
  4. value成了一个变量标识符;
  5. 第二个冒号不能合理地作语法分析,出现语法分析期异常;
  6. ……

 

试着执行如下代码:

alert(eval('{value:1}')); //1

 如果加上小括号,就可以返回对象了:

alert(eval('({value:1})')); //对象
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics