回调函数在C语言、JS、Java中的实现

回调函数:回调函数就是一个被作为参数传递的函数。

在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。

回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。

机制

  ⑴定义一个回调函数;

  ⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

  ⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

意义

       因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

        回调函数在实际中有许多作用。假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,可以使用函数指针,并进行回调。

        回调可用于通知机制。例如,有时要在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知。那么,就需一个具有特定原型的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer来通知A程序。如果没有提供回调函数,它还会把一个消息发往程序的消息队列。

        另一个使用回调机制的API函数是EnumWindow,它枚举屏幕上所有的顶层窗口,每个窗口都可以通过它调用另一个程序提供的函数,并传递窗口的处理程序。例如:如果被调用者返回一个值,就继续进行迭代;否则,退出。EnumWindow并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

C语言的回调函数只能通过函数指针实现,在C++中则可以使用匿名函数(lambda)或仿函数(functor)作为回调函数。

摘要百度百科.......

C语言回调函数实例

函数指针,指向一个函数的地址。把它作为形参,通过call来调用。对于上面含义的理解(如理解有错误,欢迎指正。)

回调函数(call(show)/call(hello))可以把调用者与被调用者分开(我们不需要在call()中写hello();show();方法来调用他们),所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

①不带参数的回调函数

void call(void (*fp)()){
    fp();//回调函数
}
void hello(){
    printf("hello world!");
}
void show(){
    printf("show ");
}
int main(int argc, char *argv[]){
    call(hello);
    call(show);
}

②带参数的回调函数     (在c++语言中,我们可以利用方法的重载,使其功能更为强大。)

#include 

int compute_func(int (*func_ptr)(int,int),int x,int y){
	return func_ptr(x,y);
}
int sum(int x,int y){
	return x+y;
}
int sub(int x,int y){
	return x-y;
}
int product(int x,int y){
	return x*y;
}

int main()
{
   int a=10;
   int b=5;		
   printf("%d\n",a,b,compute_func(sum,a,b));
   return 0;
}

JS回调函数实例

https://www.bilibili.com/video/BV1W7411M76j/?spm_id_from=333.788.recommend_more_video.0

感觉这老外将的贼好。

①下面的回调函数实例其实和C语言中利用函数指针实例类似。另外在模拟一个场景,利用参数为一个匿名函数,实现其它的功能。


                    
                    

你可能感兴趣的:(java,js,java)