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開発」を使って学習を進めていただきます。

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

誰向けのプラン?

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

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

プラン内容は?

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

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

1日1回カフェでコーヒー1杯頼むくらいの金額で参加できます

1日1回、カフェでコーヒー1杯分くらいの値段(約330円)」で以下の環境が手に入るとイメージして頂けたらと思います。

  1. コードを添削してもらえる
  2. 学習したことのアウトプットに対してフィードバックしてもらえる
  3. いつでも質問出来る
  4. 週1のオンライン講義に参加できる
  5. 過去のオンライン講義動画を好きな時間に復習できる(いつでも閲覧可能)
  6. 不定期で行うオフラインでの勉強会に参加できる(僕自身が東京住みのため、東京・もしくは東京近郊で開催します)
  7. 自分の住まいの近場のメンティーさん同士で集まって、オフラインで勉強会を開くのも可能(初めて開催する場合は事前に僕に連絡をいただけたらと思います)

学習教材には、このサイトで用意している「【学習コンテンツ】Web開発」を使います。

【学習コンテンツ】Web開発」を使って学習を進めることで、Webのフロントエンドとバックエンドのスキルを身につけていくことができます。

プログラミングスクールとの比較

プログラミングスクールに通う場合は1ヶ月で10万円以上するところも多いですし、3ヶ月で50万円、更には100万円するところもあります。

プログラミングスクールの値段が高い理由は、「プログラミングスクールで働いている人の人件費」「就職のサポート」なども含まれているからです。

10万円50万円100万円」のいずれの場合も、自己投資とはいえ、支払うのにはだいぶ勇気がいる金額かと思います。

オススメの学習方法

個人的にオススメするのは、プログラミングのできるメンター(師匠)を見つけて、まずは1ヶ月プログラミング学習をしてみて、自分にプログラミングが向いているかどうか確かめてみることです。

10万円50万円100万円」を払って、学習していく中で「やっぱり自分にはプログラミングは向いてない」と判断した場合、その金額はかなりの痛手となります。

そのため、まずは「これくらいの金額なら最悪失っても痛くないな」の値段で教えてくれるメンターを見つけて、そのメンターに色々と質問をしてみましょう。

それで、「良さそうだな」と思ったら教えてもらうといった流れで学習を始めると、金額もだいぶ節約できます。

注意点

ただし、参加者が増えてきたら、1人1人へのサポートの質を維持するのが難しくなるので、値上げする可能性もあります。

値上げする理由は次の以下の理由となります。

  • 値段を上げて参加ハードルをあげることで、自己解決スキルも身につけたいと考えている学習意欲の高い人だけが参加するようになる
    • 調べたらすぐにわかることを、自分で調べずに何でもかんでも質問すると、自己解決スキルも身につかない
    • 更に、他のメンティーさんの対応する時間が取れなくなりサポートの質の低下にも繋がる

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

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

 

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

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

COMMENT

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