JS中大括号有四种语义作用

语义1,组织复合语句,这是最常见的

if( condition ) {//...
}else {//...
}
for() {//...
}

语义2,对象直接量声明

var obj = {name : 'jack',age : 23
};

整个是个赋值语句,其中的{name:'jack',age:23}是个表达式。

语义3,声明函数或函数直接量

function f1(){//...
}var f2 = function(){//...
}

f1与非f2的区别是前者在语法解释期,后者在运行期。区别在于:如果调用该函数的代码在函数定义之后,则没有区别;如果调用该函数的代码在函数定义之前,则f1仍然可以调用,f2则会报错,提示f2未定义。

语义4,结构化异常处理的语法符号

try {//...
}catch( ex ){//...
}finally{//...
}

这里的大括号与符合语句(语义1 )是有区别的,大括号中如果只有一条语句,在if/else/for等中大括号是可以省略的,但try/catch/finally则不能省略。

以下代码纠结了偶N久

function(){}() //匿名函数立即执行, 语法分析期报
{}.constructor //获取对象直接量的构造器,语法分析期报错

令人不解的是为何[].constructor这么写却不报错呢,一个是想获取对象直接量的构造器,一个是获取数组直接量的构造器而已。

当然添加个变量接收也不会报错

var c = {}.constructor;

同样的情况如

var fn = function(){}()

也不会报错。

实际上是js的“语句优先”在作怪,即{}被理解成复合语句块(语义1 )而不是对象直接量(语义2 )或声明函数(语义3 )的语义。

function(){}(),大括号被理解成复合语句,自然前面的function()声明函数的语法不完整导致语法分析期出错。
{}.constructor,大括号被理解成复合语句,大括号后面是点运算符,点运算符前没有合理的对象自然也报错。

修复方式众所周知:加个强制运算符()
(function(){})(),(function(){});//强制其理解为函数(语义3 ),“函数()”表示执行该函数,即声明后立即执行了。
({}).constructor //({})强制把大括号理解成对象直接量(语义2 ),“对象.xx”表示获取对象的成员,自然后面的点运算符可以正常执行了。

Javascript中大括号“{}”的多义性相关推荐

  1. JavaScript中大括号“{}”作用

    2010-05-17 19:52 [小 中 大]来源:CrazyFrom整理 | 作者:CrazyFrom | 64 人关注 JavaScript中大括号"{}"有四种语义作用: ...

  2. Javascript小括号“()”的多义性

    Javascript中小括号有五种语义 语义1,函数声明时参数表 view source print? 1 function func(arg1,arg2){ 2   // ... 3 } 语义2,和 ...

  3. latex左侧大括号 latex中大括号多行公式

    latex左侧大括号 latex中大括号多行公式 \begin{equation} \left\{              \begin{array}{lr}              x=\dfr ...

  4. python 小括号 运算_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

  5. python中括号的作用_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

  6. C++中大括号{}的作用

    概述 在C/C++中大括号指明了变量的作用域, 在大括号内声明的局部变量其作用域自变量声明开始,到大括号之后终结. { } 里的内容是一个"块",单独的{ }在执行顺序上没有改变, ...

  7. 正则表达式小括号的多义性

    小括号在正则表达式这有以下意义 限定量词作用的范围 限定多选结构的范围 为反向引用捕获文本 分组捕获 只分组不捕获 前瞻 一.限定量词作用的范围 1 2 3 var reg1 = /(Matz)?/; ...

  8. [Linux] Bash中大括号和小括号的使用

    {}的使用 大括号扩展 touch {a,b}.txt -> a.txt b.txttouch {a..d}.txt -> a.txt b.txt c.txt d.txt 代码块 括号内的 ...

  9. python中大括号是什么意思_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

最新文章

  1. 3D视觉原理之深度暗示(即立体感)
  2. 吐血总结|史上最全的MySQL学习资料!!
  3. 【Deep Learning笔记】Optic Disc 数据集
  4. PHP学习2——基本语法
  5. oracle中lead函数,oracle lead()函数 | 学步园
  6. 新一代的编译工具 SWC,97年小哥写的~
  7. Java Persistence API:快速入门
  8. 压力测试http_load 通过修改配置测试https协议成功了。
  9. 我在小程序工程化方面的一些实践
  10. 财经数据提取器上线拉
  11. CPU不支持非地址对齐访问的原因
  12. R语言聚类算法之k中心聚类(K-medoids)
  13. C++异常处理的开销
  14. pytorch_图片分类_猫狗猴
  15. ACS 4.2安装图解
  16. Julia: 编译成EXE文件
  17. 【MySQL】--数据库锁机制
  18. 实模式8086 与 保护模式80286
  19. Java Mission Control(JMC)介绍
  20. Java浅拷贝和深拷贝

热门文章

  1. [转]使用HttpOnly提升Cookie安全性
  2. Selenium对于对话框alert,confirm,prompt的处理
  3. 【原】Spark Standalone模式
  4. 机房收费系统之处理流程图与DFD图
  5. c# Invoke和BeginInvoke 区别
  6. 大数高精运算-----乘法
  7. Vue导入非模块化的第三方插件功能无效解决方案
  8. 网页的js源文件被加密解决方案
  9. js-数组方法的使用和详谈
  10. IIS应用池保持激活工具开发