什麼是 Callback Function?
簡介
Callback Function,又稱回呼函式,簡單來說,就是在一支函式執行完後,才要執行的函式。
在 ES6 中的 Promise 語法還未能使用前,就很常使用 Callback function 來接收非同步的資料。
例如一支函式First()
,在執行結束才執行Second()
,這個Second()
就是一支Callback Function。
舉例來說
程式碼
1 |
|
輸出:
跟下面這段程式是相同的。
程式碼
1 |
|
輸出:
但是,如果是以下的情況就不同了。
非同步處理 Asynchronous
原本First()
中直接印出First文字的工作,改交給setTimeout()
這個非同步(Asynchronous)程式處理。
setTimeout()
的第一個參數為時間到時要被執行的程式,第二個參數為要延遲的時間(毫秒)。
1 |
|
輸出:
為什麼Second會出現在First上面?
因為setTimeout()
是非同步,所以下面的Second()
不須等待First()
執行完就會先被執行了。
所以為了確保Second()
,要在First()
中的setTimeout()
後執行。
我們可以將Second()
做為callback函式以參數傳入First()
。
1 |
|
同步與非同步的差異?
同步(Synchronous),指程式必須等待前面的程式執行完才能執行。
非同步(Asynchronous),指程式不須等待前面的程式執行完就能執行。
同步就像只有一個隊伍,而非同步有好幾個隊伍執行。
結論
因此Callback function的作用,是保證一支程式會在一支程式執行後才執行。
至於被傳入callback函式的函式,也就是上面的First(callback)
,又稱為Higher Order Function(高階函式)。
所以Callback Function又可以解釋為「以參數型態傳入另一個函式的函式」。
白話一點就是,把函式當作另一個函式的參數,透過另一個函式來呼叫它。
補充
當函式之間的相依過深,callback太多層之後,就會出現很常看到,解說文章裡的波動拳圖片XD。
如果真的必須要寫到多層,就可以使用Promise來避免這種情況。
參考文章
JavaScript 什麼是Callback函式 (Callback Function)?