什么是回调函数?

 我来答
机器1718
2022-11-21 · TA获得超过6841个赞
知道小有建树答主
回答量:2805
采纳率:99%
帮助的人:161万
展开全部
回调函数和普通函数有什么区别?
没有任何区别

非要说有区别,就是调用方式

普通函数,被其他函数调用时,是在调用者内部直接写函数名调

回调函数,通常是作为参数传递给调用者,调用者并不知道自己调用的到底是什么

另外有一点,回调函数大多用于多线程的情况
回调函数是什么?
首先做一个形象的比喻:,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.  回调函数是应用程序提供给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回调函数是什么意思
jb51/article/59447

以后这么简单的问题不要再这里问了,可以直接查
怎么理解回调函数?回调函数有什么好处
简单点说,用户是实现方,实现方需要调用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")("正在载入..."); },

success: function(data) { var data1 = eval('' + data + ''); $("#panel")(""); $.each(data1, function(i) { $("#panel").append("
name:" + data1[i].name + " " + "age:" + data1[i].age + ""); }) },
success:function(data){$("#panel")(data);},

plete: function() { alert("弧载入完成"); }

}

)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式