【程式設計基礎第十二講】web開發程式設計基礎--回撥函式
阿新 • • 發佈:2022-05-04
我們都知道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等等