前一篇文章:【JavaScript 入門:JS 的函式解析! 宣告式、表達式、箭頭函式】中,我們提到了函式可以被指派給變數、當參數傳入,以及當作回傳值。而滿足了這樣的條件,就是所謂的一等公民。
一等公民 First-class citizen
一等公民是一個程式語言的概念,代表它跟一般的資料型別(num、string) 地位相等。在 JS 中的反例像是 if-else、for loop 這些是語法結構,它們不是值,因此沒辦法指派給變數、也無法當作參數傳遞。
一等函式 First-class Function
在 JS 中,因為函式是一等公民,有時候也被稱做一等函式。函式賦值給變數
const sayHi = function (){ // 這也是前一篇文介紹的函式表達式
console.log("Hi");
}
sayHi();
當作參數傳入
function sayHi(){
return "Hi";
}
function talk(name, action){
console.log(`${action()}, ${name}`);
}
talk("Elaine", sayHi); // Hi, Elaine
當作回傳值
function passwordManager(initialPassword){
let password = initialPassword;
return function(input){
let result = input===password;
return result;
}
}
const psManager= passwordManager(123);
console.log(psManager(223)); // false
這個範例偷藏了閉包(closure)概念,如果你還不知道,或是忘記了,可以回來複習這篇文章:
【JavaScript 入門:閉包 Closure 是什麼?】
高階函式 Higher-order function
在 JS 中,如果一個函式滿足以下其中一個條件,就可以說是高階函式:
- 接受別的函式當參數
- 回傳一個函數
拿前面的例子來看,這邊的 talk 就是一個高階函式,因為它接收了 action 這個函式當參數。
function sayHi(){
return "Hi";
}
function talk(name, action){ // <-- 接受 action 函式,這是高階函式
console.log(`${action()}, ${name}`); // action 是函式,所以需要用 () 執行
}
talk("Elaine", sayHi);
而 passwordManager 這個範例,passwordManager 也是一個高階函式~因為它返回了函式。
回呼函式 Callback function
函式可以被傳遞,接收函式的是高階函式,而被傳遞、等待被其他函式呼叫的函式就叫做回呼函式。
一樣是剛才的範例,這次我們注意這個 sayHi,它被傳到 talk 裡面等待執行,這就是回呼函式。
function sayHi(){ // <-- 被傳入 talk 裡面等待執行,這是回呼函式
return "Hi ";
}
function talk(name, action){
console.log(`${action()}, ${name}`);
}
talk("Elaine", sayHi);
總結
到這裡我們介紹了可以被賦值給變數、傳入與當作回傳的一等公民特性,也介紹了高階函式與回呼函式的概念。在本篇的例子中,回呼函式都是立刻執行,你可能會想,「我能不能讓這個回呼函式晚一點在執行,晚個三秒五秒之類的?」當然可以!! 我們下一篇就會介紹這個有趣的設計,也就是「非同步函式」的概念。
參考














