2016-07-12 29 views
0

我在尋找回調函數,到目前爲止我的理解是回調函數是一個函數,它作爲參數傳遞給另一個函數。簡單英語回電功能的優點與實例?

爲什麼要使用回調函數?回調函數的優點是什麼?堆棧溢出和其他網站上有很多答案,但沒有一個幫助我理解回撥的真正優點。

+2

異步操作。有關使用回調的基本示例,請參見['setTimeout'](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout)。 –

+0

你應該提出一個問題:「Promise的優點是什麼?」 – ftor

回答

0

JavaScript有一個執行線程。

JavaScript不搶佔正在運行的線程。

在調用堆棧清空之前,程序代碼中的其他內容都不能運行。這被稱爲「運行到完成」。

因此,在程序中運行的任何東西都會阻塞其他所有東西(字面意思是「一切」)。因此,如果你有任何被CPU以外的東西(比如網絡請求或者等待用戶)綁定的東西,那麼就CPU來說是非常浪費的,因爲執行的線程被阻塞,只需等待有事要發生。所以CPU處於空閒狀態。

因此,JavaScript運行時提供了避免這種情況的機制。它使功能的特點是等待(如網絡請求)異步

這意味着執行的JavaScript線程可以繼續,而運行時卻在等待您。

您可以爲這些異步函數提供回調來指定繼續。即控制流應從何時完成異步操作中提取。

當異步操作完成時,運行時會在運行時內部的「作業隊列」中放置一個「作業」。

這些作業封裝了函數指針(回調函數)和用於調用回調的參數。

當調用堆棧下一個空並且隊列中的其他作業已經完成時,然後將作業從作業隊列中移除並實例化一個堆棧幀(「執行上下文」)並放置在堆棧上。

運行時然後從此堆棧幀開始執行。

有時候這種行爲被封裝在承諾API中,使其更加方便,但機制是相同的。

setTimeout(callback, 2000); 
 
document.write('Cool, I can do some stuff while the setTimeout is waiting.'); 
 

 
function callback() { 
 
    document.write('Hello from the callback.'); 
 
}

2

的優點主要是示出了在異步函數。

  1. 防止在您的腳本代碼中進行不必要的檢查。 例如,使用ajax獲得響應: var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { // things you want to perform after request is done. }; xhttp.open("GET", url, true); xhttp.send();
    以這種方式,您不需要連續檢查請求是否像使用setInterval(...)一樣完成。

  2. 處理DOM事件。 所有的DOM事件都需要使用回調來處理,因爲您無法預測事件何時會被觸發。
    例如:
    object.onclick=function(){// things you want to perform after the object is clicked};

  3. 創建擴展API或插件。例如:
    var yourApi = function(passInCallback){ var args; //do some common things... passInCallback(args); }
    然後您的api用戶可以在執行常用功能後執行不同的行爲。

這就是我現在所能想到的。