JavaScript ECMA-626-3深く解析します。


本論文の例は、JavaScript ECMAの実行コンテキストを説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
紹介する
この文章は主にECMAScriptの実行文脈と関連するECMAScriptの実行可能コードを検討します。
定義
コントローラがECMAScript実行可能なコードに移るたびに、実行コンテキストに入ります。
実行文脈(略称-EC)は抽象概念であり、ECMA-622標準はこの概念で実行可能コード概念と区別している。
標準仕様は、技術的に実現された観点からECのタイプと構造を正確に定義していない。これはECMAScriptエンジンを具体的に実現する際に考慮すべき問題です。
アクティブな実行コンテキストは、論理的にスタックを構成する。スタックの底部は常にグローバルコンテキスト(global context)であり、スタックの上部は現在(アクティブ)の実行コンテキストである。スタックは、ECタイプの変数(various kingds of EC)を押し入れたり、イジェクトしたりしながら修正されます。
実行可能コード
実行可能コードの概念は、抽象的な実行コンテキストの概念と相対的である。実行可能なコードは、ある時点で実行されるコンテキストと等価である。
例えば、コンテキストスタックの実行をシミュレートするための配列を定義することができる。

ECStack = [];
関数(再帰的に呼び出されても、または構造関数としても)に入るたびに、または内蔵されたeval関数が作動するとき、このスタックは押し込まれます。
グローバルコード
このタイプのコードは「プログラム」レベルで処理されます。例えば外部のjsファイルをロードするか、あるいはローカルの「script」ラベル内のコードです。グローバルコードには、関数内のコードは含まれていません。
初期化(プログラム起動)段階では、ECStockはこうです。

ECStack = [
 globalContext
];
関数コード
関数コード(すべての種類の関数)に入ると、ECStockは新しい要素に押し込まれます。なお、具体的な関数コードには内部関数コードが含まれていない。下記のように、関数を自分で調整する方式を再帰させます。

(function foo(bar) {
 if (bar) {
 return;
 }
 foo(true);
})();
ECStockは以下のように変更される。

// first activation of foo
ECStack = [
 <foo> functionContext
 globalContext
];
 
// recursive activation of foo
ECStack = [
 <foo> functionContext C recursively
 <foo> functionContext
 globalContext
];
存在する現在のコンテキストとECStockポップアップがそれぞれ実行されているコンテキストを返すたびに、スタックポインタは自動的に位置を移動します。これは典型的なスタックインプリメンテーションです。一つは投げ出されたが、切り取られた異常はなく、一つ以上の実行文脈も存在する。関連セグメントコードが実行された後、アプリケーション全体が終了するまで、ECStockはグローバルコンテキストのみを含みます。
Evalコード
 エヴァコードはちょっと面白いです。コンテキストを呼び出すという概念があります。これはeval関数が呼び出されたときに発生するコンテキストです。eval(変数または関数宣言)活動は、呼び出しコンテキストに影響を及ぼします。

eval('var x = 10');
 
(function foo() {
 eval('var y = 20');
})();
 
alert(x); // 10
alert(y); // "y" is not defined
ECStockの変化過程:

ECStack = [
 globalContext
];
 
// eval('var x = 10');
ECStack.push(
 evalContext,
 callingContext: globalContext
);
 
// eval exited context
ECStack.pop();
 
// foo funciton call
ECStack.push(<foo> functionContext);
 
// eval('var y = 20');
ECStack.push(
 evalContext,
 callingContext: <foo> functionContext
);
 
// return from eval
ECStack.pop();
 
// return from foo
ECStack.pop();
見ましたよね。これは非常に普通の論理呼び出しスタックです。
バージョン番号1.7以上のSpider Monkey(Firefoxに内蔵されています。Thunderbird)の実装では、呼び出しコンテキストを第二のパラメータとしてevalに渡すことができます。このコンテキストが存在すると、「プライベート」変数に影響を与える可能性があります。

function foo() {
 var x = 1;
 return function () { alert(x); };
};
 
var bar = foo();
 
bar(); // 1
 
eval('x = 2', bar); // pass context, influence on internal var "x"
 
bar(); // 2
結論
この文章の内容は、将来、他の実行文脈に関するテーマ(例えば変数オブジェクト、作用ドメインチェーンなど)を分析する最低限の理論的基礎であり、これらのテーマは次の章で述べる。
その他の参考
この文章の内容はECMA-626-3標準規範の中で対応する章節です。
英語の住所:ECMA-622-3 in detail.Chapter 1.Execution Contects
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容は当駅のテーマを調べられます。「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」及び「JavaScript数学演算の使い方のまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。