什么是回调函数

回调函数就是你写好一个函数,让预先写好的系统来调用。你去调用系统的函数,是直调。让系统调用你的函数,就是回调。但假如满足于这种一句话结论,是不会真正明白的。

回调函数可以看成,让别人做事,传进去的额外信息。

比如,AB做事,根据粒度不同,可以理解成 A函数调用 B函数,或者 A类使用 B类,或者 A组件使用 B组件等等。反正就是 AB做事。

B做这件事情的时候,自身的需要的信息不够,而A又有。就需要 A从外面传进来,或者 B做着做着主动向外面申请。对于 B来说,一种被动得到信息,一种是主动去得到信息,有人给这两种方式术语,叫信息的push,和信息的pull

A调用 BA需要向 B传参数。如简单的函数:

intmax(int a, int b);

要使用这函数,得到两者最大的值,外面就要传进来 a,b。这个很好理解。

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

而这个函数用于排序,最后一个参数就是回调函数,似乎就比较难以理解了。这是因为人为割裂了代码和数据。

我们暂停一下,看看计算机中比较诡异的地方,也就是代码(code)和数据(data)的统一。这是一个槛,如果不打通这个,很多概念就不清楚。我们常常说计算机程序分成codedata两部分。很多人就会觉得,code是会运行的,是动的,data是给 code使用,是静态的,这是两种完全不同的东西。

其实 code只是对行为的一种描述,比如有个机器人可以开灯,关灯,扫地。如果跟机器人约定好,0表示开灯,1表示关灯,2表示扫地。我发出指令串,01 2,就可以控制机器人开灯,关灯,扫地。再约定用二进制表示,两位一个指令,就有一个数字串,000111,这个时候000111这串数字就描述了机器人的一系列动作,这个就是从一方面理解是code,它可以控制机器人的行为。但另一方面,它可以传递,可以记录,可以修改,也就是数据。只要大家都协商好,code就可以编码成 data,data解释运行的时候,也变成了 code

codedata可以不用区分,统一称为信息。既然intmax(int a, int b) intdouble等表示普通 data的东西可以传递进去,凭什么表示code的函数就不可以传进去了。有些语言确实是不区分的,它的function(表示code)int,double 的地位是一样的。这种语言就为函数是第一类值。

而有些语言是不能存储函数,不能动态创建函数,不能动态销毁函数。只能存储一个指向函数的指针,这种语言称为函数是第二类值。

另外有些语言不单可以传递函数,函数里面又用到一些外部信息(包括code,data)。那些语言可以将函数跟函数所用到的信息一起传递存储。这种将函数和它所用的信息作为一个整体,就为闭包。

将代码和数据打通,统一起来。过了这个槛,很多难以理解的概念就会清晰很多。

现在我们再回头看看回调函数。回调函数也就是是AB做事,B做着做着,信息不够,不知道怎么做了,就再让外面处理。

比如上述排序例子,AB排序,B会做排序,但排序需要知道哪个比哪个大,这点B自己不知道,就需要 A告诉它。而这种判断那个大,本身是一种动作,既然C语言中不可以传进第一值的函数,就设计成传递第二值的函数指针,这个函数指针就是A传向 B的信息,用来表示一个行为。这里本来A调用 B的,结果 B又调用了 A告诉它的信息,也就叫 callback

再比如 AB监听系统的某个消息,比如敲了哪个键。跟着B监听到了,但它不知道怎么去处理这个消息,就给外面关心这个消息,又知道怎么去处理这个消息的人去处理,这个处理过程本身是个行为,既然这个语言不可以传递函数,又只能传一个函数指针了。假如我将函数指针存储下来,以后就可以随时调用。代码和数据都是信息,数据可以存储下来,用来表示行为的函数自然也可以存储下来。

跟着有些人有会引申成,什么注册啊,通知啊等等等。假如B做监听,C,D, E, F, G, H 告诉 B自己有兴趣知道这消息,那 B监听到了就去告诉C,D,E,F,G等人了,这样通知多人了,就叫广播。

其实你理解了,根本不用去关心术语的。术语是别人要告诉你啊,或者你去告诉人啊,使用的一套约定的词语。本质上就这个东西,结果会有很多术语的。

跟着再将回调的概念泛化,比如某人同时关心A,B, C, D, E, F事件,并且这些事件是一组的,比如敲键盘,鼠标移动,鼠标点击等一组。将一组事件结合起来。在有些语言就映射成接口,接口有N个函数。有些语言就映射成一个结构,里面放着N个函数指针。跟着就不是将单个函数指针传进去,而是将接口,或者函数指针的结构传进去。根据不同的用途,有些人叫它为代理,监听者,观察者等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值