什麼是回調函數?

General 更新 2024-12-03

回調函數和普通函數有什麼區別?

沒有任何區別

非要說有區別,就是調用方式

普通函數,被其他函數調用時,是在調用者內部直接寫函數名調

回調函數,通常是作為參數傳遞給調用者,調用者並不知道自己調用的到底是什麼

另外有一點,回調函數大多用於多線程的情況

回調函數是什麼?

首先做一個形象的比喻:,讓我做完後給你打電話,我就打給你了,你拿到我的成果加到你的工作中,繼續完成其它的工作.這就叫回叫,手機是我通知你的手段,它就是回叫函數,也叫回調函數.  回調函數是應用程序提供給Windows系統DLL或其它DLL調用的函數,一般用於截獲消息、獲取系統信息或處理異步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵守事先規定好的參數格式和傳遞方式,否則DLL一調用它就會引起程序或系統的崩潰。通常情況下,回調函數採用標準WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自己定義調用方式,但客戶程序也必須遵守相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回之前自己負責把參數從堆棧中彈出。理解回調函數  程序在調用一個函數(function)時(通常指api).相當於程序(program)呼叫(Call)了一個函數(function)關係表示如下:  call(調用)  program --------------------→ dll  程序在調用一個函數時,將自己的函數的地址作為參數傳遞給程序調用的函數時(那麼這個自己的函數稱回調函數).需要回調函數的 DLL 函數往往是一些必須重複執行某些操作的函數.關係表示如下:  call(調用)  program --------------------→ dll  ↑ ¦  ¦_______________________________¦  callback(回調)  當你調用的函數在傳遞返回值給回調函數時,你就可以利用回調函數來處理或完成一定的操作。至於如何定義自己的回調函數,跟具體使用的API函數有關,很多不同類別的回調函數有各種各樣的參數,有關這些參數的描述一般在幫助中有說明回調函數的參數和返回值等.其實簡單說回調函數就是你所寫的函數滿足一定條件後,被DLL調用!  也有這樣的說法(比較容易理解):  回調函數就好像是一箇中斷處理函數,系統在符合你設定的條件時自動調用。為此,你需要做三件事:  1. 聲明;  2. 定義;  3. 設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便於DLL調用。NET Framework 開發人員指南  回調函數是託管應用程序中可幫助非託管 DLL 函數完成任務的代碼。對回調函數的調用將從託管應用程序中,通過一個 DLL 函數,間接地傳遞給託管實現。在用平臺調用調用的多種 DLL 函數中,有些函數要求正確地運行託管代碼中的回調函數。  回調函數和實現要從託管代碼中調用大多數 DLL 函數,可創建該函數的託管定義,然後調用該函數。此過程比較直接。  要使用需要回調函數的 DLL 函數,則會有一些附加的步驟。首先,必須在文檔中查閱該函數,確定該函數是否需要回調。接著,必須在託管應用程序中創建回調函數。最後,調用該 DLL 函數,並將指向回調函數的指針當作參數進行傳遞。右圖總結了這些步驟。  回調函數非常適合在重複執行任務的情況下使用。

什麼是回調函數

回調函數就是你寫好一個函數,讓預先寫好的系統來調用。你去調用系統的函數,是直調。讓系統調用你的函數,就是回調。但假如滿足於這種一句話結論,是不會真正明白的。

回調函數可以看成,讓別人做事,傳進去的額外信息。

比如,A 讓 B 做事,根據粒度不同,可以理解成 A 函數調用 B 函數,或者 A 類使用 B 類,或者 A 組件使用 B 組件等等。反正就是 A 叫 B 做事。

當 B 做這件事情的時候,自身的需要的信息不夠,而 A 又有。就需要 A 從外面傳進來,或者 B 做著做著主動向外面申請。對於 B 來說,一種被動得到信息,一種是主動去得到信息,有人給這兩種方式術語,叫信息的 push,和信息的 pull。

A 調用 B,A 需要向 B 傳參數。如簡單的函數:

int max(int a, int b);

要使用這函數,得到兩者最大的值, 外面就要傳進來 a, b。這個很好理解。

void qsort(void *, size_t, size_t, int (*)(const void *, const void *));

而這個函數用於排序,最後一個參數就是回調函數,似乎就比較難以理解了。這是因為人為割裂了代碼和數據。

我們暫停一下,看看計算機中比較詭異的地方,也就是代碼(code)和數據(data)的統一。這是一個檻,如果不打通這個,很多概念就不清楚。我們常常說計算機程序分成 code 和 data 兩部分。很多人就會覺得,code 是會運行的,是動的,data 是給 code 使用,是靜態的,這是兩種完全不同的東西。

其實 code 只是對行為的一種描述,比如有個機器人可以開燈,關燈,掃地。如果跟機器人約定好,0 表示開燈,1 表示關燈,2 表示掃地。我發出指令串,0 1 2,就可以控制機器人開燈,關燈,掃地。再約定用二進制表示,兩位一個指令,就有一個數字串,000111,這個時候 000111 這串數字就描述了機器人的一系列動作,這個就是從一方面理解是 code,它可以控制機器人的行為。但另一方面,它可以傳遞,可以記錄,可以修改,也就是數據。只要大家都協商好,code 就可以編碼成 data, 將 data 解釋運行的時候,也變成了 code。

code 和 data 可以不用區分,統一稱為信息。既然 int max(int a, int b) 中 int,double 等表示普通 data 的東西可以傳遞進去,憑什麼表示 code 的函數就不可以傳進去了。有些語言確實是不區分的,它的 function(表示code)跟 int, double 的地位是一樣的。這種語言就為函數是第一類值。

而有些語言是不能存儲函數,不能動態創建函數,不能動態銷燬函數。只能存儲一個指向函數的指針,這種語言稱為函數是第二類值。

另外有些語言不單可以傳遞函數,函數裡面又用到一些外部信息(包括code, data)。那些語言可以將函數跟函數所用到的信息一起傳遞存儲。這種將函數和它所用的信息作為一個整體,就為閉包。

將代碼和數據打通,統一起來。過了這個檻,很多難以理解的概念就會清晰很多。

現在我們再回頭看看回調函數。回調函數也就是是 A 讓 B 做事,B 做著做著,信息不夠,不知道怎麼做了,就再讓外面處理。

比如上述排序例子,A 讓 B 排序,B 會做排序,但排序需要知道哪個比哪個大,這點 B 自己不知道,就需要 A 告訴它。而這種判斷那個大,本身是一種動作,既然 C 語言中不可以傳進第一值的函數,就設計成傳遞第二值的函數指針,這個函......

js回調函數是什麼意思

www.jb51.net/article/59447.htm

以後這麼簡單的問題不要再這裡問了,可以直接查

怎麼理解回調函數?回調函數有什麼好處

簡單點說,用戶是實現方,實現方需要調用A()函數,但為了A()函數具有通用性,需要根據實現方的意願調用實現方提供的飢數cbB(),在這裡cbB()即為回調函數。在Windows編程中回調函數用途很廣泛。

什麼是回調函數

回調函數可以把調用者與被調用者分開。調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。

一個例子,音頻採集的數據輸出,因為音頻採集後,音頻數據要交給使用者使用,但使用者又不知道什麼時候數據滿了,可以讀了,所以一般將其設置為回調函數,由採集音頻模塊在音頻採集滿後調用,用戶只需要設置要回調函數指針,具體實現用戶自行設置,其實質反映到用戶寫的自己的真正的數據處理函數。

c語言回調函數例子,看了就明白什麼是回調函數了

回調函數 就是上層調用 設置下去

底層通過函數指針調用上層函數

多文件中才有用 單文件可以模擬

比如

#include typedef void (*pFuncCb) (int);//定義回調函數。void callback1(int a){ printf("callback function1 is called and parameter = %d\n", a);//打印1}void callback2(int a){ printf("callback function2 is called and parameter = %d\n", a);//打印2}pFuncCb callback_function;void lowerFunc(int n){ int i; for(i = n; i < n+10; i ++) if(callback_function) callback_function(i);}int main(){ callback_function = callback1; lowerFunc(1);// 會打印十次 打印1, 1到10 callback_function =NULL; lowerFunc(10);//沒有打印。 callback_function = callback2; lowerFunc(100);// 會打印十次 打印2, 100到110 return 0;}

什麼叫CallBack函數,怎麼用回調函數

什麼叫CallBack函數,怎麼用回調函數

格式 字符意義

d 輸入十進制整數

o 輸入八進制整數

x 輸入十六進制整數

u 輸入無符號十進制整數

f或e 輸入實型數(用小數形式或指數形式)

c 輸入單個字符

s 輸入字符串

2) “*”符:用以表示該輸入項,讀入後不賦予相應的變量,即跳過該輸入值。

如:

scanf("%d %*d %d",&a,&b);

當輸入為:1 2 3時,把1賦予a,2被跳過,3賦予b。

3) 寬度:用十進制整數指定輸入的寬度(即字符數)。

例如:

scanf("%5d",&a);

輸入:12345678

只把12345賦予變量a,其餘部分被截去。

又如:

scanf("%4d%4d",&a,&b);

輸入:12345678

將把1234賦予a,而把5678賦予b。

什麼是回調函數,上一個文檔

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

因為可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。簡而言之,回調函數就是允許用戶把需要調用的方法的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。

想知道回調函數在實際中有什麼作用?先假設有這樣一種情況:我們要編寫一個庫,它提供了某些排序算法的實現(如冒泡排序、快速排序、shell排序、shake排序等等),為了能讓庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,能讓庫可用於多種數據類型(int、float、string),此時,該怎麼辦呢?可以使用函數指針,並進行回調。

回調可用於通知機制。例如,有時要在A程序中設置一個計時器,每到一定時間,A程序會得到相應的通知,但通知機制的實現者對A程序一無所知。那麼,就需一個具有特定原型的函數指針進行回調,通知A程序事件已經發生。實際上,API使用一個回調函數SetTimer()來通知計時器。如果沒有提供回調函數,它還會把一個消息發往程序的消息隊列。

另一個使用回調機制的API函數是EnumWindow(),它枚舉屏幕上所有的頂層窗口,每個窗口都可以通過它調用另一個程序提供的函數,並傳遞窗口的處理程序。例如:如果被調用者返回一個值,就繼續進行迭代;否則,退出。EnumWindow()並不關心被調用者在何處,也不關心被調用者用它傳遞的處理程序做了什麼,它只關心返回值,因為基於返回值,它將繼續執行或退出。

不管怎麼說,回調函數是繼承自C語言的。在C++中,應只在與C代碼建立接口或與已有的回調接口打交道時,才使用回調函數。除了上述情況,在C++中應使用虛擬方法或仿函數(functor),而不是回調函數。

jQuery中方法回調函數什麼用?

函數處理返回來的數據,比如以下代碼是把返回的數據添加到列表中

$.ajax(

{

type: "get",

datatype: "json",

url: encodeURI("test.ashx?name=" + $("#<%=TextBox1.ClientID %>").val()),

beforeSend: function() { $("#panel").html("正在載入..."); },

success: function(data) { var data1 = eval('' + data + ''); $("#panel").html(""); $.each(data1, function(i) { $("#panel").append("

  • name:" + data1[i].name + " " + "age:" + data1[i].age + "
  • "); }) },

    // success:function(data){$("#panel").html(data);},

    complete: function() { alert(&quot弧載入完成"); }

    }

    )

    相關問題答案
    什麼是回調函數?
    什麼是單調函數?
    什麼是傳遞函數?
    什麼是分佈函數?
    什麼是一次函數性質?
    大學什麼是單值函數?
    什麼是狀態函數?
    什麼是構造函數?
    什麼是一次函數圖像?
    什麼是投資乘數?