First Class Function

如果你有寫過JavaScript,你一定也覺得有件事很有趣,就是functions可以被放在變數裡,然後丟來丟去……

1
2
3
4
5
6
7
8
9
10
function execFuncCanBeThrownAround() {
console.log("I can be thrown around, I was executed.");
}

function execFunc(func) {
func();
}

let aFuncHasBeenThrownAround = execFuncCanBeThrownAround;
execFunc(aFuncHasBeenThrownAround);

啊啊啊!這是怎麼一回事啊?原來是JavaScript的functions也是物件啦!如果把function用console印出來,的確可以看到它有不少屬性呢!像下面這樣

1
2
function createAFunctionIGotAnObject() {}
console.dir(createAFunctionIGotAnObject);

如果把上面的程式碼片段放到瀏覽器跑,會看到下面的結果:

既然function也是物件,那麼物件可以做的事,function應該也都可以做囉?這裡我們先來看看物件的特性,物件可以被指定給變數、被存在資料結構裡(例如Array)、被當作argument傳到function裡、被從function裡return出來。Function也是物件,所以前面說的那些操作,也都可以用在function上啦!而只要是可以被指定給變數、被存在資料結構裡、被當作argument傳給function、被從function裡return出來的數值,就叫做「first-class values」,而對function來說,就叫做「first-class function」啦!另外就傳遞物件來說,我們傳遞的是物件的reference,而在傳遞function時,我們傳遞的則是function的reference呢。

JavaScript有很多詭異又有趣的地方,恩……我們一起加油,繼續探究吧!有任何建議,也歡迎在下面留言給我喔!