自分の疑問
実行コンテキスト
コードを実行しようととしたときに作られる、そのコードがもつ情報という認識でいいですか?
例えば変数名が何か?とかが入ってくるのか?
グローバルコンテキストと関数コンテキストという2種類がありますが
要は
JavaScriptのコードを実行したとき
関数が実行されるのでその前に生成される実行コンテキストが関数コンテキスト
関数以外の実行されるコードの情報が入っている実行コンテキストがグローバルコンテキスト
ということなのか?
結論
実行コンテキストは、コードを実行する際に生成されるもので、そのコードが持つ情報を含みます。これには変数、関数、スコープチェーン、this の値などが含まれる。
グローバルコンテキストは、スクリプトの実行開始時に生成されるコンテキストであり、スクリプト全体の情報を保持する。
関数コンテキストは、関数が呼び出されるたびに生成されるコンテキストであり、その関数の実行に必要な情報を保持します。関数コンテキストは関数内の変数やパラメータ、その関数が定義された場所のスコープなどを含む。
さらに疑問
①実行コンテキストは、コードを実行する際に生成されるもので、そのコードが持つ情報を含む
このコードってJavaScripのコードか?HTMLのコードは関係ないか?
②グローバルコンテキストは、スクリプトの実行開始時に生成されるコンテキストであり、スクリプト全体の情報を保持する。
スクリプトとはscriptタグのことですか?またこのスクリプトとは例えばmain.jsというファイルがあるときこれに書いてあるコードが実行される直前も含まれるか?
結論
①実行コンテキストは通常、JavaScriptコードの実行時に生成されるのでHTMLコードは直接関係ない。
②グローバルコンテキストは、スクリプトの実行開始時に生成され、そのスクリプト全体の情報を保持する。
スクリプトとは、通常は <script> タグ内に埋め込まれたJavaScriptコードのこと。
そして、そのスクリプトが実行される直前の状態も、グローバルコンテキストに含まれる。
つまり、スクリプト内の全体のコードが実行される前に、グローバルコンテキストが生成される。
また
<script src=”index.js”></script>
このようなjavascriptファイルを読み込むscriptタグも含まれる。
<script> タグは、直接JavaScriptコードを埋め込むだけでなく、外部のJavaScriptファイルを読み込むためにも使用される。
src 属性を使用して、外部ファイルのパスを指定します。例えば、<script src=”index.js”></script> のようにすると、ブラウザは index.js ファイルを読み込んで実行しする。その際にもグローバルコンテキストが生成され、そのファイルのコードが実行される直前の状態が含まれる。
最終疑問
コールスタックを検証ツールで調べたが
コールスタックって必ず最初がグローバルコンテキストでその上に関数コンテキストが積み上がっていくっていうパターンしかないか?
結論
一般的には、最初にグローバルコンテキストが作成され、その上に関数の呼び出しに応じて関数コンテキストがスタックされる。
関数の実行が終了すると、その関数コンテキストはスタックから取り除かれ、以前の状態に戻る。
ただし、HTML内に直接スクリプトを記述する場合、HTMLパーサは <script> タグを見つけると即座に実行します。そのため、<script> タグ内に別の <script> タグを記述すると、HTMLの構文解析によってエラーが発生します。これはHTMLの仕様に基づくものであり、JavaScriptの実行順序には直接関係ない。
JavaScriptでは、グローバルコンテキストが最初に作成され、その後に関数コンテキストがスタックされるという一般的なパターンがある。しかしこのHTMLパーサによる制約があるため、すべてのシナリオでこのパターンが適用されるわけではありません
外部ファイルをよ見込んでいないscriptタグでないといけません。
実行コンテキストというくらいだからJavaScriptコードが実行される前の段階で、グローバルコンテキストが準備される。