自分で直接実行するのではなく、相手に実行してもらうのがコールバック関数です。setTimeoutで考えてみましょう。setTimeoutは、受け取ったコールバック関数を指定ミリ秒後に実行します。2000);これで「2000ミリ秒後にこのfunctionを実行して!」ということになります。関数が値であることと高階関数のことを知った後だと簡単に理解できますね。ms)という高階関数を使っているだけです。それだけ!おわり!......と行きたいところですがJavaScriptではちょっとややこしい事情があり......。非同期処理とイベントとコールバック関数JavaScriptでコールバック関数が使われるのって大抵は非同期処理なんですよね。さっきのsetTimeoutも非同期処理ですし。非同期処理というのは我々が信じる「プログラムは書いた順に動く」という基本を無視した、「今書かれたけど後で実行するから先に進んで」ってやつです。詳しくは「Promiseとasync/awaitでJavaScriptの非同期処理をシンプルに記述する」で書いているので、そちらもあわせて読んでみてください。非同期処理は「後で」行われるので、順番を記述することが難しくなります。Hello!」と表示されます。Bye!!!!」と表示したいんですが......。そんなこんなで、「非同期処理の後に何か実行したい」ってことがよくあります。「ボタンがクリックされた」とか「読み込みが完了した」とかのときに何かやりたいことは多いはずです。そこで悪魔の発想です。「自分で非同期処理の終わりを待つなんて難しいことせずに、非同期処理自身に後処理実行させればいいんじゃね?」と思いついた奴がいます。ここで、「処理」は「関数」という単位でまとめることができます。非同期処理に関数を値として渡して、後で実行してもらうようにすれば、みんなハッピーになれるわけです。JavaScriptの多くの非同期処理は、これを以下のような方法で実現しています:非同期処理関数はコールバック関数を受け取る高階関数にする利用者は「終わったら実行したい処理」をコールバック関数として渡す非同期処理関数は処理が終わったらコールバック関数を呼び出すsetTimeoutなんかがまさにこれですね。関数を渡しておいて、あとで実行してもらう、俺はもう知らん。JavaScriptでコールバック関数というと、だいたいこの非同期処理のコールバック関数のことを意味します。非同期処理だけでもややこしいのにそこにコールバック関数も絡んできたら、そりゃややこしくなって混乱しますよね。この手法はDOMのイベントなんかでも使われます。func)という単純な高階関数で、eventNameに対してfuncを登録するというだけのシンプルな作りです。前に言った通り関数はそのまま値として渡せるので、直接function(event)ほにゃららと書いてるだけです。コールバック関数は関数名で渡すこともできます。callback);どちらもほぼ同じなんで好きな方でやってください。注意点は、ここでは関数を登録するだけで、実行してないところです。addEventListenerをした時点ではfunc()をしていないということです。内部ではclickListener.push(func)みたいなことをして配列にfuncを追加してるだけのイメージです。それでクリックされたときにはじめてfunc(event)を実行しています。配列にcallback登録。}}doTwiceの例では関数を渡した瞬間に実行していましたが、JavaScriptの一般的な非同期処理は「とりあえず渡されたら自分の持ってる変数に登録だけして実行は後でやる」というのが多いです。実行タイミングが後にずれるだけでかなりわかりにくくなりますが、やってること自体は上の方のdoTwiceやdoTwiceWithValueとそう変わらないです。Node.jsと非同期処理とコールバック関数Promiseの普及もあってコールバック関数を見る機会も割と減ったと思いますが、Node.jsの世界ではまだまだ非同期コールバックが残っています。簡単にライブラリの作りを変えられないからです。「コールバック関数を渡さなければPromiseを返す」みたいな作りもよくありますね。メジャーどころのライブラリならPromise対応してたりしますが、ちょっとマイナーめなのになるといまだにコールバック前提の作りしてたりするので、もうちょっとだけコールバックと付き合うことになりそうです。body)を実行しているだけですね。高階関数という概念を知っていると一気に簡単になります。余談ですが、コールバック関数の引数名は固定だと思ってる人がそこそこいます。数と順番さえあってれば名前はなんでもいいです。b)とかでも大丈夫です。いうと引数の数があってなくても動きます。JavaScriptさんそのあたりあんまり気にしない性格なので......。d)とか渡すとerrorとresponseとbodyだけ入ってあとのaとかbとかはundefinedになります。このあたり気楽でもありバグの原因でもあるので、気をつけましょう。APIでJavaScriptからCSS用のグラフィックを動的に生成する音屋の動画によくある音に合わせて動くかっこいいバーをJavaScriptで作るRSSプロフィール古都ことふるみやことです。フロントエンドとかいろいろやるよ。