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 相关文章推荐
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
js 实现 input type="file" 文件上传示例代码
Aug 07 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
Node.js事件循环(Event Loop)和线程池详解
Jan 28 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
Angularjs实现上传图片预览功能
Sep 01 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
JS数据类型分类及常用判断方法
Nov 19 Javascript
JS函数式编程实现XDM一
Jun 16 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
js实现数组转换成json
2015/06/26 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
ant design实现圈选功能
2019/12/17 Javascript
Python标准库sched模块使用指南
2017/07/06 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
一年级评语大全
2014/04/23 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
Python anaconda安装库命令详解
2021/10/16 Python