維基裡對於first class function的定義是這樣的:
一級函式(first-class function;第一級函數)是指在程序設計語言中,函數被當作頭等公民。這意味著,函數可以作為別的函數的參數、函數的返回值,賦值給變量或存儲在資料結構中。
Proessor Frisby的文裡是這樣形容:
當我們說 function 是「First Class(頭等)」時,意指他們就像其他人一樣⋯所以就是 Normal Class(坐經濟艙的人?)。function 真的沒什麼特別的地方,你可以像對待其他資料型別一樣對待它們-他們可以被存在陣列中,當作參數傳遞,賦予至變數⋯等等。
也就像之前討論函式宣告方式時,function expression的宣告方式把函式看成一個值,下面用例子來看看實際作的樣子:
簡單的可以單看function expression就是一個函式儲存在變數裡的例子:
const logMsg = function (msg) {
console.log("Log:" + msg);
};
在array method裡的map(),會依引入的callback function對陣列的每個元素作處理,然後回傳一個新的陣列作為結果,這邊的callback就是函式作為引數的例子,下面用一個仿造map的函式來看看:
square作為callback時,寫在myMap小括號內並不帶()const result = myMap(square, [5, 4, 3, 2, 1]);
,因為此時並沒有真的要執行square,要一直到result.push(callback(arg[i]));
這行才把square
丟進去callback(arg[i])
並執行
//宣告一個將引數作二次方的函式,等等要作為引數
function square(x) {
return x * x;
}
//宣告一個手刻的仿map函式,有兩個參數要引入
//一個是callback函式,會對另一個引數(陣列)作一些事;第二的引數則是陣列
const myMap = function (callback, arg) {
let result = [];
for (let i = 0; i < arg.length; i++) {
console.log(i);
result.push(callback(arg[i]));
}
return result;
};
//
const result = myMap(square, [5, 4, 3, 2, 1]);
當return一個函式作為另一個函式的結果時,其實就是具現化了柯里化這件事,下面的greeting函式回傳一個匿名函式(其內容是印出一行訊息),我們可以依不同的引入內容,再另存在另一個變數裡,就像下面的sayHi函式和sayHello函式。
const greeting = function (msg) {
return function () {
console.log(`${msg} world!`);
};
};
const sayHi = greeting("hi");
const sayHello = greeting("Hello");
sayHi(); //hi world!
sayHello(); //hello world!
我們還可以把上面的程式稍微改寫,能引入另一個引數在匿名函式裡以取代world固定的字,改成可改變的名字,增加程式的彈性。
const greeting = function (msg) {
return function (person) {
console.log(`${msg} ${person}`);
};
};
const sayHi = greeting("hi");
const sayHello = greeting("Hello");
sayHi("Pam"); //hi Pam!
sayHello("John"); //hello John!
first class function的概念以初學者來看,好像沒什麼特別的,我還記得當初看書看到這個概念,覺得..啊所以勒?但其實是functional programming的基石,很多東西都是從這個基礎上去產生變化,比如說用數學的交換律來看程式,柯里化等應用,此時的我,感覺自己好像推開了一扇門,正從門縫裡看到一個新的世界。
wiki-頭等函數
Proessor Frisby's Mostly Adequate Guide to Functional Programming 中譯
Functional Programming (Part 1): First-Class Functions
JavaScript 一級函式 (First Class Functions)
Programming Terms: First-Class Functions