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 相关文章推荐
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
Sep 22 Javascript
求解开jscript.encode代码的asp函数
Feb 28 Javascript
js继承 Base类的源码解析
Dec 30 Javascript
如何编写高质量JS代码
Dec 28 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
javascript实现禁止鼠标滚轮事件
Jul 24 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
May 17 Javascript
JavaScript中函数声明与函数表达式的区别详解
Aug 18 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 Javascript
VueJS实现用户管理系统
May 29 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
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python下如何让web元素的生成更简单的分析
2008/07/17 Python
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
python去除字符串中的换行符
2017/10/11 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python中return的返回和执行实例
2019/12/24 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
先进党支部事迹材料
2014/01/13 职场文书
干部行政关系介绍信
2014/01/17 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
学生会主席竞聘书
2014/03/31 职场文书
小学节能减排倡议书
2014/05/15 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
婚礼新人答谢词
2015/01/04 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书