回调函数callback的作用

查阅了网上的一些内容,自己总结了一下,算是比较全面了。

定义:一个函数指针作为另一个函数A()的参数被调用时,它是回调函数。

A(int m, int n, bool * f(m,n))

1. 既然是函数的参数,就具备了扩展性和代码重用的作用,因为形参不变,实参是可变的。所以调用时,可以A(x,y,B),也可以A(x,y,C),这里B和C都是回调函数,有点像虚函数。(B和C可以实现不同的功能,或以不同的方式实现)

----场景:代码重用。A(x, y, isGreater), A(x, y , isSmaller)

2. 在定义A()时,甚至不需要知道实际的被调函数的名字,只要知道这个接口的格式,即参数,返回值,实现功能。所以甚至在确定被调函数如何实现之前,只要约定好接口和功能,就可以进行A()的定义工作。(实现相同的功能)

----场景:框架编程,并行工作。业务流程步骤编排(不管具体实现)。

A(bool * f())

3. 甚至被调函数f()到底实现什么功能,也是可以不定义的。只是在A里面规定好条件触发,将具体做什么的决定权交给用户

 ----场景:事件,通知。

我猜OnTimer()应当就是一个回调函数,开放给用户自定义动作。整个定时器的机制已经是预定义好的。

main函数其实也是。都是事件机制。

4. 结合多线程异步使用。

----场景:工作继续进行,主函数先结束。

void  A(url, call)
{
      开启url线程,传入call
      函数本身返回.
}

 5.结合延迟函数。

void  A(call)
{
      setTimeout(call, 10000)
      函数本身返回.
}

 

其实叫回调函数总让人有些难以理解,直接叫被调函数就得了。

callback很多人都会举的一个例子是回家后打电话,这个例子其实并不清晰,如何将这个例子的元素对应到函数上面?我觉得不必深究,认识到callback本身隐含了延迟,触发,自定义的意义即可,对应了上面3,4,5的作用,可能这也是应用最广的场合了。

引用这个文章的一句话(https://www.cnblogs.com/moxiaowohuwei/p/8438236.html):

所以回调与同步、异步并没有直接的联系,回调只是一种实现方式,既可以有同步回调,也可以有异步回调,还可以有事件处理回调和延迟函数回调,这些在我们工作中有很多的使用场景。所以其实并不是我们不认识回调函数,而是我们都萦绕在了这个“callback“ 这个词上,当你在一个函数中看到它是就会困惑,其实它只是一个形参名字而已

posted on 2019-08-01 18:02  arsh  阅读(4174)  评论(0编辑  收藏  举报

导航