close

  最近總算是有點時間來翻閱React JS 的書,裡面介紹了琳瑯滿目的ES6 Javascript語法知識,真是深覺自己對Javascript語法的認識太過膚淺。

  其中有一個函式的重點讓我為之亮眼,那就是Javascript的函式在定義好參數名稱之後,每當使用函式時,未傳入任何值給函式的話,Javascript就會很雞婆的幫你代入undefined 值給那些沒有被傳入任何值的參數,換句話說,JavaScript的世界裡,函式的每一個參數永遠都有一個預設值undefined

  這就有一個問題啦:"我們希望函式裡的每一個參數always有個正常非undefined的值該怎麼辦呢?"程式語言太聰明對人類來說有時也真的是困擾,但這就是一個值得學習的點啦。

  有兩種方法解決這個問題,第一種是在函式內檢查不需要預設值的參數是否為undefined值的方法,我稱之為檢查參數法;第二種是在函式定義時故意給一個會拋出missing parameter exception的函式為預設值的方法,我稱之為參數預設值強制丟出異常法

  第一種方法就如同下方 test code :

是的,這個testMethod1有兩個參數xy準備做相加然後回傳,所以我們當然希望xy至少得傳個數字進來相加,但如果沒有給預設值的話,xy的值就會是undefined,所以為了強迫他們是數字,因此我們就只好在函式裡加入對每一個參數值檢查是否為undefined的動作,若是undefined則拋出exception,所以這個方式我稱之為檢查參數法

  另外一個方法則是先定義一個專門拋出Exception的函式throwRequiredException(),他只會拋出帶有Missing Parameter訊息的異常,然後呢,就把他當成函式參數的預設值塞給函式定義不能是undefined的參數,這就是testMethod2(a)函式的做法:

是的,在這個函式中你沒看錯,ES6的語法中,函式定義參數時是可以設定函式預設值為一個Expression(表達式),所以我們可以預設a=throwRequiredException(),這在傳統程式語言看起來會很奇怪,但在ES6中這是一項有趣的特性。

  所以如果像這樣testMethod2()使用函式,由於未給a指定特定的值,a便會採用throwRequiredException()作為預設值,然後就丟出exception,這效果不就等於非要指定一個值給a才能使用函式的功能了嗎?即使你是這樣testMethod2(undefined)呼叫函式結果亦然,在Javascript看來,只要函式的任一參數值為undefined都一律視為未傳入該參數值給函式

底下我寫了一些測試碼測試這兩個function來看結果:

node JS來測試這一段程式碼的結果如下:

  以上可以看出兩種方法都可以達成要函式強制輸入值給參數的效果,如果大家想看看Sample Code,也可以到我今天第一次成功啟用的個人github 空間去下載程式碼唷(開心):

https://github.com/jackterrylau/SchoolCode/blob/master/Javascript/funcWithRequiredArgs.js

2019831日星期六

arrow
arrow

    jackterrylau 發表在 痞客邦 留言(0) 人氣()