iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Modern Web

超低腦容量學習法遇到javascript系列 第 27

一個新世界:first-class function

  • 分享至 

  • xImage
  •  

first class function 定義

維基裡對於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作為函式執行的結果

當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!

functional programming的基石

first class function的概念以初學者來看,好像沒什麼特別的,我還記得當初看書看到這個概念,覺得..啊所以勒?但其實是functional programming的基石,很多東西都是從這個基礎上去產生變化,比如說用數學的交換律來看程式,柯里化等應用,此時的我,感覺自己好像推開了一扇門,正從門縫裡看到一個新的世界。

Reference

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


上一篇
為什麼要try catch
下一篇
老闆我要純的:pure function
系列文
超低腦容量學習法遇到javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言