# 淺談 JavaScript Callback Function
## 就字面初步認識 callback function
`callback` 在中文可能會被翻成回呼、回調,假使從中文字面看不出所以然,那就改用英文的角度來看看吧!英文中 "call back" 有**等一下再回來做某事**的意思,例如:回撥電話。
`callback function` 就字面上可理解成 ── **待會再執行的函式**,就是一種**先不要**的概念。
## 什麼是 callback function
先來看看 MND 的定義
> A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.
簡單來說「從參數傳入一個函式再執行它」這個動作,在 JacaScript 中被稱為 **callback**,而被傳入的函式就是所謂的 **callback function**。
不懂沒關係,我們用兩個函式來舉例說明
```=javaScript
function printResult(data) {
return console.log(`result: ${data}`);
}
function sum(a, b, callback_func) {
const ans = a + b;
callback_func(ans);
}
sum(10, 10, printResult)
```
output
```
result: 20
```
以上面的程式碼來說,在呼叫 `sum()` 時傳入了三個參數 (兩個 number 和一個 function),於此例中 `printResult()` 就是 callback function。
### 注意!callback function **不可以**加上括號`()`!
```=javaScript
// 正確
sum(10, 10, printResult)
// 錯誤
sum(10, 10, printResult())
```
加了括號就會得到一個 `Uncaught TypeError: callback_func is not a function` 的錯誤。如果你覺得奇怪,為什麼我的 funciton 不是 funciton,那我們就把原本的程式碼補上 log 來看看
```=javaScript
function printResult(data) {
console.log("[2] do printResult")
return console.log(`[3] result: ${data}`);
}
function sum(a, b, callback_func) {
const ans = a + b;
console.log("[1] 參數 callback_func 是: ", callback_func)
callback_func(ans);
}
sum(10, 10, printResult)
```
output
```
[1] 參數 callback_func 是: ƒ printResult(data) {
console.log("[2] do printResult")
return console.log(`[3] result: ${data}`);
}
[2] do printResult
[3] result: 20
```
上面的 [2]、[3] 是因為 `sum()` callback 才印出來 ,就是 `callback_func(ans);` 這行。
接著試試錯誤的寫法
```=javaScript
sum(10, 10, printResult())
```
output
```
[2] do printResult
[3] result: undefined
[1] 參數 callback_func 是: undefined
Uncaught TypeError: callback_func is not a function
```
你會發現**先不要執行**的 callback function ── `printResult()` 直接執行了!所以才會先印出 [2]、[3],輪到 `sum(10, 10, printResult())` 執行時,`printResult()` 已經執行完畢,第三個參數等於沒有傳入東西是 `undefined`,等到 `sum()` callback 時就出錯,然後跳錯誤訊息。
###### tags: `JavaScript` `筆記`