回调函数理解[更新]

目录

前言

一、回调是什么?

二、回调函数

1.回调函数的意义

2.回调函数的异步

三、函数指针的应用——回调函数

总结



前言

关于项目经常提到的回调函数、回调事件总是一知半解。开这篇文章记录自己学习以及收集的知识,希望在书写的过程中帮助自己、和看客一同深入理解这一概念。


一、回调是什么?

        回调(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.回调函数的异步

讨论:他是怎么做到异步的呢?

从回调函数的执行流程可以知道:(流程为什么是这样的?搞调试去看看)

  1. 主函数需要调用回调函数

  2. 中间函数登记回调函数

  3. 触发回调函数事件

  4. 调用回调函数

  5. 响应回调事件

阻塞式回调 和 延迟式回调 也可以叫做 同步回调 和 异步回调


三、函数指针的应用——回调函数

从代码上来描述回调函数,它就是一个通过函数指针调用的函数。

“将函数指针作为一个参数,传递给另一个函数。
回调函数并不是由实现方直接调用,而是在特定的事件或条件发生时由另外一方来调用的。”

简单理解就是:别人的函数执行时调用你实现的函数。

#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提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值