查閱了網上的一些內容,本身總結了一下,算是比較全面了。html
定義:一個函數指針做爲另外一個函數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()的定義工做。(實現相同的功能)函數
----場景:框架編程,並行工做。業務流程步驟編排(無論具體實現)。url
A(bool * f())spa
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「 這個詞上,當你在一個函數中看到它是就會困惑,其實它只是一個形參名字而已