コールバック関数
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メソッドで呼び出す関数も、コールバック関数です。
<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にコールバックします。つまり、イベントの種類(クリックやマウス移動)によって、異なるコールバック関数を指定できます。