函式是物件的一種,那麼或許也聽過在 JavaScript 裡面函式是第一級公民。 --008
第一級公民是什麼意思,透過書上的舉例來了解,指的是可以將函式存放在變數、物件甚至是陣列中。
// 把函式存入變數,呼叫時執行 funcA();
const funcA = function () {};
// 把函式存數「陣列」,呼叫時執行 funcB[0]()
const funcB = [function () {}];
// 呼叫時執行 funcC.method() 或 funcC['method']()
const funcC = { method: function () {}};
也可將函式以參數的形式傳給另一個函式,甚至由其他函式來 return 它。因函式實際上就是一個物件,所以具有屬性,任何可以對物件做的事,都可以對函式操作。如下例:
// 把函數當作參數,傳入另一個函式中
const funcD = function (func) {
return func;
};
const runFuncPassedToFuncD = funcD(function () {
console.log("Hi"); // 設 run...函式存放的是funcD,而參數為一個匿名函式
});
runFuncPassedToFuncD(); // Hi, 呼叫 run...函式
const funcE = function () {};
funcE.answer = "yup"; // 新增屬性,函式是物件的一種
console.log(funcE.answer); // 'yup'
雖然 typeof 檢查函式的時候會得到 "function" 常常誤會成 JS 的另一種型別,但實際上仍然是 object。
函式是一種物件,值也是物件。可以把他想性程式一種可以「被呼叫」(be invoked)的特殊物件(值)。
而把 A 函式當作參數傳入 B 函式,此時 B 函式也稱作高階函式(High Order Function)。
參考資料
008 天重新認識 JavaScript
一級函式 & 函式應用