はじめに
この章から、ECMAScript 標準の理解に関する http://dmitrysoshnikov.com/ ウェブサイトの優れた記事を継続 (翻訳、転載、整理) していきます。
この章で説明するのは、ECMAScript 標準における実行コンテキストと関連するさまざまな種類の実行可能コードです。
原著者: Dmitry A. Soshnikov
初版リリース: 2009-06-26
ロシア語原文: http://dmitrysoshnikov.com/ecmascript/ru-chapter-1-execution-contexts /
英語翻訳: Dmitry A. Soshnikov.
公開日: 2010-03-11
英語翻訳: http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/
この記事は blog garden justinw の中国語翻訳を参照しており、翻訳者のおかげでいくつかの誤りが修正されました。
コードをコピー
定義
コントローラーは ECMAScript 実行可能コードに切り替わるたびに、実行コンテキストに入ります。実行コンテキスト (略して -EC) は、ECMA-262 標準の抽象概念であり、実行可能コードの概念と区別するために使用されます。
標準仕様では、技術実装の観点から EC の正確なタイプと構造を定義していません。これは、ECMAScript エンジンを具体的に実装するときに考慮すべき問題です。
アクティブな実行コンテキスト グループは論理的にスタックを形成します。スタックの最下位は常にグローバル コンテキストであり、最上位は現在の (アクティブな) 実行コンテキストです。 EC タイプがコンテキストに出入りするときに、スタックは変更 (プッシュまたはポップ) されます。
実行可能コード タイプ
実行可能コード タイプの概念は、実行コンテキストの抽象概念に関連しています。ある時点で、実行可能コードと実行コンテキストが同等になる可能性は十分にあります。
たとえば、実行コンテキスト スタックを配列として定義できます。
ECStack = []
関数が再帰的に呼び出されたり、コンストラクターとして)、または組み込みの eval 関数が機能すると、このスタックがプッシュされます。
グローバル コード
このタイプのコードは「プログラム」レベルで処理されます。たとえば、外部の js ファイルやローカルの <script></script> タグ内のコードを読み込みます。グローバル コードには、関数本体内のコードは含まれません。
初期化 (プログラムの起動) フェーズでは、ECStack は次のようになります:
ECStack = [
globalContext
];
関数コード
関数関数コード (すべての種類の関数) を入力する場合、ECStack新しい要素を取り入れます。なお、特定機能コードには内部機能コードは含まれない。以下に示すように、関数自体を再帰的に 1 回調整します:
(function foo(bar) {
if (bar) {
return;
}
foo(true);
})(); >
次に、ECStack を次のように変更します。
/ / foo
ECStack = [
functionContext
globalContext
]// の再帰的アクティブ化呼び出しfoo
ECStack = [
functionContext – 再帰的に
が返されるたびに、それに応じて実行コンテキストが終了し、スタック ポインタが自動的に移動します。これは典型的なスタック実装です。スローされた例外は、インターセプトされない場合、1 つ以上の実行コンテキストから終了する可能性があります。関連するコードが実行された後、アプリケーション全体が終了するまで、ECStack にはグローバル コンテキストのみが含まれます。
評価コード
評価コードは少し興味深いです。これには、呼び出しコンテキスト (eval 関数が呼び出されたときに生成されるコンテキストなど) という概念があります。 eval (変数または関数宣言) アクティビティは、呼び出しコンテキストに影響を与えます。
コードをコピー
コードは次のとおりです。
ECStack 変更プロセスを宣言しません:
コードをコピーします
コードは次のとおりです:
ECStack = [
globalContext
];
// eval('var x = 10');
ECStack.push(
evalContext, callingContext: globalContext
);
// eval 終了コンテキスト
ECStack.pop();
// foo 関数呼び出し
ECStack.push(
// eval('var y = 20');
evalContext,
callingContext: functionContext
); 🎜>
// return from eval
ECStack.pop();
// return from foo
非常に一般的な論理呼び出しスタック。
バージョン番号 1.7 以降の SpiderMonkey (組み込み Firefox、Thunderbird) の実装では、呼び出しコンテキストを 2 番目のパラメーターとして eval に渡すことができます。このコンテキストが存在する場合、「プライベート」(これを好んで呼ぶ人もいます) 変数に影響を与えることが可能です。
コードをコピー
関数 () { アラート (x) };
var(); // 1
eval('x = 2', bar) // コンテキストで渡すと内部 var x 変数に影響します
bar(); // 2
結論
この記事は、実行コンテキスト (変数オブジェクト、スコープ チェーンなど) に関連する他のトピックの後続の分析のための最小限の理論的基礎であり、これについては後続の章で説明します。
その他の参考資料