コールバック関数

JavaScriptでは、指定した関数を後で実行することができます。

本ページでは、コールバック関数について説明します。

コールバック関数とは

コールバック関数とは、関数の引数として渡す関数のことです。後で実行する関数を、引数として指定します。

コールバック関数の説明

func2がコールバック関数です。イメージは、電話のコールバックと同じです。後で連絡する連絡先を指定します。

電話でのコールバック

コールバック関数の使い方

以下は、コールバック関数の利用例です。

【コールバック関数の利用例】
function func1(callback) {
  alert("1番目");
  callback();
  alert("3番目");
}

function func2() {
  alert("2番目");
}

func1(func2);

func1(func2);で、func1の引数としてコールバック関数func2を渡しています。このため、func1実行時にコールバック関数としてfunc2が呼び出されます。func2が終わると、func1に戻ります。

つまり、「1番目」→「2番目」→「3番目」の順でアラートが表示されます。

コールバック関数のメリット

コールバック関数のメリットは、呼び出し元で分岐先を決めることができる点です。

コールバック関数のメリット

func1を実行する時に、func2を呼び出すのか、func3を呼び出すのか決めています。

以下は、例です。

【コールバック関数を利用して処理を分ける】
function func1(callback) {
  alert("計算終了です");
  callback();
}

function func2() {
  alert("スペードのAです");
}

function func3() {
  alert("クラブのAです");
}

{
  let x = Math.ceil( Math.random() * 2 );
  if ( x === 1 ) {
    func1(func2);
  } else {
    func1(func3);
  }
}

xが1であれば「計算終了です」が表示された後、func2が実行されて「スペードのAです」と表示されます。xが2であれば「計算終了です」が表示された後、func3が実行されて「クラブのAです」と表示されます。

このように、func1の中で分岐先を決めるのではなく、事前に次に呼び出す関数(この例では、func1かfunc2か)を決めておけます。

コールバック関数に引数を渡す

コールバック関数に引数を渡すために、func1(func2(2));などと記述できません。コールバック関数に引数を渡す例を以下に示します。

【コールバック関数に引数を渡す例】
function func1(callback,x) {
  alert("1番目");
  callback(x);
  alert("3番目");
}

function func2(x) {
  alert(x);
}

func1(func2,"2番目");

"2番目"は、func1の引数です。変数xで受け取っています。コールバックする時、xを引数としてfunc2に渡しています。つまり、一旦はfunc1に引数として渡し、func1の中で引数としてfunc2に渡します。

上記は、「1番目」→「2番目」→「3番目」の順でアラートが表示されます。

イベント処理でのコールバック関数

addEventListenerメソッドで呼び出す関数も、コールバック関数です。

【addEventListenerメソッドの利用例】
<input type="button" id="test1" value="ボタン">

<script>
function func1() {
  alert("テスト");
}
const x = document.querySelector("#test1");
x.addEventListener("click", func1);
</script>

addEventListenerは、ボタンをクリックするまで待機する非同期処理(順番にではなくイベントが発生すると処理)を行います。引数としてfunc1を渡していますが、これがコールバック関数です。addEventListenerは、関数です。この関数の中でfunc1がコールバックされます。

もし、x.addEventListener("mouseout", func2);を追加した場合、マウスがボタンから出るとfunc2にコールバックします。つまり、イベントの種類(クリックやマウス移動)によって、異なるコールバック関数を指定できます。