回调?是什么,简单讲解一下

7 篇文章 0 订阅

A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。
回调就是把一个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。

使用回调的场景

在调用一个函数之后,需要在函数执行中或执行后,将执行结果或状态再传递给调用者并进行一系列后续操作时,可以使用回调机制。通常是:

  1. 执行某个操作需要耗时,异步执行后进行回调;
  2. 调用者不再关心回调函数中进行的后续操作;
  3. 程序需要监听函数中某个动作的完成,从而进行下一步操作

回调在编程语言中的体现

JavaScript

在函数式编程语言,如 JavaScript 中,回调体现为:


// 被调用的函数:控制台打印 a 之后,调用 fun 函数
function print(a, fun){
	console.log(a);
	fun();
}

function callback(){
	console.log("调用回调函数:callback")
}

// 主函数
function main(){
   // 调用print,传入参数a 和一个回调函数
   // 回调函数可以是已经声明的函数
   print("参数a", callback)
   // 也可以是临时实现的匿名函数
   print("参数a", function(){
   		console.log("调用匿名回调函数")
   })
}

C语言

在 C 语言中,回调函数以 函数指针 的形式作为参数传入:

#include <stdio.h>

// 函数 fun 接收两个参数
// 一个整型数 a,一个函数指针(指向一个无返回值,参数为一个 int 的函数)
// 打印完 a 的值之后,将 a 进行一顿乱七八糟的运算之后,回调给函数指针 c 指向的函数
void fun(int a, void (*c)(int))
{
    printf("\nfun接收参数:%d\n", a);
    a = a * 1 - 5 + 6 / 7 * 8;
    (*c)(a);
}

void callback1(int a)
{
    printf("回调结果:%d\n", a);
}

void callback2(int a)
{
    printf("回调2结果:%d\n", a * 2);
}

int main()
{
    fun(2, callback1);
    fun(2, callback2);
}

运行结果为:
在这里插入图片描述

Java

这里主要讲解一下在 java 中的回调机制,由于 java 不是函数式编程语言,不能将函数作为参数传递(包括 lambda 本质也是函数式接口的实现),所以在 java 中回调以 回调接口 的形式实现。

即:将一个接口的实现类的实例作为参数传递,将这个接口中方法作为回调函数进行调用

这里给定一个案例:
学生参加考试计算加法,他们计算的结果需要回调给阅卷老师或阅卷系统,也就是我们的回调接口,回调接口在对学生的的答案进行评价。详细请看以下代码:

public class Main {

    // 回调接口,用于判断学生计算的结构是否正确,
    // 这里可以理解为【改卷老师】或者【改卷系统】
    public interface CallBack {
        void call(int result);
    }

    // 学生 A
    static class StudentA {
        // 学生 A 智商有问题,加法从来算不对
        public void add(int a, int b, CallBack callBack) {
            int result = a + b + 1;
            System.out.printf("A 交卷:%d+%d=%d%n", a, b, result);
            callBack.call(result);
        }
    }

    // 学生 B
    static class StudentB {
        // 学生 B 比较正常,加法从来没算错过
        public void add(int a, int b, CallBack callBack) {
            int result = a + b;
            System.out.printf("B 交卷:%d+%d=%d%n", a, b, result);
            callBack.call(result);
        }
    }

    public static void main(String[] args) {

        // 有两个学生参加考试
        StudentA a = new StudentA();
        StudentB b = new StudentB();

        // 题目给定加法的两个数
        final int one = 1, tow = 2;

        // 指定回调类
        CallBack c = new CallBack() {
            // call 方法指定接收到计算结果时,对该结果做出的反应
            @Override
            public void call(int result) {
                System.out.print("评语:");
                // 结果正确
                if (result == (one + tow)) {
                    System.out.println("你真棒");
                } 
                // 结果错误
                else {
                    System.out.println("emmm....");
                }
            }
        };

        // 上面的 callback 可以简写为 lambda 表达式
        CallBack cShort = result -> System.out.println("评语:" + (result == (one + tow) ? "你真棒" : "emmm...."));

        a.add(one, tow, cShort);
        b.add(one, tow, cShort);
    }

运行结果:
在这里插入图片描述

为什么使用回调

既然是接收上一个函数的运行结果,为什么使用回调,用返回值不行吗??

  1. 不是所有函数或者方法都有返回值,并且返回值只有一个,回调函数可以具有多个参数,可以对多个数据进行处理;
  2. 返回值需要等待函数执行完成才能返回,而回调可以使用多线程异步执行,不必等待函数执行;
  3. 回调函数可以不只一个,例如可以指定同时指定执行成功时的 success 回调函数和执行失败时的 fail 回调函数,被调用的函数甚至可以选择不执行回调。回调什么时候执行、是否执行、如何执行都与函数调用者解耦,函数调用者只需将其作为参数传入就行了,至于后续的操作,调用者通常不再关心。
  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 回调函数是一种常见的编程概念,它在程序设计中经常被用到。它的作用是将一个函数作为参数传递给另一个函数,然后在某个特定的时机被调用执行。 回调函数的使用可以提高代码的灵活性和复用性。在程序中,我们经常需要在某个地方定义一个动作或行为,但具体的实现方式由外部决定。这时,我们可以使用回调函数来实现这种灵活性。 一个简单的例子来说明回调函数的概念。假设我们有一个计算器程序,它可以进行加法、减法、乘法和除法运算。我们可以定义一个回调函数,用于定义具体的操作方法。例如,我们可以定义一个名为addition的函数来执行加法操作: ```python def addition(a, b): return a + b ``` 然后,在我们的计算器程序中,我们可以使用回调函数来实现灵活的操作方式。比如,我们可以定义一个叫做calculator的函数,它接受两个数和一个回调函数作为参数,然后根据回调函数的定义来执行具体的操作。下面是一个简单的示例: ```python def calculator(a, b, callback): result = callback(a, b) print("计算结果为:", result) calculator(5, 3, addition) ``` 这段代码的执行结果将会是“计算结果为:8”。可以看到,我们通过将addition函数作为回调函数传递给calculator函数,实现了对两个数的加法操作。 回调函数在实际的程序设计中经常被使用。比如,当我们需要在某个事件发生后执行特定的操作时,可以使用回调函数。另外,回调函数在异步编程等领域也有着广泛的应用。 总之,回调函数是一种将函数作为参数传递给另一个函数,并在特定时机被调用执行的编程概念。它的使用可以提高代码的灵活性和复用性。通过示例分析,我们可以更好地理解和使用回调函数。 ### 回答2: 回调函数是一种在编程中常用的技术,用于实现异步操作和事件处理。最简单的解释,就是将一个函数作为参数传递给另一个函数,当特定的条件满足时,另一个函数会调用传递进去的函数,将控制权交回给调用者。 我们可以通过一个实例来更好地理解回调函数。假设我们要下载一个大文件,为了防止主线程被阻塞,我们可以使用回调函数来实现异步下载。 首先,我们定义一个函数downloadFile,该函数接受两个参数:文件的URL和一个回调函数。在downloadFile中,我们创建一个新的线程或者使用非阻塞的方式来下载文件,当下载完成后,调用回调函数。 ```python def downloadFile(url, callback): # 下载文件的逻辑 # 下载完成后调用回调函数 callback() ``` 接下来,我们定义一个回调函数showMessage,当文件下载完成后,会调用该函数来显示一个提示信息。 ```python def showMessage(): print("文件下载完成!") ``` 最后,我们调用downloadFile函数,并传入要下载的文件URL和回调函数showMessage。 ```python downloadFile("https://example.com/file.txt", showMessage) ``` 当文件下载完成时,会输出"文件下载完成!"这个提示信息。 通过这个例子,我们可以看到回调函数的作用。通过传递一个函数作为参数,我们可以在特定的事件发生后执行相应的代码。这种方式可以避免主线程阻塞,并且能够灵活地处理异步操作。 总结来说,回调函数是一种在编程中常用的技术,用于实现异步操作和事件处理。它的原理是将一个函数作为参数传递给另一个函数,当特定的条件满足时,另一个函数会调用传递进去的函数,实现相应的逻辑。通过使用回调函数,我们可以实现灵活的异步操作和事件处理。 ### 回答3: 回调函数是指将一个函数作为参数传递给另一个函数,并且在特定事件发生后被调用的函数。 通俗地说,回调函数就像是一个预定的处理方式,当某个事件发生时,我们事先定义好的这个函数会被自动调用执行。 一个例子是,假设我们有一个按钮,当用户点击这个按钮时,我们想要执行某个操作。在这种情况下,我们可以将执行这个操作的函数作为一个回调函数传递给点击按钮的函数。当用户点击按钮时,点击按钮的函数会自动调用我们定义的回调函数,从而执行我们想要的操作。 再举一个例子,假设我们编写一个网络请求的函数,这个函数会发送请求并获取数据。我们可以传递一个回调函数作为参数给这个网络请求函数,在网络请求返回数据后,这个回调函数会被调用并处理返回的数据。 总的来说,回调函数就是一种灵活的编程方式,可以让我们在特定事件发生后执行一些自定义的操作,从而增加程序的可扩展性和灵活性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nonoas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值