KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

コールバック関数がわからないので動かしてみた

why

remark.js を使って json 形式からの html への変換をやっていたところ

remark()
  .use(recommended)
  .use(html)
  .process('## Hello world!', function (err, file) {
    console.log(String(file))
  })

というコードが出てきたが、

なぜ実行する関数の第二引数にきた関数が動いているのか意味がわからなかった

これはコールバック関数だと教えてもらい、調べてみる

MDN doc HTML window

developer.mozilla.org

ここで使っている alert も prompt も Terminal では使えないので html を使う

久しぶりに jsx ではなくて html を書いた

なお npm の prompt はめんどくさそうだった

www.npmjs.com

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
 <script src='callback.js'></script>
</body>
</html>

callback.js

function greeting(name) {
  alert(` Hello: ${name}`)
}
greeting('kaede')

これで

f:id:kei_s_lifehack:20210210001111p:plain

引数に応じた Alert のポップアップが出た

引数に関数、コールバック

function processUserInput(callback) {
  const name = prompt('Enter your name')
  callback(name)
}

f:id:kei_s_lifehack:20210210001623p:plain

次にこれで、プロンプトとしてウインドウがポップアップするようになる

そしてここの input に入れた値が name に入るようになった

その値を引数として、callback を発動するが、 callback という関数が js に組み込まれているわけではなく、この callback は processUserInput が引数として受け取っている関数である。

この MDN のサンプルでは次に

processUserInput(greeting);

greeting を引数として使用して processUserInput を使用しているので、

callback は greeting を使用することになる。

よって greeting によって prompt に入力された 'kaede' が alert で返される。

f:id:kei_s_lifehack:20210210002011p:plain

まとめ

よって callback とは、関数 A の引数に関数 B を指定して、その関数 B を 関数 A の内部で使用することになる。実際に一つ一つ動きを追ったらわかった。

しかし remark はメソッドチェーンだし、即時関数っぽいし、 file どこからきてるのかわからないから callback がわかったところで remark のコードの詳細はわからない。ありゃりゃ

次は メソッドチェーンを見てみる