查看原文
其他

回调函数 callback 的实现原理是什么?

码农的荒岛求生 码农的荒岛求生 2022-10-10
大家好,我是小风哥。
在讲正文前闲聊几句,最近实在是有点忙,昨天已经是近期第二次通宵加班了,之前加班发到朋友圈后收到了很多同学的关心,很是感动,感谢大家:

公司忙起来后的确有时加班挺狠的,但这不是常态,在这里也提醒大家千万不要熬夜,对身体健康真的不好,能不加班就不加班,早睡早起,身体是一切的基础。
其实之前小风哥写过关于回调函数原理的文章,在这里《10张图让你彻底理解回调函数》,这篇文章内容很全面,但还是有很多同学在微信上问我有没有简化版的,以下就是回调函数原理的极简版。
其实回调函数和普通函数没有本质的区别。
首先让我们来看看普通的函数调用,假设我们在A函数中调用函数func:
void A() { ... func(); ...}
想一想,你怎么知道可以调用func呢?哦,原来func是你自己定义的:
void func() { blablabla;}
这很简单吧,现在假设你编写的这段代码无比之牛逼,全世界的程序员都无比疯狂的想引入到自己的项目中,这时你会把A函数编写成一个库供全世界的码农使用。
但此时所有人都发现一个问题,那就是他们都想在A函数中的某个特定点上执行一段自己的代码,作为这个库的创作者你可能会这样实现:
void A() { ... // 特定点 if (张三) { funcA(); } else if (李四) { funcB(); } ...}
假设全世界有一千万码农,那你是不是要有一千万个if else。。。想想这样的代码就很刺激有没有!
更好的办法是什么呢?把函数也当做变量!你可以这样定义A函数:
void A(func f) { ... f(); ...}
任何一个码农在调用你的A函数时传入一个函数变量,A函数在合适的时机调用你传入的函数变量,从而节省了一千万行代码
为了让这个过程更加难懂一些,这个函数变量起了一个无比难懂的称呼:回调函数。
现在你应该明白了回调函数是怎么一回事了吧,相比回调函数来说我更愿意将其看做函数变量
以上就是回调函数的基本原理,有想看更详细版本的请参考这里
以上仅仅是回调函数的一种用途,回调函数在基于事件驱动编程以及异步编程时更是必备的,关于事件驱动编程你可以参考这里,GUI编程的同学对此肯定很熟悉。
希望这里的讲解对大家理解回调函数有所帮助。
也欢迎大家添加我的微信coder_saver围观朋友圈,备注写“围观”二字即可,一起见证我们的成长。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存