一級函式和高階函式


Posted by Andy Tsai on 2021-06-21

一級函式 First-class Function

一級函式的意思是,函式和其他人一樣,都是一級公民,我們可以把函式存在陣列中,當作參數傳遞,賦予至變數等等。

這並非是 JavaScript專有的特性,只要該語言把「函式視為變數值看待」,就是有一級函式的特性。

高階函式 higher order function

我們可以說JS因為有一級函式特性,所以可以有高階函式的用法。
所謂高階函式,就是能接收函式做為參數,或回傳函式的函式

如果有在用ES6語法,其實我們常常在用高階函式,
像是ES6中對陣列操作的方法map、filter就是高階函式,它們都是接收函式為參數

let ary = [1,2,3]

let newAry = ary.map(
  function(i){
    return i * 2 
  }
)

let newAry2 = ary.filter(
  function(i){
    return i === 2 
  }
)

console.log(newAry1) //[2, 4, 6]
console.log(newAry1) //[2]

是不是有點概念了,接下來我們就來實作一個類map方法,加深印象。

這個方法要做的事項有

  • 創造一個function,接受函式和陣列
  • 創建變數(空陣列),用於存放結果
  • 對傳入的陣列執行迴圈
  • 逐個取得陣列元素,並取得函式修改後的回傳值
  • 回傳值逐個放入結果變數裡
  • 迴圈執行完畢後,回傳結果
function map(fn, array){
  let result = [];
  for(let i=0;i<array.length;i++){
    result.push(fn(array[i]))
  }
  return result;  
}

如此一來我們的類map方法就完成了,執行看看

let newMap = map(
  function(i){
    return i * 2
  },
  ary
)

console.log(newMap) //[2, 4, 6]

運行結果和我們預期的一樣,很好

總結

JS中函式是一級公民的特性,讓我們可以靈活的對函式做不同組合,使用出高階函式,
也相當適合用函數式編程(functional programming)開發。










Related Posts

CS50 TCP/IP DNS HTTP

CS50 TCP/IP DNS HTTP

Request 額外補充

Request 額外補充

那些大學課堂的Project:LineBot(壹)專案建置

那些大學課堂的Project:LineBot(壹)專案建置


Comments