Javascript中大括号“{}”的多义性
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中大括号“{}”的多义性相关推荐
- JavaScript中大括号“{}”作用
2010-05-17 19:52 [小 中 大]来源:CrazyFrom整理 | 作者:CrazyFrom | 64 人关注 JavaScript中大括号"{}"有四种语义作用: ...
- Javascript小括号“()”的多义性
Javascript中小括号有五种语义 语义1,函数声明时参数表 view source print? 1 function func(arg1,arg2){ 2 // ... 3 } 语义2,和 ...
- latex左侧大括号 latex中大括号多行公式
latex左侧大括号 latex中大括号多行公式 \begin{equation} \left\{ \begin{array}{lr} x=\dfr ...
- python 小括号 运算_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
- python中括号的作用_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
- C++中大括号{}的作用
概述 在C/C++中大括号指明了变量的作用域, 在大括号内声明的局部变量其作用域自变量声明开始,到大括号之后终结. { } 里的内容是一个"块",单独的{ }在执行顺序上没有改变, ...
- 正则表达式小括号的多义性
小括号在正则表达式这有以下意义 限定量词作用的范围 限定多选结构的范围 为反向引用捕获文本 分组捕获 只分组不捕获 前瞻 一.限定量词作用的范围 1 2 3 var reg1 = /(Matz)?/; ...
- [Linux] Bash中大括号和小括号的使用
{}的使用 大括号扩展 touch {a,b}.txt -> a.txt b.txttouch {a..d}.txt -> a.txt b.txt c.txt d.txt 代码块 括号内的 ...
- python中大括号是什么意思_浅析python 中大括号中括号小括号的区分
python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...
最新文章
- 3D视觉原理之深度暗示(即立体感)
- 吐血总结|史上最全的MySQL学习资料!!
- 【Deep Learning笔记】Optic Disc 数据集
- PHP学习2——基本语法
- oracle中lead函数,oracle lead()函数 | 学步园
- 新一代的编译工具 SWC,97年小哥写的~
- Java Persistence API:快速入门
- 压力测试http_load 通过修改配置测试https协议成功了。
- 我在小程序工程化方面的一些实践
- 财经数据提取器上线拉
- CPU不支持非地址对齐访问的原因
- R语言聚类算法之k中心聚类(K-medoids)
- C++异常处理的开销
- pytorch_图片分类_猫狗猴
- ACS 4.2安装图解
- Julia: 编译成EXE文件
- 【MySQL】--数据库锁机制
- 实模式8086 与 保护模式80286
- Java Mission Control(JMC)介绍
- Java浅拷贝和深拷贝