質問: 様々な技術系の記事やドキュメントで「コンテキスト」という言葉がでてきますが、何を指しているのかよく分かりません。 「コンテキスト」という言葉自体は調べたのですが、利用されている状況によって意味が異なるため、結局何を指しているのか理解ができないです。 例えば、以下の記事やドキュメントの「コンテキスト」が何を指しているのかが分からないです。 * 「Global context」 「Function context」 * 「this コンテキストを持ちます。」 上記の「コンテキスト」が何を指しているか教えていただけますか。 また、「コンテキスト」を別の言葉で言い換えることはできますか? そもそも「コンテキスト」という言葉自体が曖昧(だと思ってる)なため、 回答しづらい質問で申し訳ありませんが、よろしくお願いいたします。 **2016.11.04追記:おわび** ご指摘を受けましたが、マルチポストのことを知らずにマルチポストをしてしまいました。 私が質問をする前の確認不足であり、想像力不足でした。申し訳ありませんでした。 ただ、貴重な回答をいただいたので今回の質問は残しておきます。今後マルチポストは慎みます。 **2016.11.04追記2:マルチポストをした理由・解決にいたるまで** ご指摘を受けた通り、ヘルプに > > やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には、必ずteratail及びすべての投稿に解決した旨とどのように解決したかを記載してください。 > > > と記載されていますので、以下にマルチポストをした理由を記載します。 **マルチポストしたURL** **マルチポストした理由** 今回の質問は **「コンテキスト」という言葉が何を指しているのかよく分からない** というものですが、 「コンテキスト」という言葉自体が非常に曖昧なものであり、 完全な正解はなく、人によって回答が異なるものだと想定していました。 そのため、できる限り多くの方々の意見・回答を見たかったことがマルチポストをした理由になります。 **解決した旨とどのように解決したか** 結果として4人の方から回答をいただくことができました。 どの回答も非常にためになり、イメージを掴むことができたため解決にしました。 回答をくださった皆様、誠にありがとうございました。
回答: ### コンテキスト (Context) 「文脈」「状況」「背景」のように様々な訳がありますが、一般的には**文脈**と訳されることが多いようです。 「プログラミングで『文脈』とは何ぞ?」となりますが、私自身も曖昧模糊とした印象ではっきりと定義できていません。 とはいえ、定型文ともいえる表現方法がいくつかある為、ES3, ES5.1 を元に整理してみます。 (最新の ES7 準拠で説明しないのは単純に私の勉強不足によるものです。きっと誰かが ES7 流の解説をしてくれます...。) * コンテクスト - Wikipedia ### 実行コンテキストに入る (entering an execution context) 「ソーステキスト内に書かれたコードを実行可能な状態にする事」を**実行コンテキストに入る(entering an execution context)**といいます。 ES3 では次の3つのタイプのコードがあり、それぞれ実行コンテキストに入るタイミングが異なります。 * グローバルコード (Global code) グローバル変数、グローバル関数などが書かれる最上位スコープにあるコードをグローバルコードと呼びます。グローバルコードはscriptコードが解析(パース)された時点で即座に実行コンテキストに入ります。 * evalコード (Eval code) `eval()` で引数に指定された文字列コードを eval コードと呼びます。eval コードは `eval()` が呼び出されるタイミングで実行コンテキストに入ります。 * 関数コード (Function code) 関数内のコードを関数コードと呼びます。関数コードは関数呼び出しされたタイミングで実行コンテキストに入ります。 「実行コンテキストに入る」は例えるなら、「敵襲~!敵襲~!**戦闘態勢をとれ!!**」のようなものだと勝手に思っています。 ちなみに、ES5.1 になると、表現方法が多彩になります。 * 新たな実行コンテキストを**設置(establishes)**し、入る(establishes and enters a new execution context) * 実行コンテキストを**初期化**する (Initialise the execution context) ES6 になると実行コンテキストの分類が変わります(ここから先は不勉強)。 * code evaluation state (evalコード?) * Function (関数コード?) * Realm (グローバルコード+α?) ES7 になると実行コンテキストの種類が増えます(もうわけわからない状態)。 * code evaluation state (evalコード?) * Function (関数コード?) * Realm (グローバルコード+α?) * ScriptOrModule (スクリプトとモジュール?) ### コンテキストオブジェクト (Context Object) ごくたまに「コンテキストオブジェクト」という名前を目にすることがあります。 ES7 のドキュメント上で "contexts object", "context object" でページ検索してもHITしない事からJavaScript(ECMAScript)の用語ではなく、他言語から来た派生用語だと思われますが、コンテキストオブジェクトの意味は私も今一つ分かっていません。 文脈的には「実行コンテキストに関連付けられたオブジェクト」になるので **this 値** を表しているようにも読めますが、文脈によっては **Activation オブジェクト (Activation Object)** を表しているようにも読めます。 Java のような実際にコンテキストオブジェクトがある言語に詳しい方が解説してくれる事を願います。 * 10 実行コンテキスト (Execution Contexts) - ES3(日本語訳) ### 参考リンク * 10 実行コンテキスト (Execution Contexts) - ES3(日本語訳) * 10.4 Establishing an Execution Context - ECMA-262 Edition 5.1 (ES5.1) * 8.3 Execution Contexts - ECMAScript 2015 Language Specification (ES6) * 8.3Execution Contexts - ECMAScript® 2016 Language Specification (ES7) Re: liberta777 さん