只在此山中,雲深不知處


聽首歌



© 2018 by Shawn Huang
Last Updated: 2018.5.27

函數

函數可以將一段程式碼包裹,便於偵錯及重複使用,需使用關鍵字function
以下開始將程式碼寫在檔案,此處檔名為js5.js
>>

記得在head標籤內加上<script src="js5.js"></script>才能連結上。
函數需要被呼叫才會執行,所以須加上最後一行,請記得要有小括號。

輸入參數與傳回值


函數可以有輸入值與傳回值,例如以下計算矩形面積的函數:

重載網頁可以看到結果。如果我們想算的是兩個矩形的面積和呢?此時我們需要讓函數傳回數值, 關鍵字為return。將上例修改如下: 每次呼叫函數將會得到傳回的數值。

將函數當作變數


這是一個有趣的功能,可以使用一個變數來表示函數,例如將上例修改如下: 重載可以看到結果,可以看出此時變數a代表的是函數area()。

=>


這是一個簡寫的函數建立方式,省略function關鍵字,例如之前的hello函數,改寫如下:
若是有參數的情況,例如上述的area函數,改寫如下:
可以看出省略了function關鍵字,改用=>符號替代。

Hoisting & Self-Invoking


這是關於函數呼叫的方式,Hoisting的意思是我們可以在函數宣告之前呼叫他,還是會執行,那是因為程式先編譯,所以在執行時已經知道有宣告了。例如: f(n)是fibonacci sequence的函數,使用recursive方法,但是我們在宣告之前便使用該函數,不過還是可以執行,是為hoisting。
而self-invoking的意思是自呼叫,也就是不需要呼叫函數便執行。其實是這樣,假如我們有一個函數名為abc,那麼當我們呼叫它時,要寫
abc();
其實也可以寫成(abc)();加到小括號內是一樣的。(就好像a+b跟(a+b)一樣的類似)。接下來我們把函數的內容替換掉名字,其實名字就是指函數本身,如下例: 因為馬上就呼叫執行,所以連名字都省了。再看一個例子:

Closure


Closure函數的寫法可以讓我們操控變數的影響範圍,或讓變數成為private,盡量不要宣告global variable免得與視窗變數產生衝突。
先看以下兩個程式範例:
第一個函數內的sayHello()使用函數內變數,第二個函數傳回sayHello()函數,第二個方式為Closure,此寫法會讓下次呼叫時, 裡面的函數保持之前的設定。
再看以下例子:
使用這個方式,每次呼叫f2()時,會保留之前的環境,所以i的值會每次加1。