解析Javascript中大括号"{}"的多义性

2014-10-17  来源:本站原创  分类:javascript技巧  人气:3 

这篇文章主要介绍了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中大括号"{}"的多义性 2014-10-17

    这篇文章主要介绍了Javascript中大括号"{}"的多义性.需要的朋友可以过来参考下,希望对大家有所帮助 JS中大括号有四种语义作用 语义1,组织复合语句,这是最常见的 if( condition ) { //... }else { //... } for() { //... } 语义2,对象直接量声明 复制代码 代码如下: var obj = { name : 'jack', age : 23 }; 整个是个赋值语句,其中的{name:'jack',age:23}是个表达式. 语

  • 解析Javascript小括号"()"的多义性 2014-12-23

    这篇文章主要介绍了Javascript小括号"()"的多义性.需要的朋友可以过来参考下,希望对大家有所帮助 Javascript中小括号有五种语义 语义1,函数声明时参数表 function func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 复制代码 代码如下: // 和for in一起使用 for(var a in obj){ // ... } // 和if一起使用 if(boo){ //... } // 和while一起使用 whil

  • 解析JavaScript中点号"."的多义性 2013-12-01

    这篇文章主要介绍了JavaScript中点号"."的多义性.需要的朋友可以过来参考下,希望对大家有所帮助 点号「.」在JavaScript中有两种语义 语义1.表示算术中的小数点(浮点数),如 2.5 语义2.取对象属性.方法,如 [].push(2) 这几乎没有任何难理解的地方,但下面这个问题则很有趣. // 这行代码会如何执行 1.toString(); Firebug 中如下 这里的点号表达的是上述的语义1,因此点号后面必须跟一个数字,这里跟的是toString,报语法错了. 解

  • 解析Javascript中中括号"[]"的多义性 2013-11-22

    这篇文章主要介绍了Javascript中中括号"[]"的多义性.需要的朋友可以过来参考下,希望对大家有所帮助 Javascript中括号有四种语义 语义1,声明数组 var ary = []; // 声明一个空数组 var ary = [1,3]; // 声明一个数组,同时赋初值 语义2,取数组成员 复制代码 代码如下: var ary = [1,2,3]; var item = ary[0]; 语义3,定义对象成员 (可以不遵循标识符规则 ) 复制代码 代码如下: var obj =

  • php json_encode值中大括号与花括号区别 2015-03-30

    这篇文章主要介绍了json_encode值中大括号与花括号区别,具体的看下实例说明,需要的朋友参考下 1.当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串 $test = array(); $test[] = 1; $test[] = 1; $test[] = 1; echo json_encode($test); 结

  • php中大括号的作用 2013-06-22

    看ecshop的时候,发现在解析模板的时候看到$tag{0}($tag是个字符串)这种写法,然后百了下php中大括号的作用,如下: 一.不管什么程序,function name(){}, for(){}, -.这太多了,不说也知道什么用了. 二.$str{4}在字符串的变量的后面跟上{}刚大括号和中括号一样都是把某个字符串变量当成数组处理 //$str{4}在字符串的变量的后面跟上{}大括号和中括号一样都是把某个字符串变量当成数组处理 $str = 'abcdefg'; echo $str{4}

  • asp.net String.format中大括号的加入方法 2013-11-01

    String.format中大括号的加入方法,需要的朋友可以参考下. String.Format("{0} world!","hello") //将输出 hello world!,没有问题,但是只要在第一个参数的任意位置加上一个大括号: String.Format("{0} wo{rld!","hello") //就会产生一个异常,异常信息是:Input string was not in a correct format.

  • xml 封装与解析(javascript和C#中) 2014-07-02

    xml 封装与解析 javascript和C#中的分别实现代码. 1.xml的解析(javascript中): 具体代码如下,解析的结果root为Dom树. if (window.ActiveXObject){ var doc=new ActiveXObject("Microsoft.XMLDOM"); doc.async="false"; doc.loadXML(strXml); }else{ var parser=new DOMParser(); var doc

  • 解析JavaScript中instanceof对于不同的构造器或许都返回true 2013-11-14

    这篇文章主要是对JavaScript中instanceof对于不同的构造器或许都返回true进行了详细的解析,需要的朋友可以过来参考下,希望对大家有所帮助 我们知道 instanceof 运算符用来检查对象是否为某构造器的实例.下面列举它返回true的各种情景. 1.对象obj是通过new Constructor创建的,那么 obj instanceof Constructor 为true function Person(n, a) { this.name = n; this.age = a;

  • 解析JavaScript中的不可见数据类型 2013-12-17

    这篇文章主要是对JavaScript中的不可见数据类型进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JS提供了一些内置对象.函数和构造器供我们编程,如Math.parseInt.Object.Array等.这些都是可见的,编程时可以使用的.比如我可以new Object 或 new Array. 有一些则是不可见的,这些对象只能由引擎在特殊的情形提供.这些类型的对象往往还被消减了一些功能.下面列举一些 一.Arguments 类型Arguments 类型 不能由程序员手动创建其

  • php中大括号作用介绍 2014-06-28

    {}大括号在php中的作用(PHP变量放在大括号里面的含义) 一.不管什么程序,function name(){}, for(){}, -.太多了,不说也知道做什么用了. 二.$str{4}在字符串的变量的后面跟上{}刚大括号和中括号一样都是把某个字符串变量当成数组处理. 三.{$val}这时候大括号起的作用就是,告诉PHP,括起来的要当成变量处理. $arr=array(0=>123, 'name'=>'你好'); foreach($array as $k=>$v){ echo &qu

  • 解析javascript 实用函数的使用详解 2013-10-15

    本篇文章对javascript中的一些实用函数进行了详细的分析介绍,需要的朋友参考下 function addBookMark(url, title){ //将网页添加到收藏addBookMark(window.location,document.title) if(document.all){ window.external.addFavorite(url,title); }else if (window.sidebar){ window.sidebar.addPanel(title,url,

  • 解析JavaScript中的标签语句 2014-01-18

    本篇文章是对JavaScript中的标签语句进行了详细的分析介绍,需要的朋友参考下 Javascript中标签(label)是一个标识符.标签可以与变量重名,它是一个独立的语法元素(既不是变量,也不是类型),其作用是标识"标签化语句(labeled statement)" 标签声明标签(label)可以声明在任何一个语句前面,或者语句块前,以使得语句或语句块被"标签化(labeled)". label1: myFun1(); label2:{ var i = 1,

  • 解析JavaScript中delete操作符不能删除的对象 2014-03-22

    这篇文章主要是对JavaScript中delete操作符不能删除的对象进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 ES3 中,delete在8.6.2.5及11.4.1有介绍,如下 有一些信息, 1.实现上delete操作符会调用引擎内部的[[Delete]]方法 2.[[Delete]]在8.6.2里定义 3.删除的属性有个DontDelete的特性,如果有,delete时直接返回false 搜索"DontDelete",会发现有很多,如下都不能delete

  • 解析javascript 数组以及json元素的添加删除 2014-06-01

    本篇文章是对javascript 数组以及json元素的添加删除进行了详细的分析介绍,需要的朋友参考下 javasscript删除数组的3种方法 1,用shift()方法shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var chaomao=[1,2,3,4,5] var chaomao.shift()//得到1 alert(chaomao)//[2,3,4,5] 2,用pop()方法pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回und

  • 解析javascript系统错误:-1072896658的解决办法 2014-06-19

    问题出现在用到ajax的场合.昨天还正常的程序,今天运行就有javascript系统错误:-1072896658的 提示在XX.innerHTML=xmlhttp.responseText;这行. 我感觉是编码混乱了.在asp代码顶端加入 <% Response.Charset="UTF-8"%> 没有效果. 后来查到,在前端HTML的javascript段前加 <script type="text/javascript" charset=&quo

  • 深入解析JavaScript中的变量作用域 2014-08-04

    这篇文章主要是对JavaScript中的变量作用域进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 在学习JavaScript的变量作用域之前,我们应当明确几点: •JavaScript的变量作用域是基于其特有的作用域链的. •JavaScript没有块级作用域. •函数中声明的变量在整个函数中都有定义. 1.JavaScript的作用域链首先看下下面这段代码: <script type="text/javascript"> var rain = 1; f

  • 解析Javascript中难以理解的11个问题 2015-02-13

    这篇文章主要是对Javascript中难以理解的11个问题进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1.原始值与引用值 原始值存放在栈里, 引用值存放在堆里. 如程序: function Person(id,name,age){ this.id = id; this.name = name; this.age = age; } var num = 10; var bol = true; var str = "abc"; var obj = new Object

  • 解析JavaScript的事件机制 2014-01-04

    事件流 JavaScript 的事件是以一种流的形式存在的,一个事件会有多个元素同时响应.有时候这不是我们想要的,我们只需要某个特定的元素响应我们的绑定事件就可以了. 事件分类 捕获型事件(非IE).冒泡型事件(所有浏览器都支持) 捕获型事件是自上而下的,而冒泡型事件是自下而上的.下面我用一个图来直观表示: 冒泡型事件我们在工作中可能会比较多遇到,但捕获型事件怎样才会执行到呢,如果我们想要在非 IE 浏览器中要创建捕获型事件,只需将 addEventListener 的第三个参数设为true就好

  • 匿名函数的三种调用方式 2011-01-30

    js中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数. 好,看看匿名函数的如何被调用. 1.执行后得到返回值的函数调用 //方式1,调用函数,得到返回值.强制运算符使函数调用执行(function(x,y){ alert(x+y); return x+y;}(3,4)); //方式二,调用函数,得到返回值.强制函数直接量执行再返回一个引用,引用再去调用执行(function(x,y){ a