首页 > 其他分享 >彻底理解回调函数

彻底理解回调函数

时间:2023-11-17 12:44:58浏览次数:26  
标签:... 函数 彻底 void func 回调 码农

彻底理解回调函数的实现原理

原创 码农的荒岛求生 码农的荒岛求生 2023-11-17 08:11 发表于北京

大家好,我是小风哥,有很多同学问能不能发下之前的文章,后续我会找一些之前阅读量不错的发下,本文首发于2021年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编程的同学对此肯定很熟悉。希望这里的讲解对大家理解回调函数有所帮助。

标签:...,函数,彻底,void,func,回调,码农
From: https://www.cnblogs.com/cheyunhua/p/17838474.html

相关文章

  • 学习笔记426—keras中to_categorical函数解析
    keras中to_categorical函数解析1.to_categorical的功能简单来说,to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式。先上代码看一下效果:fromkeras.utils.np_utilsimport*#类别向量定义b=[0,1,2,3,4,5,6,7,8]......
  • 教你彻底搞懂Cocos Creator Tween
    Cocos使用了Tween来代替原来的Action系统,今天来给大家讲解Tween如何使用,帮助大家掌握Tween的使用,并且对Tween有一个更深入的了解。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。1:Tween到底......
  • 入门c语言--3---关于qsort函数的一些理解
     qsort函数是c语言库函数的一种,作用是将所给的数组中的元素按要求进行排序。 qsort函数可以理解为冒泡函数的进阶,冒泡函数只能对一些如int,char等类型的数组进行排序,当遇到自主定义的struct类型的数组时便不能进行排序。此时便可以通过qsort函数进行排序。  在使用qsort函数......
  • 关于循环函数if
    循环函数if的的定义是为设定对应的条件,找到对应的目标,然后选定对应目标的输出对一个或多个常量或变量进行赋值了以后通过循环找到符合自身变量的值找到对应的值以后,再根据对应的值进行答应......
  • 无涯教程-Dart - Optional Parameters with Default Values函数
    默认情况下,还可以为函数参数分配值,但是,此类参数也可以是显式传递的值。语法function_name(param1,{param2=default_value}){//......}示例voidmain(){test_param(123);}voidtest_param(n1,{s1:12}){print(n1);print(s1);}它应该返回......
  • 无涯教程-Dart - Optional named parameter函数
    与位置参数不同,必须在传递值时指定参数名称,花括号{}可用于指定可选的命名参数。语法 - 声明函数voidfunction_name(a,{optional_param1,optional_param2}){}语法 - 调用函数function_name(optional_param:value,…);示例voidmain(){test_param(123);......
  • delphi 路径操作函数
    路径操作函数System.SysUtils.AnsiCompareFileName根据当前语言环境比较文件名。在Windows下不区分大小写,在MACOS下区分大小写。在不使用多字节字符集(MBCS)的Windows区域设置下,AnsiCompareFileName与AnsiCompareText相同。在MACOS和Linux下,AnsiCompareFile......
  • c语言 函数参数个数影响
    参考:https://blog.csdn.net/Cheatscat/article/details/79306021https://blog.csdn.net/Dr_Haven/article/details/89383342一个函数的参数的数目过多(尤其是超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数越慢。参数的数目少,程序就显得......
  • 无涯教程-Dart - Optional Positional Parameter函数
    要指定可选的位置参数,请使用方括号[]。语法voidfunction_name(param1,[optional_param_1,optional_param_2]){}如果未传递可选参数的值,则将其设置为NULL。示例voidmain(){test_param(123);}test_param(n1,[s1]){print(n1);print(s1);}它......
  • 第六章 消息认证和哈希函数 —— 现代密码学(杨波)课后题答案解析
    第五章作业参考答案1.6.1.3节的数据认证算法是由CBC模式的DES定义的,其中初始向量取为0,试说明使用CFB模式也可获得相同的结果。解:设需认证的数据分为64比特长的分组,D1,D2,…,DN,其中DN不够64比特则右边补0,由题设,数据认证算法相当于在CBC模式中初始向量取为0,并按如下关系进行:   ......