js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式

js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式

ID:42623797

大小:28.93 KB

页数:9页

时间:2019-09-19

js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式_第1页
js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式_第2页
js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式_第3页
js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式_第4页
js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式_第5页
资源描述:

《js高端系列教程(29)——JavaScript函数其三:分组中的函数表达式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、让我们回头并回答在文章开头提到的问题——”为何在函数创建后的立即调用中必须用圆括号来包围它?”,答案就是:表达式句子的限制就是这样的。(function(){...})();按照标准,表达式语句不能以一个大括号{开始是因为他很难与代码块区分,同样,他也不能以函数关键字开始,因为很难与函数声明进行区分。即,所以,如果我们定义一个立即执行的函数,在其创建后立即按以下方式调用:function(){...}();//即便有名称functionfoo(){...}();我们使用了函数声明,上述2个定义,解释器在解释的时候都会报错

2、,但是可能有多种原因。如果在全局代码里定义(也就是程序级别),解释器会将它看做是函数声明,因为他是以function关键字开头,第一个例子,我们会得到SyntaxError错误,是因为函数声明没有名字(我们前面提到了函数声明必须有名字)。第二个例子,我们有一个名称为foo的一个函数声明正常创建,但是我们依然得到了一个语法错误——没有任何表达式的分组操作符错误。在函数声明后面他确实是一个分组操作符,而不是一个函数调用所使用的圆括号。所以如果我们声明如下代码://"foo"是一个函数声明,在进入上下文的时候创建alert(f

3、oo);//函数functionfoo(x){alert(x);}(1);//这只是一个分组操作符,不是函数调用!foo(10);//这才是一个真正的函数调用,结果是10上述代码是没有问题的,因为声明的时候产生了2个对象:一个函数声明,一个带有1的分组操作,上面的例子可以理解为如下代码://函数声明functionfoo(x){alert(x);}//一个分组操作符,包含一个表达式1(1);//另外一个操作符,包含一个function表达式(function(){});//这个操作符里,包含的也是一个表达式"foo"("

4、foo");//等等如果我们定义一个如下代码(定义里包含一个语句),我们可能会说,定义歧义,会得到报错:if (true) function foo(){alert(1)}根据规范,上述代码是错误的(一个表达式语句不能以function关键字开头),但下面的例子就没有报错,想想为什么?我们如果来告诉解释器:我就像在函数声明之后立即调用,答案是很明确的,你得声明函数表达式functionexpression,而不是函数声明functiondeclaration,并且创建表达式最简单的方式就是用分组操作符括号,里边放入的永远

5、是表达式,所以解释器在解释的时候就不会出现歧义。在代码执行阶段这个的function就会被创建,并且立即执行,然后自动销毁(如果没有引用的话)。(functionfoo(x){alert(x);})(1);//这才是调用,不是分组操作符上述代码就是我们所说的在用括号括住一个表达式,然后通过(1)去调用。注意,下面一个立即执行的函数,周围的括号不是必须的,因为函数已经处在表达式的位置,解析器知道它处理的是在函数执行阶段应该被创建的FE,这样在函数创建后立即调用了函数。varfoo={bar:function(x){retu

6、rnx%2!=0?'yes':'no';}(1)};alert(foo.bar);//'yes'就像我们看到的,foo.bar是一个字符串而不是一个函数,这里的函数仅仅用来根据条件参数初始化这个属性——它创建后并立即调用。因此,”关于圆括号”问题完整的答案如下:当函数不在表达式的位置的时候,分组操作符圆括号是必须的——也就是手工将函数转化成FE。如果解析器知道它处理的是FE,就没必要用圆括号。除了大括号以外,如下形式也可以将函数转化为FE类型,例如://注意是1,后面的声明1,function(){alert('anon

7、ymousfunctioniscalled');}();//或者这个!function(){alert('ECMAScript');}();//其它手工转化的形式...但是,在这个例子中,圆括号是最简洁的方式。顺便提一句,组表达式包围函数描述可以没有调用圆括号,也可包含调用圆括号,即,下面的两个表达式都是正确的FE。下面的代码,根据任何一个function声明都不应该被执行:if(true){functionfoo(){alert(0);}}else{functionfoo(){alert(1);}}foo();//1o

8、r0?实际在上不同环境下测试得出个结果不一样这里有必要说明的是,按照标准,这种句法结构通常是不正确的,因为我们还记得,一个函数声明(FD)不能出现在代码块中(这里if和else包含代码块)。我们曾经讲过,FD仅出现在两个位置:程序级(Programlevel)或直接位于其它函数体中。因为代码块仅包含语句,所以这是不正

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。