在Javascript中,函數是第一類對象,這表示函數可以像對像一樣按照第一類管理被使用。既然函數其實是物件:它們能被「儲存」在變數中,能作為函數參數被傳遞,能在函數中被創建,能從函數中傳回。因為函數是第一類對象,我們可以在Javascript使用回呼函數。下面我們一起了解一下回調。
簡單地講:回呼是指在另一個函數執行完成之後被呼叫的函數
稍複雜地講: 在JavaScript 中,函數也是物件。因此,函數可以傳入函數作為參數,也可以被其他函數傳回。 這樣的函數稱為高階函數。被傳入為參數的函數就叫做回呼函數。
下面說說為什麼我們需要回呼?
有一個非常重要的原因-JavaScript是事件驅動的語言。這意味著,JavaScript不會因為要等待一個回應而停止目前運行,而是在監聽其他事件時繼續執行。
來看一個基本的範例:
function first(){ console.log(1); } function second(){ console.log(2); } first(); second();
如你所料,first 函數先被執行,接著second 會被執行- 控制台輸出下面內容:
// 1 // 2
但如果函數first 包含某種無法立即執行的程式碼會如何呢?
例如我們必須傳送請求然後等待回應的 API 請求?為了模擬這種狀況,我們將使用 setTimeout,它是一個在一段時間之後呼叫函數的 JavaScript 函數。我們將函數延遲500 毫秒來模擬一個API 請求,新程式碼長這樣:
function first(){ // 模拟代码延迟 setTimeout( function(){ console.log(1); }, 500 ); } function second(){ console.log(2); } first(); second();
現在理解setTimeout() 是如何運作的並不重要,重要的是你看到了我們已經把console.log( 1); 移動到了500 秒延遲函數內部。那麼現在呼叫函數會發生什麼事呢?
first(); second(); // 2 // 1
即使我們先呼叫了 first() 函數,我們記錄的輸出結果卻在 second() 函數之後。
這不是 JavaScript 沒有按照我們想要的順序執行函數的問題,而是 JavaScript 在繼續向下執行 second() 之前沒有等待 first() 回應的問題。
所以為什麼給你看這個?
因為你不能一個接一個地呼叫函數並希望它們按照正確的順序執行。
回呼正是確保一段程式碼執行完畢之後再執行另一段程式碼的方式。
以上是js為什麼回調?的詳細內容。更多資訊請關注PHP中文網其他相關文章!