javascript的 {} 语句块详解


Posted in Javascript onFebruary 27, 2016

今日学习解析json字符串,用到了一个eval()方法,解析字符串的时候为什么需要加上括号呢?摸不着头脑。原来javascript中{}语句块具有二义性,不加括号会出错,理解这种二义性对我们理解javascript代码有极大帮助。

一、{}语句块的两个含义

表示语句块

a. 在javascript中可以使用{}来括起代码,在编辑器中方便管理代码。因为javascript并没有块级作用域,所以这种写法是无害的。

{
//some code...
}

b. 在javascript中 ,条件判断语句,循环语句,函数都需要{}语句块来整合代码

对象字面量

var box = {
  name:'kuoaho',
  age:21 
}

//此时[code]作为表达式,可以赋值给一个变量
//其实对象字面量就是可以生成对象值的表达式

二、那如果对象字面量不作为一个赋值表达式,会发生什么情况呢?

example:

{name:'kuoao'}    //没有报错,但是也没有创建对象
  {name:'kuohao',age}  //报错

由上面可以看出对象字面量只能够作为表达式赋值,第一种写法没有错,只是javascript将它作为一个label语句解析了。

analysis:

{name:'kuoao'}

    //{}一个语句块
   // name:'kuohao',一个label语句,用于标记for循环

三、但是问题又来了……

{
name:'kuohao',
age:21
}

//这样为什么会报错?这不是对象字面量的写法吗?
因为javascript中{}的二义性,{}不仅仅被认为是对象字面量而且还会被认为是代码块。

analysis:
  {
  name:'kuohao',
  age:21
  }

一个代码块,两条label语句,如果没有逗号,是完全没有问题的,所以关键在于逗号,两条语句的分隔应该使用分号,所以javascript会判定这是语法错误

四、正确的写法

({
  name:'kuohao',
  age:21
  })

  //正确的写法

()会把语句转换成表达式,称为语句表达式,对象字面量不是表达式吗?为什么还需要()来转换?

加上括号以后,就可以消除这种二义性,因为括号里的代码都会被转换为表达式求值并且返回,因此语句块也就变成了对象字面量,也可以得出,对象字面量必须作为表达式而存在

Javascript 相关文章推荐
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
javascript如何操作HTML下拉列表标签
Aug 20 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
Dec 22 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
Angular数据绑定机制原理
Apr 17 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
原生js实现拖拽移动与缩放效果
Aug 24 Javascript
15个值得收藏的JavaScript函数
Sep 15 Javascript
javascript中eval解析JSON字符串
Feb 27 #Javascript
javascript先序遍历DOM树的方法
Feb 27 #Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 #Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 #Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
You might like
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
PHP 类型转换函数intval
2009/06/20 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
php操作MongoDB类实例
2015/06/17 PHP
微信支付开发发货通知实例
2016/07/12 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
网络教育毕业生自我鉴定
2013/10/10 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
党课培训心得体会
2014/09/02 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
求职意向书范本
2015/05/11 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
家长会开场白和结束语
2015/05/29 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers