[JS筆記] 何謂Callback Function?

Kim.H
Apr 28, 2023

--

在學習JavaScript前後端開發的路上,常常會聽到執行某個方法時參數要帶入Callback Function,在未了解真正定義之前一直覺得Callback這一詞在腦中一個很模糊的存在,本篇文章主要來記錄我是如何理解什麼是Callback這一詞。

什麼是Callback function?

簡單來說,是指某一函式執行後才依條件或依序執行的函式,因此又被稱為回呼、回調函式。例如監聽事件 addEventListener,希望使用者點擊button之後才console.log;亦或者是在後端設定路由方法route.get(path, (req,res)=>{})。兩者例子我們都可以看到在方法內傳入了兩個參數,而第二個參數皆為一個Function,此處接的就是Callback Function。

button.addEventListener(’click’, function print() { 
console.log(’hi world’)
})

// 等同下方寫法
function print() {
console.log(’hi world’)
}

button.addEventListener(’click’, print) //當參數回傳時,function name後面不加()

Callback Function的特色是可以被當作參數傳入函式中,一般來說我們不會直接使用Callback Function,而是在特定條件被執行之後才呼叫它。例如下方的範例,先暫時忘記我們平常使用console.log的方式,這裡我們將它視為一個Callback Function,只有在呼叫test函式時才會把它當成參數傳入,在外不會使用,當test內的程式碼執行完後才呼叫它。

可以透過tpyeof來確認console.log是一個function
function test(callback){
console.log('主程式執行完畢,即將呼叫callback fn()')
callback(`callback function : ${callback}`)
}

test(console.log)
//主程式執行完畢,即將呼叫callback fn()
//callback function : function () { [native code] }

由於console.log也是一個function,因此我們把他當作參數放入test()這個函式之中,函式裡的參數callback即被console.log代入,因此執行到 callback(`callback function : ${callback}`) 時,可以看成執行 console.log(`callback function : ${console.log}`),就會印出 callback function : function () { [native code] } 這段文字。

為什麼需要Callback function?

為了達到控制流程的目的,Callback的好處是我們可以自行定義函式的執行順序,使我們在開發非同步程式時,能夠確保流程順序不會出錯。

JS本身是屬於「同步」的語言,但我們在網頁應用時,總不希望程式碼不停地執行下去,或是遇到問題時會卡住而沒辦法依序執行下去吧!因此就有了「非同步」的概念出現,讓我們可以依「觸發事件」的條件來執行後續的動作。

Callback function的缺點

Callback是處理非同步的基礎,是「由內而外」的巢狀閱讀方式,而非「由上而下」,缺點是當程式碼比較複雜時,可能會導致Callback Hell(回呼地獄),導致難以閱讀、維護,如下圖。

source: Carlos Vega

為了解決Callback Hell的問題,後續JavaScript又有提出Promise、async / await等用法,未來會再針對者兩個方法整理筆記出來。

非同步處理三部曲:

  1. 何謂Callback function?
  2. 避免Callback Hell的Promise
  3. 使閱讀更直覺的Async / await

--

--

Kim.H

現任菜鳥後端工程師 / 2022.12 正式踏入轉職之旅 - 2023.09轉職成功