javaScript回呼函數

來源:互聯網
上載者:User

標籤:如何   狀態   執行   條件   函數參數傳遞   err   ...   非同步   回呼函數   

一、概念

回呼函數,或簡稱回調,是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程式。

咋一看回呼函數的概念,可能並不能立即理解什麼是回呼函數。通俗的講,回呼函數就是以函數作為參數傳給另一個函數執行。比如:有一個函數A,函數B,
將A函數作為B函數的參數,然後在B函數裡執行A函數,這就是最簡單的回調。

var A = function(){    console.log("我是回呼函數A。");};var B = function(callback){    console.log("我是主函數B內的代碼。");    callback();};B(A);

 

這下大夥應該能理解什麼是回調了吧。估計大夥會想,這樣的回調有意義嗎?把A函數的代碼直接寫到B函數裡面不是更好嗎?
如果在實際項目裡這樣寫回調真的是糟糕透了。往下看,瞭解回調是如何應用的。

 

二、同步回調和非同步回調

什麼,回調不是非同步嗎?仔細看看上面的例子,大家就能明白,回調不一定都是非同步,他有同步和非同步之分。上面的樣本就是一個同步回調,
所以我不想在過多的解釋什麼是同步回調,接下來,我們看看什麼是非同步回調。

由於 JS 是單線程的,一旦我們要執行一個長耗時的任務時,如果一直單線程的堵塞下去會導致程式的等待時間過長而使頁面失去響應,非常影響使用者體驗。
為瞭解決這樣的問題,我們就可以使用非同步回調。將耗時的任務扔給非同步去做,做好了再通知下我們做完了,我們拿到資料繼續往下走。

下面是 ajax 非同步請求的部分代碼:

var xhr;......xhr.onreadystatechange = function(){    if(xhr.readystate === 4 && xhr.status === 200){        //do something    }}

 

當瀏覽器發起 ajax 請求的時候,會單開一個線程發起 http 請求,這樣就能把耗時的 http 請求獨自運行。在請求的過程中 readystate
的值會不斷的變化,對應著不同的請求狀態。大家看看 jquery 對 ajax 的封裝就能明白,它就是根據 readystate 返回的狀態,執行不
同的回調,最常用的兩個回調應該是 success 函數和 error 函數。

非同步回調的應用,如下,有 A 和 B 兩個函數:

//一般情況下,應該是這樣的A();B();//當 A 函數是一個長耗時任務時,為瞭解決 A 函數長時間阻塞頁面問題//可以將 B 函數作為 A 函數的回調執行function A(callback){    setTimeout(function () {        // A 的任務代碼        callback();    }, 3000);}A(B);

 

因為 JS 是單線程的,所以非同步回調也不是真正意義上的非同步,它只不過是一個偽非同步執行,它通常利用定時器和條件判斷來偽裝非同步執行。

javaScript回呼函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.