目录
前言
关于项目经常提到的回调函数、回调事件总是一知半解。开这篇文章记录自己学习以及收集的知识,希望在书写的过程中帮助自己、和看客一同深入理解这一概念。
一、回调是什么?
回调(callback)这个概念和设计相关,而非语言。从字面上理解,是主函数中的参数也是一个函数,当主函数执行完,再回头执行作为参数的函数,这个过程叫做回调,这个参数函数就是回调函数。
例子:A让B排序,但B只会靠大小排序,本身不知道谁大谁小,而A知道。B函数的参数里有A的函数指针。本来A调用B,结果B又调用了A获取大小的信息。
二、回调函数
1.回调函数的意义
可以把函数作为参数,函数是有人写的,可以根据具体的需求而变化。
《c++ primper》中举到一个排序的例子。判断两个数的大小的需求是人来写的(回调函数)。
//STL中提供的快速排序
//void qsort(void* base, size_t num, size_t size,int(*compar)(const void*,const coid*));
//num个成员大小为size的数组
int myCompare(const void* a, const void* b)
{
if(*(int* a)> *(int*) b) return 1;
else return -1;
}
int main(void)
{
int array[10] = {12,34,5,6,3,2,2};
qsort(array,10 ,4 , myCompare);
}
//qsort函数内部给myCompare函数参数赋值
//回调函数作为参数
function A(callback) {
callback();
console.log('我是主函数');
}
//定义回调函数
function B(){
setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作
}
A(B);
//输出结果
我是主函数
我是回调函数
让代码先去执行callback()回调函数,但输出结果却是后输出回调函数的内容。
说明callback函数是异步的,如果callback函数是同步的,则主函数还是要等待回调函数执行完,再执行自己的代码。
为了防止程序阻塞,使用异步。就是你先运行,我依旧做我的事情,你搞完了再来通知我的机制。
【PS:其实还有同步回调...】
2.回调函数的异步
讨论:他是怎么做到异步的呢?
从回调函数的执行流程可以知道:(流程为什么是这样的?搞调试去看看)
-
主函数需要调用回调函数
-
中间函数登记回调函数
-
触发回调函数事件
-
调用回调函数
-
响应回调事件
阻塞式回调
和 延迟式回调
也可以叫做 同步回调
和 异步回调
三、函数指针的应用——回调函数
从代码上来描述回调函数,它就是一个通过
函数指针调用的函数。
“将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。”简单理解就是:别人的函数执行时调用你实现的函数。
#include<stdio.h>
#include<stdlib.h>
//函数功能:实现累加求和
//自己的函数
int func_sum(int n)
{
int sum = 0;
if (n < 0)
{
printf("n must be > 0\n");
exit(-1);
}
for (int i = 0; i < n; i++)
{
sum += i;
}
return sum;
}
//别人的函数
//这个函数是回调函数,其中第二个参数为一个函数指针,通过该函数指针来调用求和函数,并把结果返回给主调函数
int callback(int n, int (*p)(int))
{
return p(n);
}
int main(void)
{
int n = 0;
printf("please input number:");
scanf("%d", &n);
printf("the sum from 0 to %d is %d\n", n, callback(n, func_sum));
//此处直接调用回调函数,而不是直接调用func_sum函数
return 0;
}
讨论:在参考了众多笔记后,发现很多都记录着这一句:“回调函数的意义:可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。”
从上述例子中,就可以理解,回调函数不用关系func_sum()的实现,而只是简单的调用即可。
四、回调函数的实际用途
在接手公司项目或改BUG的时候经常看到回调函数的使用,但往往只是看一些逻辑没有了解为什么要用它。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。