コールバック
公開日: 2025/06/02
コールバックとは?──非同期処理の原点にして柔軟な関数設計手法
はじめに
JavaScript の非同期処理といえば、今は
Promise
や async/await
が主流です。しかし、それらの“前身”にあたる仕組みが コールバック(Callback)。
本記事では、コールバックの基本概念から、使い方、コールバック地獄、モダンな代替手段との違いまでを体系的に解説します。
基本情報・概要
コールバックとは、関数に引数として渡される関数のことです。
処理が完了したタイミングで呼び出され、「後で呼ぶ関数」=“呼び戻し”関数という意味があります。
主な特徴:
- 関数型プログラミングにおける基本的な構造
- 非同期処理の制御(完了後の処理)に使われる
- イベント駆動やフック処理にも活用される
コールバックは「処理が終わったらこれをやって、という関数の引渡し」です。
比較・分類・特徴の表形式まとめ(任意)
項目 | 内容 |
---|---|
同期コールバック | 即座に呼び出される関数 |
非同期コールバック | イベントやタイマー、I/O完了後に呼び出される |
明示的な関数定義 | 名前付き関数で渡す |
無名関数(匿名) | アロー関数や即時定義で渡す |
非同期コールバックは、非同期処理の「後処理」を関数として切り出したものです。
深掘り解説
✅ 基本的な使用例(非同期)
setTimeout(() => { console.log('1秒後に実行されました'); }, 1000);
の第1引数が コールバック関数setTimeout
- 1秒後にその関数が呼ばれる
✅ 名前付き関数として渡す例
function greet(name) { console.log(`こんにちは、${name}さん`); } function run(callback) { const user = '太郎'; callback(user); } run(greet); // => こんにちは、太郎さん
- コールバックは 「どんな処理を後でやるか」を引数で渡す構造
- 汎用関数の柔軟性と再利用性を高める手段でもある
応用・発展的な使い方
- イベントリスナー登録:
element.addEventListener('click', callback)
- 配列の高階関数:
,array.map(fn)
などもコールバックベースfilter(fn)
- 制御フローの構築:非同期ステップを関数単位で整理
- ミドルウェア設計:Express.js や Redux などではコールバックによる処理分岐が基本
コールバックは制御構造を柔軟に設計するための原始的だが強力な手法です。
よくある誤解と注意点(任意)
- 「コールバック=非同期」ではない:即座に呼ばれる(同期)パターンも多い
- ネストが深くなると可読性が下がる:いわゆる “Callback Hell”
- try/catchが効かない非同期領域:例外処理の組み込みには注意が必要
- 重複定義や二重呼び出しのバグ:状態管理を丁寧に設計すべき
コールバックは自由度が高い分、設計力が試される仕組みです。
まとめ
コールバックは、関数の中に“次に行う処理”を渡すことで、処理の流れを柔軟に設計するための構造です。
非同期処理を扱う際には必須だった技術であり、現在もイベントハンドリングや関数型プログラミングの中核として使われています。
Promise や
async/await
の登場により出番は減りましたが、コールバックの概念を理解することは、JavaScriptの本質を理解する第一歩になります。