まとめ
コールバック関数は他の関数に引数として渡される関数で、外側の関数で何らかの処理やアクションを実行します。
※mdn web docsより
目次
JavaScriptでは関数も値
「関数を定数に代入できる=関数は値の一種として扱うことができる」
JavaScriptにおける関数は、文字列や数値、配列、オブジェクトと言った値と同じように値として扱える。
つまり、定数(文字列や数値、配列、オブジェクトと言った値)が引数として関数に渡されるように、関数もまた引数として渡される。
関数の渡し方と呼び出し方
下記の基本構文にて解説する。
index.js
//関数introduceを定義(渡す側)
const introduce = () => {
console.log('I am XX');
};
//関数sayHiを定義(呼び出す側)
const sayHi = (callback) => {
console.log('Hi!');
callback();
};
//introduceをコールバック関数としてsayHiに渡す
sayHi(introduce);
//以下、出力結果
//Hi!
//I am XX
解説
-
introduce
とsayHi
が関数として定義されている -
introduce
は引数としてsayHi
に渡されている - 関数を渡すときは、関数名の後ろに
()
は不要 -
()
がない場合は関数の定義そのものを指す。(関数名の後ろに()
があると関数が呼び出される。)
コールバック関数の流れ
- 引数として
introduce
が渡される -
sayHi
が呼び出される - 「引数である
introduce
はcallback
に代入される -
sayHi
内の処理に書かれてるcallback
に代入される(コールバック関数を呼び出す際には、()
をつける)
上記の基本構文からわかるように、JavaScriptでは関数を引数に渡すことができる。そして、この引数になっている関数のことをコールバック関数と呼ぶ。
引数で関数を定義する
前章では、既に定義してある関数をコールバック関数として渡しましたが、引数の中で関数を定義することもできます。
index.js
const sayHi = (callback) => {
console.log('Hi!');
callback();
};
//引数の中で関数を定義
sayHi(() => {
console.log('I am XX');
});
//以下、出力結果
//Hi!
//I am XX
解説
-
introduce
に代入していた関数をそのままsayHi
の引数として記述する。 - このように引数の中で関数を定義することもできる
関数の引数
コールバック関数には、普通の関数と同様に引数を渡すことができる。
index.js
//コールバック関数に引数を渡す
const sayHi = (callback) => {
console.log('Hi!');
callback('XX');
};
sayHi((name) => {
console.log(`I am ${name}`);
});
//以下、出力結果
//Hi!
//I am XX
解説
- 関数
sayHi
を定義してる(関数sayHi
は、コールバック関数callback
を引数に取る) - 関数
sayHi
を呼び出す際に、引数で直接(name) => {console.log(`I am ${name}`);}
と言う関数を定義しいる
この関数は、引数にname
を取る - この引数
name
は、関数sayHi
を呼び出した際に実行される -
(name) => {console.log(`I am ${name}`);}
はcallback('XX')
の引数('XX')
を受け取り、I am XX
が出力される
非同期処理(setTimeout関数)
setTimeout関数を用いて、非同期処理を行う。
index.js
console.log('1');
setTimeout(() => {
console.log('2')
}, 2000);
console.log('3');
//以下、出力結果
//1
//3
//2
解説
- 上記のコードでは、
console.log('1')
→setTimeout()
→console.log('3')
の順番に処理が登録される (同期処理と同じ順序) - setTime関数で登録したコールバック関数(
() => { console.log('2') }, 2000
)は、2000ミリ秒後に処理を実行させるように、非同期的なタイミングで呼び出される -
setTimeout()
よりも後に書かれているconsole.log('3')が先に実行される