今天看了一个回调函数的例子 觉得解释的不错,拿来保留着:
他说 回调函数 就是 你找同学办事,但不知 他什么时候有空,就打电话 给他告诉他,当他做完事情,再打电话给你。
1、ajax 回调函数解释:
function test{
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
xmlHttp.onreadystatechange = callback;
xmlHttp.open(…);
xmlHttp.send(null);
}
function callback{ }
xmlHttp 发出请求 ==========你打电话给你同学
xmlHttp.onreadystatechange = callback==================状态改变 即你同学完成事情,打电话给你。
2、HibernateTemplate 的例子:
interface CallBack{
public void doCRUD();
}
public class HibernateTemplate {
public void execute(CallBack action){
getConnection();
action.doCRUD();
releaseConnection();
}
public void add(){
execute(new CallBack(){
public void doCRUD(){
System.out.println("执行add操作...");
}
});
}
public void delete(){
execute(new CallBack(){
public void doCRUD(){
System.out.println("执行delete操作...");
}
});
}
public void getConnection(){
System.out.println("获得连接...");
}
public void releaseConnection(){
System.out.println("释放连接...");
}
}
execute方法可以体现出模板模式。以add方法为例,调用execute方法就相当于你打电话给你的同学,但是你的同学说需要时间,就像execute方法需要首先获得连接一样,于是你把CallBack匿名类传递给它,在它获得连接之后会执行你的add操作,这就相当于你把电话号码告诉你的同学,他解决问题之后再打给你一样。当然这种通俗理解不能很好地体现出Spring中的Callback模式和Template模式合用的简单与灵活,这里只是利于理解一点。
3、还有一个java 例子:
public class CallBackTest {
public static void main(String[] args) {
new CallBackTest().doExecute(new CallBack(){
public void execute() {
System.out.println("正在执行....");
}
});
}
private void doExecute(CallBack callBack) {
System.out.println("回调前.....");
callBack.execute();
System.out.println("回调后.....");
}
}
class CallBack{
public void execute(){
}
}
4、一个js的例子:
<script type="text/javascript">
function Test(){
var self=this;
this.func1=function(){self.test2(function (){ alert('alert');})};
}
Test.prototype.test2=function(func){
alert("before");
func();
alert("end");
}
new Test().func1();
</script>