JS中函数定义和函数表达式的区别

摘要: (function() {})();和(function(){}());的区别javascript

Javascript中有2个语法都与function关键字有关,分别是:java

函数定义:function FunctionName(FormalParameterList) { FunctionBody }算法

函数表达式:function [FunctionName](FormalParameterList) { FunctionBody }app

从语法的定义上看,这二者几乎是如出一辙的(惟一的区别是函数表达式能够省略函数名称),那么就解释器而言,当遇到这个结构的语句时,断定为函数表达式仍是函数定义呢?函数

就javascript的语法而言,若是一条语句是以function关键字开始,那么这段会被断定为函数定义。而函数定义是不能被当即执行的,这无疑会致使语法的错误(SyntaxError),所以就必须有一个办法,使解析器能够将之识别为函数表达式。lua

前面已经说到,解析器识别函数定义的条件是以function关键字开始,那么天然,只要在function关键字的前面有任何其余的元素,就会从函数定义转变为函数表达式,如下方法都是能够的,这个你们都知道:orm

~function() {}();blog

!function() {}();ip

void function() {}();数学

可是这几个方法都有一个特色,就是看起来很别扭,因此如今为止,以括号包裹成了比较公认的方案

回到正题,括号包裹一样有2个方式:(function() {})();和(function(){}());

他们的共通点是:都有括号。而括号在javascript中有2种做用:确立运算优先级,以及分组运算符,从代码上看,显然没有进行数学或逻辑运算,所以我认为这里的括号属于分组运算符。

根据标准,分组运算符的做用是:

Return the result of evaluating Expression. This may be of type Reference. 

返回评估括号中的表达式的结果。结果多是Reference类型。

抛开像Reference类型这种词汇,这里的一个关键词应当是“ 评估 ”,可是关于分组运算符,又有一个很重要的下文:

This algorithm does not apply GetValue to the result of evaluating Expression.

这个算法不会对估算的结果使用GetValue。

有不少专用的名词,看起来确实复杂,简而言之,使用括号运算符自己不会让括号中的代码当即执行,只有当括号包含的这个“分组”参与其余运算时,才会执行。所以,(function(){})()这个语句,实际上是首先用分组运算符评估了一个函数表达式,随后参与“函数调用”。而(function(){}())这个语句,则是用分组运算符评估了一个函数调用,随后因为语句的结束而被执行。

相关文章
相关标签/搜索