怎么理解回调函数?回调函数有什么好处

怎么理解回调函数?回调函数有什么好处,第1张

回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这一设计允许了底层代码调用在高层定义的子程序。回调的形式因程序设计语言的不同而不同。(C, C++ and Pascal允许将函数指针作为参数传递给其它函数。其它语言,例如JavaScript,Python,Perl和PHP,允许简单的将函数名作为参数传递。Objective-C中允许利用@selector关键字传递SEL类型的函数名。)

回调允许函数调用者在运行时调整原始函数的行为。因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。

回调函数使得程序设计更加灵活。

在前端开发中,回调函数是一种被传递给其他函数的函数,这些函数会在另一个函数执行完毕后被调用。回调函数通常用于处理异步 *** 作,如 AJAX 请求或事件处理程序。回调函数可以让开发者在一定程度上控制程序的流程,以便在需要时执行特殊 *** 作。

是什么百度文献上有很多,但是具体的有很多细节需要注意这里我来分享下。

我们都知道中间函数和回调函数是回调的两个必要部分,人们常常会忽略回调里的第三位要角,就是中间函数的换用者。在这种情况下,这个和程序的函数是差不多的,但为了表示区别,我这里把它称为起始函数。

为什么会说这个呢,是因为我在网上读相关文章时得到一种印象,很多人把它简单地理解为两个个体之间的来回调用。譬如,很多中文网页在解释“回调”,都会提到这么一句话:“If you call me, I will call you back”不知道这是哪里来的也没去关注。我个人揣测,很多人把起始函数和回调函数看作为一体,大概有两个原因:第一,可能是“回调”这一名字的误导;第二,给中间函数传入什么样的回调函数,是在起始函数里决定的。实际上,回调并不是“你我”两方的互动,而是ABC的三方联动。要知道这个之后才不会有太大的问题

事实上现存的回调函数有2个:阻塞式回调和延迟式回调。两者的区别在于:阻塞式回调里,回调函数的调用一定发生在起始函数返回之前;而延迟式回调里,回调函数的调用有可能是在起始函数返回之后。这里不打算对这两个概率做更深入的讨论,之所以把它们提出来,也是为了说明强调起始函数的重要性。网上并没有详细的注解,不免让人糊涂,所以这里特意说明一下。另外还请注意,本文中所举的示例均为阻塞式回调。还有很多我也不是很清楚就不说啦。

回调函数是一个通过函数指针调用的函数。

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:声明;定义;设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。所谓回调函数就是按照一定的形式由你定义并编写实现内容,当发生某种事件时,而由系统或其它函数来调用的函数。使用回调函数实际上就是在调用某个函数时,

将自己编写的一个函数的地址作为参数传递给那个函数。而那个函数在需要的时候,也就是某种事情发生的时候,利用传递的函数地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的 *** 作。回调函数只能是全局函数,或者是静态函数,因为这个函数只是在这个类中使用,所以为了维护类的完整性,我们用类的静态成员函数来做回调函数。

函数调用形式本身没有好坏之分

任何函数代码如果有错误都可能导致软件出问题,甚至导致崩溃

c 里可以使用指针,函数指针

这就使程序可以更灵活

当 函数指针 做为函数的参数,传递给一个被调用函数,

被调用函数就可以通过这个指针调用外部的函数,这就形成了回调

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

一般的程序中回调函数作用不是非常明显,可以不使用这种形式

最主要的用途就是当函数不处在同一个文件当中,比如动态库,要调用

其他程序中的函数就只有采用回调的形式

#include "stdioh"

#include "conioh"

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 的代码作了修改,也不必改动库的代码,就可以正常实现调用

便于程序的维护和升级

一个很简单的例子,交换函数。

#include<stdioh>

void

main()

{

void

fun(int

p);//fun函数说明

int

a[2]={1,2};

printf("%d

%d\n",a[0],a[1]);

fun(a);//fun函数调用

printf("%d

%d\n",a[0],a[1]);

}

void

fun(int

p)//fun函数定义

{

int

t;

t=p;

p=(p+1);

(p+1)=t;

}

从功能上来说 普通函数也是可以的

但在比较大的程序设计中 会对很多功能模块进行封装

比如 上层一个模块

底层一个模块

同时规定,上层可以调用底层的函数,但是底层不可以调用上层函数。

这时就需要使用回调函数。

通过上层调用底层的注册回调借口,传入回调指针。

实现底层通知上层的作用。

另外 回调函数的一个好处是,可以通过回调函数,调用不同接口。

比如接收数据,不同数据需要不同的解析函数。

但是接收数据的流程是相同的

这样 使用回调函数,在接收数据的时候就可以不用判断,而是自动使用不同的解析函数。

总之 使用回调函数,可以降低耦合,实现多样性。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/13493040.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存