JavaScript Runtime

  • 2021年3月5日
  • 2021年3月5日
  • Kwon

私の場合、最近の開発でJavascriptを使う比率が半分以上です。
ほとんどが関数の使い方などを調べて、採用するケースが多いです。
基本的なものですが、個人的にも復習の意味合いで、今日はJavascript runtimeに対してお話します。

JavaScript : シングルスレッド ・ ノンブロッキング言語

シングルスレッドとは
シングルスレッドとは、プログラムの処理が単一に行われることです
その理由は一個のHeapエリアと一個のCall Stackしか持ってないからです。
コールスタック (Call Stack)は、プログラムで実行中のサブルーチンに関する情報を格納するスタックである

Call Stackのサンプル

処理順番
1.①メイン関数が呼出
  Call Stackへメイン関数が格納される

2.①printSquare(4)関数が呼出
  Call StackへprintSquare(4)関数が格納される

3.②square(n)関数が呼出
  Call Stackへsquare(n)関数が格納される

4.③multiply(n, n)関数が呼出
  Call Stackへmultiply(n, n)関数が格納される

5.③multiply(n, n)関数の結果を返す
  Call Stackから③multiply(n, n)関数を取り消す

画像に alt 属性が指定されていません。ファイル名: image-9.png

6.②square(n)関数の結果を返す
  Call Stackから②square(n)関数を取り消す

画像に alt 属性が指定されていません。ファイル名: image-8.png

7.③のconsole.log(sqare)が呼出
  Call Stackへconsole.log(sqare)が格納される

8.③のconsole.log(sqare)の結果を返す
  Call Stackから②square(n)関数を取り消す

画像に alt 属性が指定されていません。ファイル名: image-8.png

9.①printSquare(4)関数の結果を返す
  Call Stackから①printSquare(4)関数を取り消す

画像に alt 属性が指定されていません。ファイル名: image-6.png

9.メイン関数の結果を返す
  Call Stackからmain()関数を取り消す

Call Stackのエラーメッセージ
下記のようにエラーが発生した場合、ログからエラーの発生の箇所が見えますが、エラーログに出力されるのがコールスタックの値です。

Stack Overflow
下記のような「Uncaught RangeError: Maximum call stack size exceeded」のエラーはコールスタック領域の限界を超えたデータプッシュにより発生します。

ノンブロッキング
シングルスレッドはスタックを1個じか持ってないので、単一にしか処理できません。
なので、例えばネットワークへ何かのrequestするとそのresponseが来るまで待ちます。

問題点

・ブロッキングサンプル

①の関数呼出して、console.log出力
②の関数呼出
②の結果が返されるまで③の処理は待つ。

上記の問題を解決するため、ノンブロッキング・非同期コールバックを使います。
・ノンブロッキングサンプル

①の関数を呼び出して、console.logを出力
②の関数を呼び出して、setTimeout(2000)開始
③の関数を呼び出して、console.logを出力

処理の詳細


setTimeout関数はJavascriptエンジンでは入ってない関数です。ウェブブラウザーで提供するWeb Apiで存在します。
上位の絵のようにsetTimeout呼出すとウェブブラウザーがWeb Apiを通じてcallback Queueへ格納します。
その際、JavaScriptは次の処理をします。
すべての処理が終わるとスタックにはmain()以外は何もない状態になります。
「event loop」はスタック・callback queueを監視しながら、スタックにはmain()しかない状態で、callback queueに関数が格納されていたらその関数をスタックに格納します。
なので、結果をみると①>③>②の順番で出力されることが分かります。

最新情報をチェックしよう!

Kwonの最新記事8件