【こーるばっく】

コールバック とは?

💡 「終わったら呼んで」と渡しておく折り返し電話番号
📌 このページのポイント
コールバック(Callback) 時間 t1 t2 t3 t4 関数A(呼び出し元) fetchData(url, B) 非同期処理 APIリクエスト中… 処理完了 B(result) を実行 関数B(コールバック) 結果を処理する 関数Bを渡す(参照) 呼び出し 処理開始 完了 CB実行 非同期処理の完了時に、あらかじめ渡しておいた関数を呼び出す仕組み
コールバックの仕組み
ひよこ ひよこ

コールバックって何でわざわざ関数を渡すの?

ペンギン先生 ペンギン先生

処理が終わるタイミングがわからないから、「終わったらこれを実行して」と先に渡しておくんだ。ボタンのクリック処理も「クリックされたらこの関数を呼んで」とあらかじめ登録するコールバックだよ。

ひよこ ひよこ

コールバック地獄って何?

ペンギン先生 ペンギン先生

コールバックの中でまたコールバック、さらにその中でコールバック…とネストが深くなって、コードが右に伸びていく状態だよ。読みにくくなるだけでなく、エラー処理も各層で書かないといけなくて大変になる。

ひよこ ひよこ

同期コールバックと非同期コールバックって違うの?

ペンギン先生 ペンギン先生

全然違う。Array.forEachに渡す関数は同期コールバックで、forEachを呼んだ瞬間に中の関数が順番に実行される。一方、setTimeout や fetch に渡す関数は非同期コールバックで、後のタイミングで実行される。「コールバック=非同期」と思いがちだけど、同期的に呼ばれるコールバックも多い。

ひよこ ひよこ

コールバックとクロージャって関係あるの?

ペンギン先生 ペンギン先生

深く関係してる。コールバックとして渡す関数は、定義した場所の変数をクロージャとして閉じ込めている。例えばforループでiをキャプチャするコールバックを作るとき、varで宣言したiはループ後の値を全部共有してしまう。コールバックがどの時点の変数を見るかは、スコープクロージャの理解が必須なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
コールバックって出てきたら「あとで呼んでもらう関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Callback」 = 折り返し電話・後で呼び返す
💬 「後で call(電話)を back(折り返す)」という比喩から。処理が終わったら「折り返し連絡する」イメージ
← 用語集にもどる