先看看java中的回呼函數,java很多模式及其類似,有訪問者,觀察者等模式。
Java程式碼
公開課測驗{
/**
* @參數參數
*/
公共靜態無效主(字串[] args){
// TODO 自動產生的方法存根
新的測試()。
公共無效執行(){
System.out.println("正在執行中....");
}
});
}
私人無效 doExecute(回調回調){
System.out.println("回呼前......");
回調.execute();
System.out.println("回呼後......");
}
}
公共類別測試 {
/**
* @參數參數
*/
公共靜態無效主(字串[] args){
// TODO 自動產生的方法存根
new Test().doExecute(new CallBack(){
公共 voidexecute() {
System.out.println("正在執行中....");
}
});
}
private void doExecute(CallBack callBack) {
System.out.println("回呼前......");
回調.execute();
System.out.println("回呼後......");
}
} 輸出結果為:
Java程式碼
回調前......
正在執行....
回調後…
回調前…
正在執行....
回調後.....這裡充分的體現了不是我來呼叫你,而是你來呼叫我
。
回調可以用在哪些地方呢?
1,例如著名的ioc的事務處理就是這樣的,每個方法的事務處理都是一樣的,都是一些開始一個事務,用try包住,等等,所以就可以不管它們,變的只要執行方法的不同,例如存儲,刪除,查詢什麼的。
2,可以減少寫類,一個接口,可以有很多的實現類,在回調裡面,就匿名了。
Java程式碼
介面DatabaseObjectFactory {
/**
* 傳回與 id 關聯的對象,如果
* 無法載入物件。
*
* @param id 要載入的物件的 id。
* @return id指定的對象,如果不能則回傳null
* 被載入。
*/
公共物件loadObject(長ID);
}
介面DatabaseObjectFactory {
/**
* 傳回與 id 關聯的對象,如果
* 無法載入物件。
*
* @param id 要載入的物件的 id。
* @return id指定的對象,如果不能則回傳null
* 被載入。
*/
公共物件loadObject(長ID);
}
外部呼叫的根據id不同產生任何你想要的物件。
在看看javascript裡面的:
JS程式碼
函數測試()
{
var self=這個;
this.func1=函數()
{
self.test2(function (){alert('正在執行');})
}
}
測試.prototype.test2=函數(func)
{
Alert("回呼前做一些事情");
如果(函數)
函數();
Alert("回呼後做一些事情");
}
函數測試()
{
var self=這個;
this.func1=函數()
{
self.test2(function (){alert('正在執行');})
}
}
Test.prototype.test2=函數(func)
{
Alert("回呼前做一些事情");
如果(函數)
函數();
Alert("回呼後做一些事情");
}
然後,在html裡面:
Html程式碼
<html>
<頭>
<腳本類型=文字/javascript src="1.js">
</腳本>
<腳本>
新的測試().func1();
</腳本>
</頭>
<正文>
</正文>
</html>
<html>
<頭>
<腳本類型=文字/javascript src="1.js">
</腳本>
<腳本>
新的測試().func1();
</腳本>
</頭>
<正文>
</正文>
</html>
的
回檔都差不多。