1. 程式人生 > 其它 >【程式設計基礎第十二講】web開發程式設計基礎--回撥函式

【程式設計基礎第十二講】web開發程式設計基礎--回撥函式

存在問題:

我們都知道C語言存在回撥函式,那麼JavaScript中的回撥函式是如何實現的?

如何實施:

a.非引數回撥函式

這類回撥函式大多比較簡單,往往傳一個函式名就可以。諸如此類的用法,有setInterval函式,大致的實現如下

setInterval(function(){},timer);
這個function(){};就是回撥函數了,那麼setInterval是怎麼實現的呢?

如此,就有雛形了,接下來,該如何寫這個函式。我們知道,js是可以通過函式名來呼叫函式的。

舉個例子,

var a = function(){

}a();//以上程式碼中,匿名函式可以通過變數a來呼叫

由此想到,demo函式可以通過,callback()來呼叫。

但,等等,萬一沒傳引數,或者傳的不是函式物件該如何。於是,可以判斷引數以及其型別

function demo(one,callback)
{
	alert(one);
	if(callback && callback instanceof Function) //判斷是否傳參,以及引數型別
		callback();
}

demo('a',function(){
	alert('b');
})

以上就是第一種方法,是不是很簡單

b.帶引數的回撥函式。

這類函式,往往用的比較多。比如常用的jquery中,遍歷陣列或物件的函式each()。他接受一個物件或陣列和一個回撥函式,來完成對遍歷結果的輸出。

如果我們用第一種方法,則無法完成傳參。此時我們該如何做?

首先,我們先寫出該函式的大致雛形(為了方便說明,以下函式只針對陣列,遍歷物件,請大家自行實現)

function each(arr,callback){
       for(var i = 0,l = arr.length; i < l ; i++ ){       
       //..code
      }
}

以上程式碼中,我們遍歷了陣列,但是並不能通過回撥函式來使用。

於是我們想到call函式

上面的程式碼可以改寫成如下

function each(obj,callback){
	for(var i=0,l = obj.length;i<l;i++){
		callback.call(obj,i,obj[i]); //此處的意思是,用callback來替換obj,
		//所以實現為callback(i,obj[i]),正好將陣列遍歷;
	}
}
//為了證明函式的正確性,我們做如下測試

var json = [6,5,3,2,8,4];

each(json,function(i,n){
    alert(i+"----------"+n);
});
//輸出的結果為0-----6等等