Day06 JavaScript Higher-Order Function(高階方程式)

閱讀時間約 7 分鐘


Higher-Order Function(高階方程式) 是什麼

Higher-Order Function簡稱HOF,是指一個以function作為參數的function或者回傳function的function,我知道目前聽起來非常抽象,我們舉一個我們之前就已經看過的例子。

以Function作為參數的HOF

在第三天的內容裡,我們看見內建的document這個object的內建method:addEventListener(),他的使用格式是這樣:

raw-image

在之前的例子裡,我們監聽”click”(滑鼠點擊事件),讓畫面被點擊的時候出現alert。

raw-image
點擊預覽區域後之後就出現alert了。

點擊預覽區域後之後就出現alert了。

值得再次注意的是傳進去的fireAfterClick()沒有加上括號,我們只是給他工具,不是要他馬上用,詳見我們第三天提到的例子。

今天再一次看addEventListener()的理由是,它就是一個HOF,因為它其中一個參數是function fireAfterClick()

這件事情在程式語言的世界裡是很特別的,因為在某些其他語言(例如C++)裡面,你不能以function作為argument,只能是string、number之類的值。在JavaScript內可以做到這件事情。下一個例子可能也會讓學過C++的人感到震驚。

回傳Function的HOF

如果你要寫幾個加法的function,你可以這樣寫。

raw-image

把指定的數字x放進去,每個function就會按照指定的加法規則計算出結果,並且回傳。這裡出現了關鍵字return,會把計算的結果回傳,幾天後會有關於它更詳細的解釋。


問題就是,其中大部分的規則都是重複的,我們可以試著整理下這個規則,下面的內容看起來會很可怕,我會慢慢解釋。

raw-image

相對於本來的回傳一個number,這裡回傳的是一個function(你可以看見他也有完整的function 名稱(){} 關鍵字及符號結構)。由於createAddNumber()回傳的是function,它被稱為HOF。相較於其他語言JS顯得很特別,因爲function居然可以回傳function,function在JS裡面被當作一般的string或number對待。


既然JS裡function被當成string或number一樣對待,他也可以被放進變數裡面,像這樣。

raw-image

我們把回傳的function指定成變數(就像設定 let myNumber = 5 那樣)。這件事在某些語言裡面是不能發生的,因為這樣JS常被認為是彈性最高的語言之一。


雖然把加法特地改成這樣確實有些多此一舉,但它成功解釋了function回傳function的情境。在目前的情況下,我們把加法邏輯整理了起來,重複利用。換句話說,我們現在正在用createAddNumber()裡重複的邏輯來製作addOne()addTwo()addThree()…。


接著我們實際測試。

raw-image

addOne()為例,傳入5,它就會計算 5 + 1,得到結果為6並回傳,最後我們用document.write()6印在畫面中。

內建的HOF

之前就有提到JS裡面內建了幾乎數不清的method可以使用,其中有不少都是HOF(以function作為參數或者回傳function)。其中最強大、最常見的非array的method莫屬。

假設我們現在有一個array,裡面存了我最喜歡的顏色。

raw-image


每個array裡面都有一個內建的method:forEach()。這個method可以讓我們很方便的對array裡的每一項內容做重複的操作。它需要一個參數:一個function來告訴它你想對array裡的每項做什麼操作。例如我想將最喜歡的顏色都寫成句子「I love color: ___. 」,印在畫面上。

raw-image
raw-image

為了方便閱讀,我們一樣在結尾加上HTML的換行符號<br>。最後看起來就會像下面這樣:

raw-image


這時候如果加上新的顏色'orange',它也會自動的新增在畫面,非常方便。

raw-image

由於forEach()裡面的參數是另外一個function,它就是HOF。像這樣在array裡面內建的HOF還有非常非常多,包含常常用到的map()filter()等等,在下個單元會講到。

小結

相信現在讀到你已經頭昏腦脹,有太多新的名詞、新的內建method出現。但別擔心,我們的重點還是了解,Higher-Order Function就是參數是另一個function或者回傳另一個function的函數,在程式語言裡面這是相對特別的用法。在JavaScript裡有非常多實用且常見的內建method,它們都是HOF,所以學習HOF對於了解JavaScript的運作有非常大的重要性。


而明天是我覺得學習function以來最重要的觀念。他們可以用來分類function,讓你知道很快地知道某個function預期的行為結果,那就是Mutating FunctionReturning Function兩者之間的差異


Resource

今日Codepen

連結

Credits

關於我

我是Erkin, 一個網站開發者。
有任何疑問或是想勘誤的話歡迎聯繫。

0會員
11內容數
留言0
查看全部
發表第一個留言支持創作者!
HCY 71的沙龍 的其他內容
做選擇的時刻 程式語言中,做選擇是非常常見的一件事。例如:判斷登入者身份是否為管理員、當前設定是否為深色模式等。想像我們有一個交易系統,我們需要判斷使用者帳戶餘額是否足夠購買Apple Vison Pro。首先,我們必須認識if跟else。 if 和 else if跟else是常見的條件判
什麼是Array(陣列) array跟object一樣是一種資料的容器,不同的是array通常用來裝同類別的資料,就像是書架用來收納書。要在書架裡放書跟其他東西也是可以的,但就是有點奇怪,不是大家習慣的做法。 array透過[]宣告。 假設我們要儲存使用者喜歡的顏色這筆資料,每筆資料的類型
今天我們會繼續用CodePen。 為何需要Object(物件) 在開始介紹object之前,我們先來討論object為何需要存在。 想像我們有一筆關於網站使用者的資料,裡面包含使用者名稱、年紀,還有sayHelloToUser()這個function。 我們可以逐個定義、宣告這些資料。
從今天開始往後的的內容會有許多的「註解」,程式不會執行被註解的內容,註解只是方便開發者辨識。JS內的註解主要有兩種。單行註解是在程式碼前方加上//,可以透過快捷鍵cmd(ctrl) + / 完成。多行註解則是用/* 及 */前後包夾要註解的內容。 轉換環境 從上個單元的經驗,有些人可能會發現
歡迎來到「10日 JavaScript」,有鑑於自己先前學習JavaScript的流程過於破碎且凌亂,特別整理了這份文章,包含了基本語法、資料型態、常用函數及JavaScript實作等。希望能幫助到一些需要用到、想要了解JavaScript的人,讓大家不必再走太崎嶇的路。內容會分成10篇,一步步
做選擇的時刻 程式語言中,做選擇是非常常見的一件事。例如:判斷登入者身份是否為管理員、當前設定是否為深色模式等。想像我們有一個交易系統,我們需要判斷使用者帳戶餘額是否足夠購買Apple Vison Pro。首先,我們必須認識if跟else。 if 和 else if跟else是常見的條件判
什麼是Array(陣列) array跟object一樣是一種資料的容器,不同的是array通常用來裝同類別的資料,就像是書架用來收納書。要在書架裡放書跟其他東西也是可以的,但就是有點奇怪,不是大家習慣的做法。 array透過[]宣告。 假設我們要儲存使用者喜歡的顏色這筆資料,每筆資料的類型
今天我們會繼續用CodePen。 為何需要Object(物件) 在開始介紹object之前,我們先來討論object為何需要存在。 想像我們有一筆關於網站使用者的資料,裡面包含使用者名稱、年紀,還有sayHelloToUser()這個function。 我們可以逐個定義、宣告這些資料。
從今天開始往後的的內容會有許多的「註解」,程式不會執行被註解的內容,註解只是方便開發者辨識。JS內的註解主要有兩種。單行註解是在程式碼前方加上//,可以透過快捷鍵cmd(ctrl) + / 完成。多行註解則是用/* 及 */前後包夾要註解的內容。 轉換環境 從上個單元的經驗,有些人可能會發現
歡迎來到「10日 JavaScript」,有鑑於自己先前學習JavaScript的流程過於破碎且凌亂,特別整理了這份文章,包含了基本語法、資料型態、常用函數及JavaScript實作等。希望能幫助到一些需要用到、想要了解JavaScript的人,讓大家不必再走太崎嶇的路。內容會分成10篇,一步步
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習AE表達式。】 - 第七章-懸賞,快來幫幫村長!學會 AE表達式(expression) - function
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習AE表達式。】 - 第七章-懸賞,快來幫幫村長!學會 AE表達式(expression) - function