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 */ })() // 但是這個也是可以用的