JavaScriptコールスタック:コールスタック

ここでは、関数呼び出しを追跡するためのメカニズムであるコールスタックについて学習します。

英語版:https://www.javascripttutorial.net/javascript-call-stack/

JavaScriptコールスタックの概要

JavaScriptエンジンは、コールスタック(英語のコールスタック)を使用して、グローバル実行コンテキストおよび関数実行コンテキストである実行コンテキストを管理します。

実行のコンテキストを理解するには、次のチュートリアルを参照してください。

JavaScript実行コンテキスト

コールスタックは、LIFO(last-in-first-out)の原則に基づいて機能します。つまり、「最後に入るのが最初に出る」ということです。

スクリプトを実行すると、JavaScriptエンジンはグローバル実行コンテキストを作成し、それを呼び出しスタックの最上位に配置します。

関数が呼び出されるたびに、JavaScriptエンジンはその関数の関数実行コンテキストを作成し、それを呼び出しスタックの最上位に配置して、関数の実行を開始します。

関数が別の関数を呼び出すと、JavaScriptエンジンはその新しい関数の新しい関数実行コンテキストを作成し、それを呼び出しスタックの一番上に配置します。

現在の関数が完了すると、JavaScriptエンジンはそれを呼び出しスタックから削除し、最後のコードリストで中断したところから実行を返します。

コールスタックが空になると、スクリプトは停止します。

JavaScript呼び出しスタックの例

次のスクリプトを参照してください。

スクリプトが実行されると、JavaScriptエンジンはグローバル実行コンテキスト(main()またはと呼ばれるglobal())を呼び出しスタックに配置します。

グローバル実行コンテキストは作成フェーズに入り、実行フェーズに移動します。

JavaScriptエンジンは関数呼び出しを実行し、関数average(10, 20)の関数実行コンテキストを作成してaverage()、呼び出しスタックの一番上に配置します。

JavaScriptエンジンaverage()は、呼び出しスタックの最上位にあるため、実行を開始します。

関数average()は関数を呼び出しますadd(a, b)。その時点で、JavaScriptエンジンは、関数の別の関数実行コンテキストを作成add()し、それを呼び出しスタックの最上位に配置します。

JavaScriptエンジンは、次の機能add()とコールスタックストリップを実行します。

その時点で、関数average()は呼び出しスタックの最上位にあり、JavaScriptエンジンがそれを実行し、呼び出しスタックのストリップを実行します。

コールスタックが空になったため、スクリプトの実行が停止します。

次の画像は、すべての段階でのコールスタックの全体的なステータスを示しています。

スタックオーバーフロー:スタックオーバーフロー

コールスタックのサイズは、ブラウザまたはNode.jsのいずれかでのホスト環境の実装に応じて、固定されています。

実行コンテキストの数がスタックサイズを超えると、スタックオーバーフローが発生します。

たとえば、終了条件のない再帰関数を実行すると、スタックオーバーフローエラーが発生します。

非同期JavaScript

JavaScriptはシングルスレッドのプログラミング言語です。JavaScriptエンジンには呼び出しスタックが1つしかないため、一度に実行できるのは1つだけです。

スクリプトを実行すると、JavaScriptエンジンはコードを上から下に1行ずつ実行します。言い換えれば、JavaScriptは同期的です。

非同期は同期の反対です。つまり、物事は同時に起こります。では、JavaScriptは、コールバック、プロミス、非同期/待機などの非同期タスクをどのようにロードするのでしょうか。ここでイベントループが機能します。これについては、次のチュートリアルで説明します。

JavaScriptイベントループ

このチュートリアルでは、実行コンテキストまたは関数呼び出しを制御するのに役立つJavaScript呼び出しスタックについて学習しました。

すべてのJavaScriptチュートリアルのインデックスを参照してください

以下のリンクをクリックして、私が書いた他の一連のJavaScriptチュートリアルを確認してください。

JavaScriptチュートリアル

提案された投稿

私が最もよく使用するコーディング リソース

私が最もよく使用するコーディング リソース

今週、毎日のメールリストのメンバーからメールを受け取りました。彼らは次のことを知りたかったのです。毎日、毎週、毎月どのリソースにアクセスしていますか? 素晴らしい質問です!私のワークフローと使用している主なリソースについての洞察を共有したいと思います。

Lit ライブラリ シリーズ — 1: lit-html ライブラリの詳細

Lit ライブラリ シリーズ — 1: lit-html ライブラリの詳細

このブログ シリーズの目的は、Lit ライブラリを深く掘り下げ、その独自の機能と市場の他のライブラリやフレームワークとの違いを包括的に理解することです。シリーズは 3 部に分かれており、1 などのトピックを取り上げます。

関連記事

一部のフリーランサーが自分の人生を偽っている理由

一部のフリーランサーが自分の人生を偽っている理由

私は最近、世界最大のプロフェッショナルなソーシャル ネットワークである Linkedin を利用していて、フォローしているフリーランス デザイナーの注目を集めた投稿を見つけました。彼らはすべて、飛行機からの写真、ラップトップを持ってビーチで撮影した写真、スイミング プールやオフィスから素晴らしい景色を眺めた写真を投稿していました。

代名詞は超怖い

頻繁に起こることだが、突然、私は衝撃を受ける 再びミッドウェイだ <いいえ、太平洋にあるものではなく、カーニバルにあるものです> どの見出しも大音量で…..

Goodreads の読書チャレンジは有毒です

Goodreads の読書チャレンジは有毒です

地元の書店ともう一冊の本を求めて交渉していると、手のかゆみが広がった。この本は、最近購入した残りの本と同様に、私の「読みたい本」(TBR)の山の中でその王座を見つけることになります。それでも、買ってしまいました。

ポッドキャストが影響力を持つ理由は何ですか?

ポッドキャストが影響力を持つ理由は何ですか?

先週、私はPressGazette(英国のメディアニュースウェブサイト)経由で送信されたプレスリリースに気づきました。この記事は、スカンジナビアのポッドキャスト ホスティングおよび広告会社である Acast が、ポッドキャスティングにおいて「おそらく最も影響力のある」パブリッシャーのコンソーシアムを率いることになると発表しました。