Callback function (コールバック関数)

コールバック関数は、引数として他の関数に渡され、外側の関数の中で呼び出されて、何らかのルーチンやアクションを完了させる関数のことです。

コールバックベースの API の利用者は、API に渡す関数を書きます。API の提供者(caller と呼ばれる)は関数を受け取り、呼び出し側の本体内のある時点で関数をコールバック(実行)します。呼び出し側はコールバック関数に正しい引数を渡す責任があります。また、呼び出し側はコールバック関数からの特定のな返値を期待することがあり、呼び出し側のさらなる動作を指示するために使用します。

コールバックの呼び出され方には、同期コールバックと非同期コールバックの 2 つの方法があります。同期コールバックは、外部関数の呼び出しの直後に呼び出され、非同期タスクは介在しません。一方、非同期コールバックは、非同期処理が完了した後のある時点で呼び出されます。

コールバックが同期的に呼び出されるのか、非同期的に呼び出されるのかを理解することは、 副作用を分析する際に具体的な意味があります。次の例を見てください。

js
let value = 1;

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

console.log(value);

もし doSomething がコールバックを同期的に呼び出すのであれば、value = 2 が同期的に実行されるので、最後の文は 2 をログ出力します。もしコールバックが非同期的であれば、value = 2 が実行されるのは console.log 文の後なので、最後の文は 1 をログ出力します。

同期コールバックの例としては、Array.prototype.map()Array.prototype.forEach() などに渡されるコールバックが挙げられます。非同期コールバックの例としては、setTimeout()Promise.prototype.then() に渡すコールバックがあります。

プロミスの使用ガイドには、非同期コールバックのタイミングについての詳しい情報があります。

関連情報