JS中回調函數(callback)理解


原文:https://blog.csdn.net/undericon/article/details/81188923

字面上理解下來就是,回調就是一個函數的調用過程。那么就從理解這個調用過程開始吧。函數a有一個參數,這個參數是個函數b,當函數a執行完以后執行函數b。那么這個過程就叫回調。
其實中文也很好理解:回調,回調,就是回頭調用的意思。函數a的事先干完,回頭再調用函數b。
舉個現實的例子:約會結束后你送你女朋友回家,離別時,你肯定會說:“到家了給我發條信息,我很擔心你。”對不,然后你女朋友回家以后還真給你發了條信息。小伙子,你有戲了。
其實這就是一個回調的過程。你留了個函數b(要求女朋友給你發條信息)給你女朋友,然后你女朋友回家,回家的動作是函數a。她必須先回到家以后,函數a的內容執行完了,再執行函數b,然后你就收到一條信息了。
這里必須清楚一點:函數b是你以參數形式傳給函數a的,那么函數b就叫回調函數。
 也許有人有疑問了:一定要以參數形式傳過去嗎,我不可以直接在函數a里面調用函數b嗎?確實可以。求解中。
解惑:如果你直接在函數a里調用的話,那么這個回調函數就被限制死了。但是使用函數做參數就有下面的好處:當你a(b)的時候函數b就成了回調函數,而你還可以a(c)這個時候,函數c就成了回調函數。如果你寫成了function a(){...;b();}就失去了變量的靈活性。
 
    window.onload = function () {
        test()
    };

    function a(callback) {
        alert("我是parent函數a!");
        alert("調用回調函數");
        callback();
    }

    function b() {
        alert("我是回調函數b");
    }

    function c() {
        alert("我是回調函數c");
    }

    function test() {
        // a(b);
        // a(c);

        A(4, B(3)) //輸出1  4-3=1
    }


    function A(a, callback) {

        var b = callback;

        alert(a + b);

    }

    function B(c) {

        return (-c);

    }
根據jquery的ajax請求常見的場景再去寫一個示例:
我包裝了jQuery的ajax方法:
function doAjax(u,param,callback){
      $.ajax({
            type:'POST',
            url:u,
            data:param,
            success:callback
      });
}

function showAlert(data){
     alert(data);
}

 

 

 
比如這樣調用 doAjax("url","id=1",showAlert);
$.ajax 在success后,會返回一個data到showAlert中,顯示出來 ,沒有問題.
可是,當我想多傳一個參數給showAlert時怎么寫?
寫成doAjax("server.php","id=12&type=1",showAlert("hi",data))、或者把上面的success:callback 寫成success:callback(msg,data)顯然都不行,如之奈何?
其實很簡單,很多方法都定義了回調函數,回調函數也是函數,就是說不管怎么傳,只需要是個函數類型即可。寫法如下:
方式1,

doAjax(參數1,參數2,function(request,opts){
         callback(request,opts,agrs);
 });

function callback(request,opts,args){

            
};

方式2,

var args=N;

doAjax(參數1,參數2,function(request,opts){
       var X=N;
       回調函數代碼塊..
       和以上幾乎一樣,看個人編碼方式選擇。     
});

 

 
再看一個從父函數傳遞給回調函數的示例
    function e(m, n, Callback) {
        var d = m + n;
        alert("一個從父函數e 產生的參數將要被傳遞給回調函數 ,這個參數是:" + d); //這里才寫你想調用的函數---參數要正確     
        Callback(d);
    }

    function callback(data) {
        alert("我是回調函數,我的名字叫:callback ,我接收到來自父函數的參數,參數是:" + data);
    }
    e(1, 2, callback)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM