回调函数
回调函数是作为参数传递给另一个函数,并在外部函数内部被调用以完成某种例程或动作的函数。
基于回调的 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 指南提供了有关异步回调时序的更多信息。