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

回调?是什么,简单讲解一下回调就是把一个函数作为参数传到另一个函数里面 当那个函数执行完之后 再执行传进去的这个函数

大家好,欢迎来到IT知识分享网。

使用回调的场景

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

  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 回调函数,被调用的函数甚至可以选择不执行回调。回调什么时候执行、是否执行、如何执行都与函数调用者解耦,函数调用者只需将其作为参数传入就行了,至于后续的操作,调用者通常不再关心。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129108.html

(0)
上一篇 2025-08-26 18:26
下一篇 2025-08-26 18:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信