JS]実行コンテキスト(Execution Context)
10585 ワード
🪵 定義#テイギ#
Execution context (abbreviated form — EC) is the abstract concept used by ECMA-262 specification for typification and differentiation of an executable code.
実行コンテキストは,実行可能コードを実行するために必要な環境といえる.
概念的には,アクティビティ実行コンテキストの集合がスタックを構成する.スタックの下部は常に
global context
であり、上部は現在のアクティビティ実行コンテキストである.🪵 Executableコードのタイプ
実行可能コードは4種類あります.
1. global code
2. function code
3. eval code
4. module code
実行コンテキストのスタックを配列として定義します.
ECStack = [];
スタックは関数に入るたびにプッシュされ、内蔵eval関数を実行するたびにプッシュされます.Global Code
グローバルコードは
Program
級で処理されています.たとえば、ロードされた外部.jsファイルまたは内部のインラインコード(<script></script>
)で処理される.グローバルコードには、関数内部のコードは含まれません.
プログラム起動時にECStackは以下のようになります.
ECStack = [
globalContext
];
Function Code
たとえば、
(function foo(flag) {
if (flag) {
return;
}
foo(true);
})(false);
ECStackは以下のように変更されました.// first activation of foo
ECStack = [
<foo> functionContext
globalContext
];
// recursive activation of foo
ECStack = [
<foo> functionContext – recursively
<foo> functionContext
globalContext
];
最初のfoo関数が呼び出されると、foo関数コンテキストはECStackにリフレッシュされ、foo関数コンテキストは再びリフレッシュされます.ECStackは、関数から戻るたびに現在の実行コンテキスト(順次または逆)を終了します.
プログラムが終了すると、ECStackはグローバルコンテキストのみを保持します.
(function foo() {
(function bar() {
throw 'Exit from bar and foo contexts';
})();
})();
Eval Code
呼び出しコンテキストと呼ばれる方法、すなわち
// influence global context
eval('var x = 10');
(function foo() {
// and here, variable "y" is
// created in the local context
// of "foo" function
eval('var y = 20');
})();
alert(x); // 10
alert(y); // "y" is not defined
このコードのECStackの変更は次のとおりです.ECStack = [
globalContext
];
// eval('var x = 10');
ECStack.push({
context: evalContext,
callingContext: globalContext
});
// eval exited context
ECStack.pop();
// foo funciton call
ECStack.push(<foo> functionContext);
// eval('var y = 20');
ECStack.push({
context: evalContext,
callingContext: <foo> functionContext
});
// return from eval
ECStack.pop();
// return from foo
ECStack.pop();
🪵 サマリ
概念的には、実行コンテキストは呼び出しスタックのようにスタックとして維持される.
Def. 8: Execution context stack: An execution context stack is a LIFO structure used to maintain control flow and order of execution.
実行コンテキストスタックには、コントロールフローと実行順序を維持するためのLIFO構造があります.
ECMAScript codeには、global code、function code、eval code、module codeなど、さまざまなタイプがあります.各コードは、対応する実行コンテキストで処理されます.各コードタイプとそれらに適したオブジェクトは、実行コンテキストの構造に影響します.
例えば、グローバル実行コンテキストにおける変数オブジェクト(VO)は、グローバルオブジェクトグローバルオブジェクト(GO)と呼ばれ、引数の情報は含まれない.逆に,関数コードで生成された関数実行コンテキストにおける変数オブジェクト(VO)は,パラメータとパラメータに関する情報を含むオブジェクト(AO)を活性化する.
次の再帰関数呼び出しを見てみましょう.
function recursive(flag) {
// Exit condition.
if (flag === 2) {
return;
}
// Call recursively.
recursive(++flag);
}
// Go.
recursive(0);
グローバルコンテキストは常にスタックの下部にあります.グローバルコンテキストは、他のコンテキストを作成する前に作成されます.グローバルコンテキストは、アプリケーションが終了するまで維持されます.
新しい関数が呼び出されると、新しい実行コンテキストが作成され、スタックにプッシュされます.この場合、この実行コンテキストはアクティブな実行コンテキストになります.
関数が返されると、コンテキストがスタックからポップアップされます.
他のコンテキストを呼び出すコンテキストを呼び出し者、呼び出すコンテキストを呼び出し者と呼びます.上記の例の再帰関数は、呼び出し元であり、呼び出し元でもあります.
リファレンス
Reference
この問題について(JS]実行コンテキスト(Execution Context)), 我々は、より多くの情報をここで見つけました https://velog.io/@yejineee/JS-실행-컨텍스트-Execution-Contextテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol