很經常我們會遇到這樣一種情況:
例如,你需要和其他人合作,別人提供資料,而你不需要關注別人擷取或者構建資料的方式方法。
你只要對這個拿到的資料進行操作。
這樣,就相當於我們提供一個外在的函數,別人調用這個函數,返回相應的資料。
例如:
function (num , numFun) {if(num < 10){//do sth}else {//do sthnumFun();}}
在num的判斷之後執行NumFun的函數。
所謂的回呼函數,可以這樣理解,它是為了實現這樣一個目的:
draw方法是一個繪圖的函數
現在我們調用這個draw方法,希望在圖形繪製完成之後,我們能夠進行相應的操作,為了保證這個操作是在繪圖完成之後調用的。
我們就採取這樣一種方法,將fun作為參數傳遞進draw,然後再draw函數執行完成之後,調用這個傳遞的fun方法
function draw(beforeDraw, afterDraw) {beforeDraw();//繪圖//dosthafterDraw();}//別人調用draw(function(){alert('繪圖之前執行');//繪圖之前,do sth},function(){alert('繪圖之後執行');//繪圖之後,do sth})
當然利用這種思想,我們可以在很多地方有很巧妙的使用:
比如之前舉得例子
你只關注資料的返回值,不關注別人調用這個方法是怎麼操作的。
方法1:
就可以利用回呼函數的思想,定義方法傳入的參數為函數,別人調用是,在函數參數中執行相應的操作,然後返回你所需要的值:
var drawBase = {init : function (getdata){ var mydata = getdata(); $('#testID').bind('click', function(e){ //利用mydata進行繪圖操作})},}
//別人在調用你這個函數時候,傳入的參數為函數,函數中進行操作後返回相應的值
drawBase.init(function () {//do sth一系列操作之後return data;})
方法2、
你也可以,先定義一個空方法,然後別人再去重寫這個方法,進行一系列的操作之後,返回相應的資料
然後我們使用時候,就可以拿到這個返回的資料了:
Exp:
var drawBase = {getdata = { },init : function () {$('testID').bind('click', function () { var data = drawBase.getdata();//使用data進行你所需要的操作})}}
//別人調用時候,就需要重寫這個方法
drawBase.getData = function () { //一系列操作,得到data, return data;}
這兩種方法可以這樣理解:
方法一,綁定事件和操作,是在別人調用時候才做的,因此那個時候getdata()的方法是已知的可以直接綁定
方法二,綁定的事件和操作,是之前進行的,此時不知道getdata()的方法,因而給定一個空的方法定義,在別人調用重寫後,就可以拿到相應的資料
這個是我個人的一些看法~
Exp:
var stu={ init : function(callback){ //TODO ... if(callback && (callback instanceof Function){ callback('init...');//回調 } }};
別人調用,傳入函數參數:
stu.init(function(){ //這就是回調了...});
加油!