導航:首頁 > 廢水知識 > 回調函數有什麼用

回調函數有什麼用

發布時間:2021-10-26 17:15:04

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

你就想像你函數的一部分功能被外包給別人。至於被人怎麼實現的你不用管,你的函數具有一個完整的功能,但是有的功能可以隨你自己定製,參照stl中的for_each

❷ 回調函數的作用 請用自己的話說明!!

回調函數就是那些自己寫的,但是不是自己來調,而是給別人來掉的函數。
消息響應函數版就可以看成是回調函數,因權為是讓系統在合適的時候去調用。這不過消息響應函數就是為了處理消息的,所以就拿出來單做一類了。其實本質上就是回調函數。
但是回調函數不是只有消息響應函數一種,比如在內核編程中,驅動程序就要提供一些回調函數,當一個設備的數據讀寫完成後,讓系統調用這些回調函數來執行一些後續工作。
回調函數賦予程序員這樣一種能力,讓自己編寫的代碼能夠跳出正常的程序控制流,適應具體的運行環境在正確的時間執行。

❸ 如何理解回調函數的作用與實現

回調函數的主要作用:
1.回調函數就是本模塊實現的回調函數,但是調用卻不是自己來調,而是由別的模塊來調的
2.可更好的把握調用函數的時機,
回調函數依賴對應注冊回調的模塊,回調函數由該模塊觸發,觸發的條件、時間點,都是由該模塊控制
(通常由該模塊的事件消息,觸發)
3.在不同模塊間進行使用,可令觸發邏輯與業務邏輯分離,讓代碼功能性上更為清晰,易懂

注意點:
回調函數跑的事情,都是在觸發回調的線程下進行的,如果回調函數中干很多事,很容易造成觸發模塊-所屬線程堵塞
這對於多線程編程時,需特別注意,線程堵塞,會影響其他線程運行時序,造成一些bug

通常用法:
以庫的形式,供別人調用實現

以上是根據網上相應資料,再加上自己的總結體會,整理出來的

下面是自己寫的一個回調函數-用法的例子:
主要 分成2個模塊
A模塊為定義回調函數的模塊,負責觸發回調,一般為事件消息模塊
B模塊為實現回調函數的模塊,一般為處理業務邏輯模塊

A模塊需向B模塊暴露定義及注冊回調介面
typedef void (*TestCB)(char testData);
void A_SetTestCb(TestCB pTestCb)

B模塊實現具體的回調函數就可以了,本例中即B_UserTestCbDetail(char testData)

主要分3步:注冊回調函數->消息事件觸發回調函數->執行回調函數
附代碼:
#include "stdio.h"
//定義回調函數-別名,方便後續使用------需提供給模塊B
typedef void (*TestCB)(char testData);

//模塊A內部的全局回調變數,用於模塊A內部綁定注冊回調用
TestCB g_pTestCbHandle;

/*****************************************************
模塊A對外函數---------需提供給模塊B
模塊A內部定義的全局callback變數與外部模塊注冊的
回調函數綁定起來,用於後續模塊A,滿足觸發條件後,觸
發回調
******************************************************/
void A_SetTestCb(TestCB pTestCb)
{
g_pTestCbHandle = pTestCb;
}

/*****************************************************
模塊A內部函數
通常為A模塊因為某些條件符合了,觸發了對應的事件
從而調用對應的callback函數
******************************************************/
void A_CallTestCb()
{
char testData = 100;
//觸發調用回調實現函數
g_pTestCbHandle(testData);
}

/*****************************************************
模塊B內部函數
模塊B實現的回調函數-具體操作
******************************************************/
void B_UserTestCbDetail(char testData)
{
printf("step 3\n");
printf("[do] call-back\n");
//具體實現
printf("UserTestCbDetail, call back is achieve! testData = %d\n", testData);
}

void main()
{
printf("step 1\n");
printf("[register] call-back\n");
A_SetTestCb(B_UserTestCbDetail);
printf("step 2\n");
printf("[call] call-back\n");
A_CallTestCb();
}

❹ 回調函數(callback)是什麼 ,,

回調函數就是一個被作為參數傳遞的函數。在C語言中,回調函數只能使用函數指針實現,在C++、Python、ECMAScript等更現代的編程語言中還可以使用仿函數或匿名函數。

回調函數的使用可以大大提升編程的效率,這使得它在現代編程中被非常多地使用。同時,有一些需求必須要使用回調函數來實現。

最著名的回調函數調用有C/C++標准庫stdlib.h/cstdlib中的快速排序函數qsort和二分查找函數bsearch中都會要求的一個與strcmp類似的參數,用於設置數據的比較方法。

意義

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

❺ c語言回調函數究竟有什麼用處我覺的用普通的函數調用替換也可以,謝謝

從功抄能上來說 普通函數也是可以襲的
但在比較大的程序設計中 會對很多功能模塊進行封裝
比如 上層一個模塊
底層一個模塊

同時規定,上層可以調用底層的函數,但是底層不可以調用上層函數。
這時就需要使用回調函數。
通過上層調用底層的注冊回調借口,傳入回調指針。
實現底層通知上層的作用。

另外 回調函數的一個好處是,可以通過回調函數,調用不同介面。
比如接收數據,不同數據需要不同的解析函數。
但是接收數據的流程是相同的
這樣 使用回調函數,在接收數據的時候就可以不用判斷,而是自動使用不同的解析函數。

總之 使用回調函數,可以降低耦合,實現多樣性。

❻ 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("<li>name:" + data1[i].name + " " + "age:" + data1[i].age + "</li>"); }) },
// success:function(data){$("#panel").html(data);},
complete: function() { alert("載入完成"); }

}

)

❼ c++中回調函數有什麼用

回調函數不是c++的概念,是windows中的概念
叫做 CALLBACK 函數
這種函數有固定的格式,你把這個函數提供給windows,windows會在適當的時候自己調用
你不自己調用,所以叫做回調函數

❽ js回調函數有什麼用

傳遞函數作為回調

很容易把一個函數作為參數傳遞。

functionfn(arg1,arg2,callback){
varnum=Math.ceil(Math.random()*(arg1-arg2)+arg2);
callback(num);//傳遞結果
}
fn(10,20,function(num){
console.log("Callbackcalled!Num:"+num);
});//結果為10和20之間的隨機數

可能這樣做看起比較麻煩,甚至有點愚蠢,為何不正常地返回結果?但是當遇上必須使用回調函數之時,你也許就不這樣認為了!

傳統函數以參數形式輸入數據,並且使用返回語句返回值。理論上,在函數結尾處有一個return返回語句,結構上就是:一個輸入點和一個輸出點。這比較容易理解,函數本質上就是輸入和輸出之間實現過程的映射。

但是,當函數的實現過程非常漫長,你是選擇等待函數完成處理,還是使用回調函數進行非同步處理呢?這種情況下,使用回調函數變得至關重要,例如:AJAX請求。若是使用回調函數進行處理,代碼就可以繼續進行其他任務,而無需空等。實際開發中,經常在javascript中使用非同步調用,甚至在這里強烈推薦使用!

下面有個更加全面的使用AJAX載入XML文件的示例,並且使用了call()函數,在請求對象(requested object)上下文中調用回調函數。

functionfn(url,callback){
varhttpRequest;//創建XHR
httpRequest=window.XMLHttpRequest?newXMLHttpRequest()://針對IE進行功能性檢測
window.ActiveXObject?newActiveXObject("Microsoft.XMLHTTP"):undefined;

httpRequest.onreadystatechange=function(){
if(httpRequest.readystate===4&&httpRequest.status===200){//狀態判斷
callback.call(httpRequest.responseXML);
}
};
httpRequest.open("GET",url);
httpRequest.send();
}

fn("text.xml",function(){//調用函數
console.log(this);//此語句後輸出
});

console.log(".");//此語句先輸出

我們請求非同步處理,意味著我們開始請求時,就告訴它們完成之時調用我們的函數。在實際情況中,onreadystatechange事件處理程序還得考慮請求失敗的情況,這里我們是假設xml文件存在並且能被瀏覽器成功載入。這個例子中,非同步函數分配給了onreadystatechange事件,因此不會立刻執行。

最終,第二個console.log語句先執行,因為回調函數直到請求完成才執行。

❾ 什麼是JavaScript中的回調函數,作用是什麼

var req;
function validate() {
var idField = document.getElementById("userid");
var url = "Validate.jsp?id=" + encodeURI(idField.value);
init();
req.open("GET", url, true);
req.onreadystatechange = callback;
//callback就是回調函數,當觸發req.onreadystatechange時,調用callback獲取url傳回的東西
req.send(null);
}

function init() {
if(window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
}

function callback() {
if(req.readyState == 4) { //反饋回到客戶端
if(req.status == 200) { //反饋完全正常
//alert(req.responseText);
var msg = req.responseXML.getElementsByTagName("msg")[0];
//alert(msg);
setMsg(msg.childNodes[0].nodeValue);
}
}
}

function setMsg(msg) {// 頁面中的span <span id="usermsg"></span>
//alert(msg);
mdiv = document.getElementById("usermsg");
if(msg == "invalid") {
mdiv.innerHTML = "<font color='red'>username exists</font>";
} else {
mdiv.innerHTML = "<font color='green'>congratulations! you can use this username!</font>";
}
}

Validate.jsp

<%
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-store"); //HTTP1.1
response.setHeader("Pragma", "no-cache"); //HTTP1.0
response.setDateHeader("Expires", 0); //prevents catching at proxy server
System.out.println(request.getParameter("id"));
//check the database 可以先去資料庫取
response.getWriter().write("<msg>valid</msg>");//寫這個內容,隨便指定
%>

❿ 回調函數的用法和好處

函數調用形式本身沒有好壞之分

任何函數代碼如果有錯誤都可能導致軟體出問題,甚至導致崩潰

c 里可以使用指針,函數指針
這就使程序可以更靈活

當 函數指針 做為函數的參數,傳遞給一個被調用函數,
被調用函數就可以通過這個指針調用外部的函數,這就形成了回調

windows程序中 WndProc 就是使用回調的典型形式

一般的程序中回調函數作用不是非常明顯,可以不使用這種形式

最主要的用途就是當函數不處在同一個文件當中,比如動態庫,要調用
其他程序中的函數就只有採用回調的形式

#include "stdio.h"
#include "conio.h"

int add(int a, int b);
int libfun(int (*pDis)(int a, int b));

int main(void)
{
int (*pfun)(int a, int b);

pfun = add;
libfun(pfun);

}

int add(int a, int b)
{
return a + b;

}

int libfun(int (*pDis)(int a, int b))
{
int a, b;
a = 1;
b = 2;
printf("%d", pDis(a, b));

}

現在這幾個函數是在同一個文件當中

假如
int libfun(int (*pDis)(int a, int b))
是一個庫中的函數,就只有使用回調了,通過函數指針參數將外部函數地址傳入
來實現調用

函數 add 的代碼作了修改,也不必改動庫的代碼,就可以正常實現調用
便於程序的維護和升級

閱讀全文

與回調函數有什麼用相關的資料

熱點內容
污水井如何供氧 瀏覽:324
直飲水機怎麼看余額 瀏覽:267
小米米家空氣凈化器2s怎麼拆卸 瀏覽:311
江蘇工業廢水處理改造 瀏覽:712
扶溝縣豫東醫院亂排污水 瀏覽:734
市政污水改造項目監理細則 瀏覽:677
bealich熱水器除垢 瀏覽:265
市政道路上污水井間距最大值 瀏覽:939
核廢水裡的氚怎麼處理 瀏覽:895
污水處理廠用什麼葯水 瀏覽:114
ro膜反滲透和超濾 瀏覽:123
還汽油濾芯和清洗三元得多少錢 瀏覽:294
五一廣場到樹脂廠 瀏覽:319
碧然德為何能去水垢 瀏覽:381
家用污水提升泵昆明 瀏覽:336
鹼度在污水處理中應用 瀏覽:566
葡萄蒸餾酒技術最早是哪國 瀏覽:542
樹脂鏡片疏水膜 瀏覽:262
濾芯還剩了多少首詩 瀏覽:678
反滲透膜能過濾氣體嗎 瀏覽:382