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

更新於 2024/11/04閱讀時間約 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, 一個網站開發者。
有任何疑問或是想勘誤的話歡迎聯繫。

avatar-img
0會員
11內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習 Ae 表達式。】 - 第七章-懸賞,快來幫幫村長!學會 Ae 表達式 - function ˙function (函數)是什麼? ˙函數應用在文字圖層上 ˙函數應用在 Position 上 ˙將位置限制在 Composition 範圍內
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
【這個系列,目標是以比較輕鬆的方式讓大家一起學習 Ae 表達式。】 - 第七章-懸賞,快來幫幫村長!學會 Ae 表達式 - function ˙function (函數)是什麼? ˙函數應用在文字圖層上 ˙函數應用在 Position 上 ˙將位置限制在 Composition 範圍內