基本概念: Callback Function

Justin Hollly
Aug 22, 2021

--

這邊先介紹我所認知的知識,如有出入,歡迎討論。以下例子都會以Javascript 為背景語言介紹,這邊只著重於名詞定義釐清,因為callback的應用太廣了,所以會在每個範圍簡單舉例介紹應用。

Callback function常常看到跟非同步(Asynchronous)牽扯再一起,但實際上callback定義單純只是把 ”function” 本身當作argument傳入另一個function,並且在該function呼叫此argument。所以callback本身並沒有同步、非同步的問題,而是可以放在同步或是非同步的function 中來呼叫。文字敘述不清楚,直接看例子。

// Output:
haha

上面log出的結果是haha,這邊還沒有進入callback的階段,但是我們可以知道function 若是放在argument的地方執行,會直接將 laugh 執行完,並且獲得return值,也就是說,’laugh()’ 就是 ‘haha’ 這個return值的代名詞。

這邊注意到是我們有加( ),讓laugh function執行了,假如沒有加上( ),laugh 這的代名詞代表的就不是return 值,而是整個function 本身(裡面的每一行的代名詞),但是注意,僅僅只是代名詞而已,並不會執行 'laugh'。

// Output:
[Function: laugh]

也可以用檢查他的type:

console.log(typeof laugh)
// function

這邊就可以了解前置作業了,一個function 宣告成功後,除了去執行他,也可以把它當作argument 傳來傳去,但前提是他不能加(),只能是名字本身(laugh 而不是 laugh())。

1. 在同步中可以舉簡單例子應用:

// Output:
15
50

如此就可以更方便的操作重複性的功能。

Array本身method也有可以丟callback進去的方式,例如(MDN上的例子):

取自MDN array.forEach / array.map

2. 在非同步例子應用: (這就非常多而且是最常使用的,幾乎每個Web API 都會需要丟一個callback進去)

// Output:
haha
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function

呼應上面提到的,不能加( ),否則就是傳入 return 值,因此傳入的東西為 ‘this is haha’,會被setTimeout 判斷為非funtion 格式(為string),因此不能執行。

結論:

  1. Callback function 本身沒有同步、非同步,本身就只是一個function 被當成 argument傳入另一個 同步,或是非同步的function。
  2. 注意有沒有加( ),沒有加就是 function本身每一行statement 的代名詞。
  3. 如果有加( ),就是 return值 的代名詞。

--

--

Justin Hollly
Justin Hollly

No responses yet