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的点击链接插入链接内容的代码
Jul 31 Javascript
JavaScript作用域与作用域链深入解析
Dec 06 Javascript
javascript:window.open弹出窗口的位置问题
Mar 18 Javascript
ExtJS4 动态生成的grid导出为excel示例
May 02 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
深入理解逻辑表达式的用法 与或非的用法
Jun 06 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
JS数组属性去重并校验重复数据
Jan 10 Javascript
JS实现分页导航效果
Feb 19 Javascript
JS sort方法基于数组对象属性值排序
Jul 10 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
动手学习无线电
2021/03/10 无线电
JavaScript版代码高亮
2006/06/26 Javascript
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
PyQt5实现简易电子词典
2019/06/25 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
浅析NumPy 切片和索引
2020/09/02 Python
详解python算法常用技巧与内置库
2020/10/17 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
本科毕业生自我鉴定
2013/11/02 职场文书
学校欢迎标语
2014/06/18 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle
Vue router配置与使用分析讲解
2022/12/24 Vue.js