查閱了網上的一些內容,自己總結了一下,算是比較全面了。
定義:一個函數指針作為另一個函數A()的參數被調用時,它是回調函數。
A(int m, int n, bool * f(m,n))
1. 既然是函數的參數,就具備了擴展性和代碼重用的作用,因為形參不變,實參是可變的。所以調用時,可以A(x,y,B),也可以A(x,y,C),這里B和C都是回調函數,有點像虛函數。(B和C可以實現不同的功能,或以不同的方式實現)
----場景:代碼重用。A(x, y, isGreater), A(x, y , isSmaller)
2. 在定義A()時,甚至不需要知道實際的被調函數的名字,只要知道這個接口的格式,即參數,返回值,實現功能。所以甚至在確定被調函數如何實現之前,只要約定好接口和功能,就可以進行A()的定義工作。(實現相同的功能)
----場景:框架編程,並行工作。業務流程步驟編排(不管具體實現)。
A(bool * f())
3. 甚至被調函數f()到底實現什么功能,也是可以不定義的。只是在A里面規定好條件觸發,將具體做什么的決定權交給用戶。
----場景:事件,通知。
我猜OnTimer()應當就是一個回調函數,開放給用戶自定義動作。整個定時器的機制已經是預定義好的。
main函數其實也是。都是事件機制。
4. 結合多線程異步使用。
----場景:工作繼續進行,主函數先結束。
void A(url, call)
{
開啟url線程,傳入call
函數本身返回.
}
5.結合延遲函數。
void A(call)
{
setTimeout(call, 10000)
函數本身返回.
}
其實叫回調函數總讓人有些難以理解,直接叫被調函數就得了。
callback很多人都會舉的一個例子是回家后打電話,這個例子其實並不清晰,如何將這個例子的元素對應到函數上面?我覺得不必深究,認識到callback本身隱含了延遲,觸發,自定義的意義即可,對應了上面3,4,5的作用,可能這也是應用最廣的場合了。
引用這個文章的一句話(https://www.cnblogs.com/moxiaowohuwei/p/8438236.html):
所以回調與同步、異步並沒有直接的聯系,回調只是一種實現方式,既可以有同步回調,也可以有異步回調,還可以有事件處理回調和延遲函數回調,這些在我們工作中有很多的使用場景。所以其實並不是我們不認識回調函數,而是我們都縈繞在了這個“callback“ 這個詞上,當你在一個函數中看到它是就會困惑,其實它只是一個形參名字而已