【ITニュース解説】Callback Function in JavaScript
2026年10月23日に「Dev.to」が公開したITニュース「Callback Function in JavaScript」について初心者にもわかりやすく解説しています。
ITニュース概要
コールバック関数は、JavaScriptで他の関数に引数として渡され、その関数内で後から実行される特殊な関数だ。これを使うと、特定の処理が終わった後に関数を実行したり、非同期処理の完了を待ってから次の処理を動かしたりできる。setTimeout関数もその一つだ。
ITニュース解説
プログラミングの世界、特にJavaScriptでは、様々な機能が組み合わさって動的なアプリケーションが作られている。その中でも「コールバック関数」という概念は、JavaScriptの柔軟性や強力さを理解する上で非常に重要となる。システムエンジニアを目指す初心者にとって、このコールバック関数は少し複雑に感じるかもしれないが、その仕組みを理解すれば、より高度なプログラミングへの道が開けるだろう。
コールバック関数とは、一言で言えば「他の関数に引数として渡され、その関数の中で後から呼び出される関数」のことだ。通常の関数は、定義した後に名前を使って直接呼び出される。しかし、コールバック関数の場合は、ある処理を実行する際に、その処理の途中で実行してほしい別の処理を「預ける」ようなイメージを持つと理解しやすい。親となる関数が、渡されたコールバック関数を、特定のタイミングで、あるいは特定の条件が満たされたときに実行するのだ。
具体的な例を見てみよう。まず、greetという関数がある。これは、名前を受け取って「Hello [名前]」というメッセージをコンソールに出力するシンプルな関数だ。
1function greet(name) { 2 console.log("Hello " + name); 3}
次に、userという関数がある。このuser関数は、callbackという名前の引数を一つ受け取る。このcallbackが、まさにコールバック関数を指している。user関数は、受け取ったcallback関数を「Sajin Joe」という引数を渡して実行する。
1function user(callback) { 2 callback("Sajin Joe"); 3}
ここで重要なのは、user関数がgreet関数そのものを直接知っているわけではないという点だ。user関数は単に「callbackという引数が関数であると信じて、それを実行する」という役割を持っている。
実際にこれらの関数を組み合わせて使うには、user関数を呼び出す際に、greet関数を引数として渡す。
1user(greet);
このコードが実行されると、まずuser関数が呼び出される。user関数は引数としてgreet関数を受け取り、それをcallbackとして保持する。そして、user関数の中でcallback("Sajin Joe")が実行されるため、実質的にはgreet("Sajin Joe")が実行されることになる。その結果、コンソールには「Hello Sajin Joe」と出力される。
このように、greet関数はuser関数に「Sajin Joeという名前を使って挨拶してほしい」という処理を任せているわけではなく、user関数が「Sajin Joeというデータを使って、渡された関数を実行する」という役割を担っているのだ。これにより、user関数はどんな挨拶の仕方をすべきかを知る必要がなくなり、汎用性が高まる。
コールバック関数は、特定の処理を抽象化し、再利用性を高める際にも役立つ。例えば、数値計算を行うケースを考えてみよう。
calculateという関数がある。これは二つの数値aとb、そしてcallbackという名前の関数を受け取る。calculate関数は、受け取ったcallback関数にaとbを引数として渡して実行し、その結果をコンソールに出力する。
1function calculate(a, b, callback) { 2 console.log(callback(a, b)); 3}
次に、具体的な計算処理としてaddという関数がある。これは二つの数値xとyを受け取り、それらを足し合わせた結果を返す。
1function add(x, y) { 2 return x + y; 3}
ここでcalculate関数を呼び出す際に、add関数をコールバックとして渡してみよう。
1calculate(10, 20, add);
このコードが実行されると、calculate関数は10と20という数値、そしてadd関数を引数として受け取る。calculate関数の中では、callback(a, b)が実行されるため、これは実質的にadd(10, 20)が実行されるのと同じになる。add関数は10と20を足して30を返す。その30がconsole.logによって出力される。
もし引き算や掛け算を行いたい場合でも、calculate関数自体を変更する必要はない。単にsubtract関数やmultiply関数といった別の計算関数を用意し、それをcalculateの第三引数に渡すだけで、様々な計算処理に対応できるようになる。このように、コールバック関数を利用することで、主要な処理ロジック(この場合はcalculate)と、具体的な処理内容(add、subtractなど)を分離し、コードの柔軟性と保守性を高めることができる。
JavaScriptにおいてコールバック関数が特に重要になるのは、非同期処理を扱う場合だ。非同期処理とは、ある処理の完了を待たずに次の処理へと進む実行方式のことだ。例えば、時間のかかる処理(ファイルの読み込み、ネットワーク通信など)がある場合、その処理が終わるまでプログラム全体が停止してしまうのは好ましくない。そこで、時間のかかる処理を開始し、その処理が終わったときに「呼び出してほしい」関数をコールバックとして渡しておくことで、プログラムは他の処理を進めながら、完了時に指定された処理を実行できる。
setTimeout()関数は、JavaScriptで非同期処理を体験するための典型的な例だ。setTimeout()は、指定したミリ秒数が経過した後に、特定の関数を実行する機能を持つ。
1setTimeout(function() { 2 console.log("Hello JavaScript"); 3}, 2000);
このコードでは、setTimeout()の第一引数に、function() { console.log("Hello JavaScript"); }という匿名関数が渡されている。これがコールバック関数だ。第二引数の2000は、2000ミリ秒、つまり2秒を意味する。
このコードが実行されると、プログラムはすぐに次の処理へと進む。2秒間待機するわけではない。そして、およそ2秒が経過した後に、setTimeout()に渡された匿名関数が実行され、「Hello JavaScript」というメッセージがコンソールに出力される。
この例からわかるように、setTimeout()は、渡されたコールバック関数を「今すぐ実行する」のではなく、「指定された時間が経過した後に実行する」ようにスケジュールする役割を担っている。これは、非同期処理の基本的なパターンであり、ウェブアプリケーションでユーザーインターフェースを更新したり、サーバーからの応答を待ったりする際に、非常に頻繁に利用される技術だ。
コールバック関数は、関数を他の関数に引数として渡し、親となる関数がそれを後で実行するという、JavaScriptの強力な機能の一つだ。これにより、コードの再利用性が高まり、柔軟なプログラム設計が可能になる。また、非同期処理では、特定のイベントや時間の経過を待ってから処理を実行するために不可欠な要素となる。システムエンジニアを目指す上で、コールバック関数の概念と使い方をしっかりと理解することは、JavaScriptを用いた開発において非常に重要なステップとなるだろう。この知識を土台として、さらに複雑な非同期処理やイベント駆動型のプログラミングへと理解を深めていくことができる。