函式定義
實現的機制
[1]定義一個回調函式;
[2]提供函式實現的一方在初始化的時候,將回調函式的函式指針註冊給調用者;
[3]當特定的事件或條件發生的時候,調用者使用函式指針調用回調函式對事件進行處理。
使用優點
•因為使用此函式可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函式。簡而言之,回調函式就是允許用戶把需要調用的函式的指針作為參數傳遞給一個函式,以便該函式在處理相似事件的時候可以靈活的使用不同的方法。
想知道回調函式在實際中有什麼作用?先假設有這樣一種情況:我們要編寫一個庫,它提供了某些排序算法的實現(如冒泡排序、快速排序、shell排序、shake排序等等),為了能讓庫更加通用,不想在函式中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,能讓庫可用於多種數據類型(int、float、string),此時,該怎么辦呢?可以使用函式指針,並進行回調。
回調可用於通知機制。例如,有時要在A程式中設定一個計時器,每到一定時間,A程式會得到相應的通知,但通知機制的實現者對A程式一無所知。那么,就需一個具有特定原型的函式指針進行回調,通知A程式事件已經發生。實際上,API使用一個回調函式SetTimer()來通知計時器。如果沒有提供回調函式,它還會把一個訊息發往程式的訊息佇列。
另一個使用回調機制的API函式是EnumWindow(),它枚舉螢幕上所有的頂層視窗,每個視窗都可以通過它調用另一個程式提供的函式,並傳遞視窗的處理程式。例如:如果被調用者返回一個值,就繼續進行疊代;否則,退出。EnumWindow()並不關心被調用者在何處,也不關心被調用者用它傳遞的處理程式做了什麼,它只關心返回值,因為基於返回值,它將繼續執行或退出。
不管怎么說,回調函式是繼承自C語言的。在C++中,應只在與C代碼建立接口或與已有的回調接口打交道時,才使用回調函式。除了上述情況,在C++中應使用虛擬方法或仿函式(functor),而不是回調函式。
jQuery函式
Callback 函式在當前動畫 100% 完成之後執行。
動畫的問題
許多 jQuery 函式涉及動畫。這些函式也許會將 speed或 duration作為可選參數。
例子: $("p").hide("slow")
speed或 duration參數可以設定許多不同的值,比如 "slow", "fast", "normal" 或毫秒。
實例
$("button").click(function(){ $("p").hide(1000); });
由於 JavaScript 語句(指令)是逐一執行的 - 按照次序,動畫之後的語句可能會產生錯誤或頁面衝突,因為動畫還沒有完成。
為了避免這個情況,您可以以參數的形式添加 Callback 函式。
函式的調用
當動畫 100% 完成後,即調用 Callback 函式。
典型的語法
$(selector).hide(speed,callback);
callback參數是一個在 hide 操作完成後被執行的函式。
錯誤
(沒有 callback)
$("p").hide(1000); alert("The paragraph is now hidden");
正確
(有 callback)
$("p").hide(1000,function(){ alert("The paragraph is now hidden"); }); 結論:如果您希望在一個涉及動畫的函式之後來執行語句,請使用 callback 函式。
凡是由你設計卻由windows系統呼叫的函式,統稱為callback函式。某些API函式要求以callback作為你參數之一。如SetTimer, LineDDA ,EnumObjects。
回調函式是由開發者按照一定的原形進行定義的函式(每個回調函式都必須遵循這個原則來設計)
例如:
----------------------------------------
BOOL CALLBACK DialogProc(
HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
----------------------------------------
說明:
回調函式必須有關鍵字 CALLBACK;
回調函式本身必須是全局函式或者靜態函式,不可定義為某個特定的類的成員函式
2回調函式並不由開發者直接調用執行(只是使用系統接口API函式作為起點)
3回調函式通常作為參數傳遞給系統API,由該API來調用
4回調函式可能被系統API調用一次,也可能被循環調用多次