JS中的高階函式是什麼?
聽到龍哥常說JS中的function是一等公民、高階函式,只知道聽起很威,不知道到底是為什麼這麼威,於是英文苦手的我先查了維基百科:
具有函數參數的函數,稱為高階函數。
????總而言之,就是如果程式語言中,當一個函數可以當作參數傳送可以 return 整個函數,可以塞給變數或是可以存儲在資料結構中,那就稱為高階函數。
聽起來很酷啊,我以為函式都要額外寫,有時候有名字有時候沒有,匿名函式還可以寫成胖箭頭之類的,沒想到還有分高低階。
那麼還有哪些東西是一等公民呢?不說你不知道,其實字串就算是一等公民,因為他符合剛剛上述說的,可以當參數、可 return 可以塞給變數也可以存在資料結構。但是函式為什麼要特別拿出來說嘴?這不是很平常的事情嗎?
對大部分程式語言的字串來說,的確是很常見的事情,但是不同的程式語言中,可就不是所有的函式都能當一等公民了(還得投對程式語言的胎才有這個高級身份)
像在C家族裡,Java 就只有部分函式屬於一等公民 ; 函數式的程式語言設計中,Lisp 家的函式也不是一等公民 ; 腳本語言設計的 Ruby (沒錯就是你知道的那個)它們家的函式也不是一等公民,哎唷仔細想想能擁有一等公民的身份也是有夠炫砲的。
那麼為什麼 JS 中的函式可以成為一等公民呢?
因為函式在 JS 裡被視為一個物件,所有物件能做的事情,函式都可以做。
那麼高階函式有什麼好處呢?
const function1 = function(value){
return value + 1
}
const function2 = function(value, f){
return f(value) + 2
}
console.log(function2(10, function1)) //13
從上面可以知道,當我可以在 function2 中啟動 function1 後,我可以請裡面的函式幫我做很多事情,而外面的 function 2 就好好的引入數值即可,像是JS 中的 map 黑魔法,背後原理就是這個概念。
下次我們再來看看當函式中包著函式,所謂的閉包是什麼意思。