什么是回调函数

来源:互联网 发布:oppo软件商店安装 编辑:程序博客网 时间:2024/05/09 11:42
打的比方比较通俗生动
-------------------
生动的描述
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。(by常溪玲)

专业的解释
In computer programming, a callback is a reference to executable code, or a piece of executable code, that is passed as an argument to other code. This allows a lower-level software layer to call a subroutine (or function) defined in a higher-level layer.

数学的定义
是设计模式里面template method pattern当template method的数量无限趋近于一的时候的极限。(by vczh )

通俗易懂的说法
想象你的朋友将要离开你家,走的时候,你告诉对方说“你到家后,给我打个电话,这样我才知道你安全到达了。” 这就是字面上的call back

举例说明
<span style="font-family: 'Courier New';"><span class="co2" style="color: rgb(51, 153, 51);">#include <stdio.h></span><span class="co2" style="color: rgb(51, 153, 51);">#include <stdlib.h></span> <span class="coMULTI" style="color: rgb(128, 128, 128); font-style: italic;">/* The calling function takes a single callback as a parameter. */</span><span class="kw4" style="color: rgb(153, 51, 51);">void</span> PrintTwoNumbers<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">*</span>numberSource<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">void</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="br0" style="color: rgb(0, 153, 0);">{</span>    <span class="kw3" style="color: rgb(0, 0, 102);">printf</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="st0" style="color: rgb(255, 0, 0);">"%d and %d<span class="es1" style="color: rgb(0, 0, 153); font-weight: bold;">\n</span>"</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> numberSource<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">,</span> numberSource<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span> <span class="coMULTI" style="color: rgb(128, 128, 128); font-style: italic;">/* A possible callback */</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> overNineThousand<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">void</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="br0" style="color: rgb(0, 153, 0);">{</span>    <span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw3" style="color: rgb(0, 0, 102);">rand</span><span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">%</span> <span class="nu0" style="color: rgb(0, 0, 221);">1000</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="sy0" style="color: rgb(51, 153, 51);">+</span> <span class="nu0" style="color: rgb(0, 0, 221);">9001</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span> <span class="coMULTI" style="color: rgb(128, 128, 128); font-style: italic;">/* Another possible callback. */</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> meaningOfLife<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">void</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="br0" style="color: rgb(0, 153, 0);">{</span>    <span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="nu0" style="color: rgb(0, 0, 221);">42</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span> <span class="coMULTI" style="color: rgb(128, 128, 128); font-style: italic;">/* Here we call PrintTwoNumbers() with three different callbacks. */</span><span class="kw4" style="color: rgb(153, 51, 51);">int</span> main<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="kw4" style="color: rgb(153, 51, 51);">void</span><span class="br0" style="color: rgb(0, 153, 0);">)</span> <span class="br0" style="color: rgb(0, 153, 0);">{</span>    PrintTwoNumbers<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">&</span><span class="kw3" style="color: rgb(0, 0, 102);">rand</span><span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>    PrintTwoNumbers<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">&</span>overNineThousand<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>    PrintTwoNumbers<span class="br0" style="color: rgb(0, 153, 0);">(</span><span class="sy0" style="color: rgb(51, 153, 51);">&</span>meaningOfLife<span class="br0" style="color: rgb(0, 153, 0);">)</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span>    <span class="kw1" style="color: rgb(177, 177, 0);">return</span> <span class="nu0" style="color: rgb(0, 0, 221);">0</span><span class="sy0" style="color: rgb(51, 153, 51);">;</span><span class="br0" style="color: rgb(0, 153, 0);">}</span></span>

回调的作用
回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。

看完后,你觉得还有可补充的内容,欢迎给我留言:)

参考资料
http://stackoverflow.com/questions/824234/what-is-a-callback-function?answertab=votes#tab-top

http://en.wikipedia.org/wiki/Callback_(computer_science)

http://www.zhihu.com/question/19801131

http://wmnmtm.blog.163.com/blog/static/3824571420105484116877/

http://stackoverflow.com/questions/9596276/how-to-explain-callbacks-in-plain-english-how-are-they-different-from-calling-o
0 0
原创粉丝点击