JavaScript

JavaScriptでコールスタックを理解する【関数実行の順番】

どうも、つよぽんです!

今回は、「コールスタック」について解説していきます。

コールスタックを理解することで、関数がどのような順番で実行されていくのか理屈で理解できるようになります。

今回の記事は次のような方に向けて書きました。

想定読者
  • 関数が実行される順番を何となくではなく、理屈で理解したい
  • 「スタック」というデータ構造を理解したい

この記事を読み終えた後のあなたは次のことがわかるようになっています。

この記事を読み終えた後のあなた
  • コールスタックの仕組みを理解して、関数がどのように実行されていくのか理屈で理解できるようになる
  • スタック(LIFO)なデータ構造がわかるようになる

今回の記事は以下のスライドを使いながら解説していきます。

それでは次の内容で話を進めていきます。

今回の内容
  1. スタックとは
  2. コールスタックとは

スタックとは

コールスタックの話に入る前にまず「スタック」が何か解説していきます。

既に「スタック」を知っている方は次の章「コールスタックとは」まで読み飛ばしていただいても問題ありません。

スタックとは下から本を積み上げるようなイメージ

スタック」というのはデータ構造の1つです。

冒頭の方でも貼ったスライドの内「図で見るスタックの構造(7~15ページ)」を見ていただくとどんなデータ構造かイメージが付きやすいので、スライドの7~15ページを見ることをオススメします。

「スタック」を現実にあるもので例えると、高く積まれた本を想像するとわかりやすいです。

本が高く積まれていく流れを見ていくと次のようになります。

本が高く積み上がるまでの流れ
  1. 1冊目の本を一番下に置く
  2. 2冊目の本を1冊目の本の上に置く
  3. ①と②のプロセスがずっと繰り返されていく

仮に、50冊の本が積み上げられている場合は、50冊目の本は49冊目の本の上に置かれることになります。

ここで、50冊積み上げられた本から、1冊目の本を読みたくなった時どうすれば良いでしょう?

答えから言うと、積み上げられた本を上から順番に取り除いていけば良いです。つまり後から積まれた本が先に取り除かれていくということになります。

このように、後から追加されたモノを、先に取り除いていくデータ構造を「LIFO(Last In First Out)」と呼んだりします。(日本語で言うと「後入れ先出し」)

この「LIFO」なデータ構造をもつものを「スタック」といいます。

配列のpush/popメソッドからスタックの動きを理解する

JavaScriptの配列の組み込みメソッドである「push」「pop」メソッドを覚えてるでしょうか?

「push」「pop」メソッドの動きは次のようになります。

push/popメソッドの動き
  • pushメソッド : 配列の末尾に値を追加する
  • popメソッド : 配列の末尾から値を取り除く

この動きもまさに「スタック」のデータ構造と同じです。

コールスタックとは

コールスタックでは関数がスタックに積まれる

スタックを理解したら、コールスタックも簡単に理解できます。

先程の例では積み上がる本を例にスタックの説明をしましたが、コールスタックでは積み上げられるものは「関数(メソッド)」となります。

冒頭の方でも貼ったスライドの内「サンプルコードと図で見るコールスタックの流れ(18~33ページ)」を見ていただくと関数がどんな流れでスタックに積まれて、どのタイミングでスタックから取り除かれるかイメージを掴めるかと思います。

スライドの内容を元に話をまとめると、関数がスタックに積まれるタイミングと、スタックからとりのぞかれるタイミングは次のようになります。

コールスタックの流れ
  • 関数がスタックに積まれる時 : 関数が実行されるタイミング
  • 関数がスタックから取り除かれる時 : 関数が終了するタイミング

そして、関数が実行される順番はコールスタックで一番上に積まれている関数から優先的に実行されます。

2つの関数を例にコールスタックの流れを見る

関数の中で別の関数を実行する時を思い浮かべてください。ここではわかりやすくするために、最初に呼び出す関数を「関数A」として、その「関数A」の中で実行する関数を「関数B」とします。

まず最初に「関数A」が実行されるので、コールスタック内では「関数A」が置かれます。

そして、「関数A」の中で「関数B」を実行するので、コールスタック内では「関数A」の上に「関数B」が積まれることになります。

このとき、「関数A」の処理はまだ終了していないことに注意してください。

関数A」の処理の途中で「関数B」が実行されたことにより、「関数B」の処理が終了するまで「関数A」の処理は中断されることになります。

関数B」の処理が終了するまで「関数A」の処理が実行されない理由は、前の項目の最後でも説明したように、「コールスタック内では一番上に積まれている関数から優先的に実行される」からです。

そして、「関数B」の処理が終了するとコールスタック内から「関数B」が取り除かれて、コールスタック内の一番上の関数が「関数A」になります。

つまり、「関数A」が優先的に実行される関数となるので、「関数A」の処理が再開します。

まとめ

今回の話をまとめると次のとおりです。

今回のまとめ
  • コールスタックを理解するにはまず「スタック」のデータ構造を理解する必要がある
  • スタックとはLIFO(Last In First Out)なデータ構造である
  • コールスタックでは関数がスタックに積まれる
  • 関数の実行時にコールスタックにその関数が追加される
  • 関数の終了時にコールスタックからその関数が取り除かれる
  • コールスタック内では一番上に置かれた関数が優先的に実行される

今回の内容は以下の記事内のスライドの補足資料として作成しました。スライドの全部を確認したい方は以下の記事も参照して頂けたらと思います。

あわせて読みたい
【JavaScript】コールスタックとは【関数実行の順番を理解する】JavaScriptの非同期処理を理解する前に、まず同期関数がどのように実行されるか理解する必要があります。今回はJavaScriptの関数実行の順番を理解するのに役立つ「コールスタック」の概念について学習します。非同期処理に入る前にコールスタックの理解から始めましょう。...
【やる気満々な方向け】学習サポートとオンライン講義やってます!

Webエンジニアになりたい人向けに、MENTAにて『【やる気満々な方向け】未経験からのWebエンジニア育成コース』というプランを用意しております。

このプランでは、「【学習コンテンツ】Web開発」と「【初心者向け】The Web Developer Bootcamp」で紹介している教材を使って学習を進めていただきます。

【学習コンテンツ】Web開発」に用意している学習コンテンツのスライドも「【初心者向け】The Web Developer Bootcamp」で紹介している教材をベースに作っています。

あわせて読みたい
【初心者向け】The Web Developer Bootcampはじめに 「The Web Developer Bootcamp」はWeb白熱教室の「学習コンテンツ」のベースとなっている教材です。 ...
あわせて読みたい
Web開発Webエンジニアになるために必要な知識・スキルを学習できるコンテンツを用意しました。未経験者でも、①開発環境の準備、②Webの基本的な仕組み、③HTML、④CSS、⑤JavaScriptと順を追って学習することでスキルが身につくことを目的に教材を作成しています。...

誰向けのプラン?

こちらのプランは次のような方に向けて作られています。

プラン対象者
  1. Progateやドットインストールで一通り学習したけど、次に何をすればよいかわからない
  2. Webエンジニアになるまでの学習プランがあると助かる
  3. 学習していてわからないところが出てきたときに質問したい
  4. コードレビューして欲しい
  5. オンライン講義に参加したい
  6. 学習した内容をアウトプットした際に、フィードバックがもらえたら嬉しい
  7. おすすめの学習教材を知りたい
  8. Webフロントエンド・バックエンドを学習したい
  9. フルスタックエンジニアになりたい
  10. 文系出身で今までプログラミングをしてこなかったけど、将来Webエンジニアになりたい
  11. 将来フリーランスになることを目指している

プラン内容は?

【やる気満々な方向け】未経験からのWebエンジニア育成コース』では次のことを行っております。

プラン内容
  1. Udemyの教材や、Web白熱教室の学習コンテンツを使った学習プランの提示 (学習プランに沿って学習を進めていただきます。)
  2. 教材・学習コンテンツの課題をこなしたあとは、僕にコードレビュー依頼を投げていただくことで、コードを添削する(課題クリア後は、引き続き学習プランの内容を続けていただきます。)
  3. プラン契約者が参加するSlackグループにて質問し放題
  4. Slack内にある「アウトプットの場」チャンネルにて、学習したことをアウトプットをしていただくことで、それに対しフィードバックをする (学習内容のアウトプットは復習にもなるため、アウトプットすることを強く推奨します。)
  5. 画面共有を使ったオンライン講義 (オンライン講義は録画して、いつでもふり返れるようにしています。(オンライン講義動画(ウェビナー動画)))
  6. 学習プラン以外の内容に対しての質疑応答 (内容によっては回答できないものもありますが、まずは気軽に質問していただけたらと思います。)

その他注意点

1人で対応していることもあるため、対応が難しくなった場合は急遽募集を終了する可能性もあることをご了承ください。

もしくは、僕以外にメンターを増やすことで募集を継続するということも考えているため、その場合は現在のプラン料金の値段を上げることなると思います。

仮にプラン料金を上げる場合は、『現在のプラン料金 × メンター人数』の料金になるかと思います。

現在の値段が5000円なので、1日1本ペットボトルジュースを買うのを我慢することで(約160円)、効率よく学習できるので費用対効果はかなり高いかなと自負しています。

また、今後メンターが増えて、プラン料金が10000円15000円と上がったとしても、月々の料金は申し込んだときの料金となるので、5000円のときに契約した場合はずっと5000円で受講することができます。

詳しく話を聞いてみたい方は

以下のいずれかでメッセージをいただけたらと思います^^

 

プラン内容については以下のリンク先からも確認することが出来ます^^

【やる気満々な方向け】未経験からのWebエンジニア育成コース

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です