今天來看看函式Functions
在JS這個物件導向語言裡,其函式的特性被稱為一級函式
。
一級函式First Class Functions
開發者對別的基礎型別做的事,也可以對函式去做,因為函式就是物件,而物件就是名稱/值的組合。
開發者可以指派函式給變數,將函式傳入另一個函式,也可以用實體語法建立函數。
函式可以有屬性和方法,因為他就是物件,所以它可以連結到物件、屬性、其他函式(Methood)
關於一級函式的介紹,可以參考:
維基百科頭等函式
ITome專欄物件導向語言中的一級函式 by林信良
而JS的函式還有隱藏的物件屬性,其中最重要的有兩個:
NAME
即名子屬性,然而名子不是必須的,函式也可以沒有名子(匿名函式)
CODE
即程式屬性code property
,這個屬性的內容,就是開發者在編輯器上開發時,寫在函式內的程式碼。
我們寫的程式碼會成為這個屬性的值,而CODE屬性的特性是,它的內容是可以呼叫執行的。
來看看以下程式碼
function sport(){
console.log('運動');
}
因為函式就是物件,所以我們可以接著這樣寫
sport.basketball = '打籃球';
console.log(sport.basketball);
結果是
為何沒有報出錯誤訊息?
因為JS函式就是物件,物件可以自由擴增屬性,我們等於對sport
這個函式物件,新增一個basketball
屬性,其值為字串打籃球
。
那這個函式,它的名子、物件屬性NAME是什麼呢?
就是greet
當我們欲呼叫執行函式,在編輯器寫上greet()
,其實就是透過函式屬性名子greet
去呼叫這個函式物件的定義,而()
就會創造執行環境,執行這個函式物件程式屬性
裡的內容,也就是console.log('hi');
這段程式碼。
小結
今天複習了函式就是物件這個觀念
先前我只曉得函式是物件型別,可以自由擴增屬性,但沒想深入想過函式的名子也是屬性(NAME)這件事。
今天的筆記內容可以參照Udemy課程:JavaScript 全攻略:克服JS 的奇怪部分4-34