参考维基百科链接:

  1. 中文:http://zh.wikipedia.org/wiki/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0
  2. 英文:http://en.wikipedia.org/wiki/Callback_(computer_programming)


回调通常与原始调用者处于相同的抽象层

回调函数的意义在于底层library代码中,需要调用函数,但这些函数无法在library阶段确定,所以要在application阶段由用户来定义。回调机制允许调用者在实际应用程序编写中调整底层library函数的行为。

这种机制使得library函数无法完全成为一个封闭的系统,必然给一些工具的设计中带了挑战和研究点。

这种情况在很多语言中都用例子,最典型的是OO语言中,很多设计模式中需要用到回调机制。

例子:

  • 最早的例子应该就是Unix中的“信号”机制:
    例如下面代码中,当程序接收到信号SIGUSR1时,将回调函数sig。

    void sig(int signum)
    {
    printf("Received signal number %d!\n", signum);
    }
    signal(SIGUSR1, sig);
  • JavaScript:几乎所有JS的程序中都用到了callback机制。
  • Java:在我的研究中,目前关心Java的回调(回调广泛用于Swing和Android程序设计),例如addEventListener等。举一个Java设计模式中的例子:Observer模式
    // Client端代码行:mySubject为Server端的对象,调用Server端的Register方法传入一个对象
    mySubject.Register(myObserver);

    通过Register函数注册Observer。

    // Server端代码行:Server端代码回调了Client端的Update方法(是Client端定义的)
    observer.Update(message);

    每次发生一个事件,调用observer自己实现的Update函数。
    由于Update函数是Client端设计的,因此这个函数便是回调函数。

语言机制:

很多语言都提供了一些特殊的语言机制来支持回调,详见这里

  • C/C++/Pascal:函数指针(function pointer)作为参数传入函数
  • JavaScript, Lua, Python, Perl, PHP:函数对象(function object)作为参数传入函数
  • C++:C++还可以通过重载括号,也就是重载函数调用操作符,来实现生成函数对象(C++ allows objects to provide their own implementation of the function call operation)
  • 在缺少函数类型的参数的面向对象的程序语言中,例如Java,回调可以用传递抽象类接口来模拟。回调的接收者会调用抽象类或接口的方法,这些方法由调用者提供实现。这样的对象通常是一些回调函数的集合,同时可能包含它所需要的数据。这种方法在实现某些设计模式时比较有用,例如访问者模式,观察者模式与策略模式。(In object-oriented programming languages without function-valued arguments, such as Java, callbacks can be simulated by passing an instance of an abstract class or interface, of which the receiver will call one or more methods, while the calling end provides a concrete implementation. Such objects are effectively a bundle of callbacks, plus the data they need to manipulate. They are useful in implementing various design patterns such as Visitor, Observer, and Strategy.)

回调函数(callback)的更多相关文章

  1. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  2. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({ url:"test.json", type: "GET" ...

  3. 理解javascript中的回调函数(callback)

    以下内容来源于:http://www.jb51.net/article/54641.htm 最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs ...

  4. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  5. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  6. java基础-回调函数(callback)

    java基础-回调函数(callback) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数 ...

  7. C++回调函数(callback)的使用

    什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事 ...

  8. 回调函数callback使用例子

    代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <tit ...

  9. [转]C++回调函数(callback)的使用

    原文地址:http://blog.sina.com.cn/s/blog_6568e7880100p77y.html 什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递fo ...

  10. js回调函数(callback)(转载)

    学习jquery时,对回调函数感觉很困惑,在晚上找了半天,忽然发现这篇文章很浅显,基本说明了问题.故转载 原文: 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速go ...

随机推荐

  1. zabbix微信告警实践

    首先你得有个企业号!!!具体操作步骤可以参考http://itnihao.blog.51cto.com/1741976/1733245,里面写的很详细就不重复了. 微信公众号注册并配置完成后,还需要让 ...

  2. Window Server 2012 R2 下 IE11 浏览器 无法安装Flash 怎么解决

    不知道是不是我这个的系统的问题,不仅仅是图片有问题,Flash也有问题.用IE打开页面,一直提示安装,简直不胜其烦.尽管我有下载很多浏览器,但习惯了IE,所以也没想用其他浏览器代替IE. 刚开始我是点 ...

  3. [刘阳Java]_MyBatis_常规标签的用法_第6讲

    一般MyBatis最基本标签,或者说初学者上手最快的标签就是增删改查 1.<insert>标签,在MyBatis中完成数据添加操作 <insert id="addMyUse ...

  4. 关于monkeyrunner的一些初步理解性的题目

    1.Monkeyrunner中包含几个基本类?分别大概的作用是什么? Monkeyrunner中基本包含了MonkeyRunner,MonkeyDevice,MonkeyImage MonkeyRun ...

  5. javascript函数声明方式

    javascript中函数的声明有三种方式: 最常见的函数声明: fun();//可以调用,因为这种声明方式会被浏览器优先加载. function fun() { alert("声明式的函数 ...

  6. asp.net Word Document Open return null

  7. PHP的字符串函数

      1.字符串的连接 字符串可以使用字符串连接符(.)来连接 常见的用途是建立大块的HTML字串代码,赋值号 (=) 连接符 (.) 可以被简写合并为 (.=) 符号 2.在字符串中使用变量 这个功能 ...

  8. 【windows 下安装 mysql-server 无法登录问题解决】

    ----------------------------- 无感的首行 ----------------------------- 新版 mysql-server 5.7 安装后发现无法使用 mysq ...

  9. SVN常用问题汇总

    参考文档.http://www.cnblogs.com/newsea/archive/2012/04/28/2474818.html 1.客户端取消记住用户名和密码. 2.汉化后设置为中文

  10. Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍

    引文 学习Hadoop的同学们,一定知道如果运行Hadoop自带的各种例子,以大名鼎鼎的wordcount为例,你会输入以下命令: hadoop org.apache.hadoop.examples. ...