1.1函数的声明
如下方法
add
就是函数声明的代码结构:void add(x,y){ print("$x -- $y"); } void main(){ add(2,3); }
- 关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:
void main(){ add(2,3); } void add(x,y){ print("$x -- $y"); }
1.2函数表达式
函数表达式中有几种不同的语法。最常见和最具代表性的一种如下所示:
void main(){ var adds = (x,y){ print("$x -- $y"); }; adds(3,5); }
- 这种形式看起来好像是常规的变量赋值语句。但是函数表达式和函数声明的区别在于,函数表达式在使用前必须先赋值。所以这段代码执行的时候就会出错:
void main(){ adds(3,5); var adds = (x,y){ print("$x -- $y"); }; }
- 造成这种现象是因为解析器在向执行环境中加载数据时,解析器会率先读取函数声明,并使其在执行任何代码前可用;至于函数表达式,则必须等到解析器执行到它的所在的的代码行,才会真正的被解析。函数表达式中,创建的函数叫做匿名函数。
2.匿名函数的调用方式
匿名函数,顾名思义就是没有名字的函数。
- 第一种调用方式:
上面的函数表达式中的创建,实际上是创建一个匿名函数,并将匿名函数赋值给变量add
,用add
来进行函数的调用,调用的方式就是在变量add
后面加上一对括号(),如果有参数传入的话就是add(1,2)
,这就是匿名函数的一种调用方式。
void main(){ var adds = (x,y){ print("$x -- $y"); }; adds(3,5); }
-
第二种调用方式:
另外一种匿名函数的调用方式是:使用()将匿名函数括起来,然后后面再加一对小括号(包含参数列表)。void main(){ ((x,y){ print("$x -- $y"); }(3,5)); }
或者(参数小括号写包括匿名函数的在外边)
void main(){ ((x,y){ print("$x -- $y"); })(3,5); }
以上代码的这种方式就是模仿了块级作用域(通常成为私有作用域),语法如下所示:
(function(){ //这里是块级作用域 })(参数);
以上代码定义并立即调用了一个匿名函数。经函数声明包含在一对圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。
从上面对于函数和匿名函数的了解,我们引申出来了一个概念,即自执行函数。
3.自执行匿名函数
自执行函数,即定义和调用合为一体。我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。
- 下面我们来看下一些比较有趣的自执行函数表达方式:
// 下面2个括弧()都会立即执行 (function () { /* code */ } ()) // 推荐使用这个 (function () { /* code */ })() // 但是这个也是可以用的