回撥函式

回撥函式是作為引數傳遞給另一個函式,並在外部函式內部被呼叫以完成某種例程或動作的函式。

基於回撥的 API 的消費者編寫一個函式,該函式被傳遞給 API。API 的提供者(稱為呼叫者)接收該函式並在呼叫者的主體內的某個點呼叫(或執行)該函式。呼叫者負責將正確的引數傳遞給回撥函式。呼叫者還可能期望回撥函式返回一個特定的值,該值用於指示呼叫者的後續行為。

回撥的呼叫方式有兩種:同步非同步。同步回撥在外部函式呼叫後立即執行,沒有中間的非同步任務,而非同步回撥則在非同步操作完成後在稍後的某個時刻執行。

理解回撥是同步還是非同步呼叫對於分析副作用尤其重要。考慮以下示例

js
let value = 1;

doSomething(() => {
  value = 2;
});

console.log(value); // 1 or 2?

如果 doSomething 同步呼叫回撥,那麼最後一條語句將輸出 2,因為 value = 2 是同步執行的;否則,如果回撥是非同步的,最後一條語句將輸出 1,因為 value = 2 僅在 console.log 語句之後執行。

同步回撥的示例包括傳遞給 Array.prototype.map()Array.prototype.forEach() 等的回撥。非同步回撥的示例包括傳遞給 setTimeout()Promise.prototype.then() 的回撥。以下是 doSomething 的示例實現,它們分別同步和非同步呼叫回撥。

js
// Synchronous
function doSomething(callback) {
  callback();
}

// Asynchronous
function doSomething(callback) {
  setTimeout(callback, 0);
}

使用 Promise 指南提供了有關非同步回撥時序的更多資訊。

另見