我在尋找回調函數,到目前爲止我的理解是回調函數是一個函數,它作爲參數傳遞給另一個函數。簡單英語回電功能的優點與實例?
爲什麼要使用回調函數?回調函數的優點是什麼?堆棧溢出和其他網站上有很多答案,但沒有一個幫助我理解回撥的真正優點。
我在尋找回調函數,到目前爲止我的理解是回調函數是一個函數,它作爲參數傳遞給另一個函數。簡單英語回電功能的優點與實例?
爲什麼要使用回調函數?回調函數的優點是什麼?堆棧溢出和其他網站上有很多答案,但沒有一個幫助我理解回撥的真正優點。
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.');
}
的優點主要是示出了在異步函數。
防止在您的腳本代碼中進行不必要的檢查。 例如,使用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(...)
一樣完成。
處理DOM事件。 所有的DOM事件都需要使用回調來處理,因爲您無法預測事件何時會被觸發。
例如:
object.onclick=function(){// things you want to perform after the object is clicked};
創建擴展API或插件。例如:
var yourApi = function(passInCallback){ var args; //do some common things... passInCallback(args); }
然後您的api用戶可以在執行常用功能後執行不同的行爲。
這就是我現在所能想到的。
異步操作。有關使用回調的基本示例,請參見['setTimeout'](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout)。 –
你應該提出一個問題:「Promise的優點是什麼?」 – ftor