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 相关文章推荐
动态加载script文件的两种方法
Aug 15 Javascript
javascript间隔刷新的简单实例
Nov 14 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
May 04 Javascript
使用VS开发 Node.js指南
Jan 06 Javascript
基于jQuery实现的QQ表情插件
Aug 25 Javascript
JS判断图片是否加载完成方法汇总(最新版)
May 13 Javascript
JS实现的多张图片轮流播放幻灯片效果
Jul 22 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
Oct 24 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
element-ui中el-upload多文件一次性上传的实现
Dec 02 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中文字母数字验证码实现代码
2008/04/25 PHP
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python正则简单实例分析
2017/03/21 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
python实现K最近邻算法
2018/01/29 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
如何在pycharm中安装第三方包
2020/10/27 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
python绘制高斯曲线
2021/02/19 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
教师个人师德总结
2015/02/06 职场文书
最感人的道歉情书
2015/05/12 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python