実行コンテキストは 実行コンテキストは、実行するコードで提供される環境情報を含むオブジェクト である.
は、同じ環境のコードを実行するために必要な環境情報を収集し、 を構成する.
コンテキストは、Call Stackにおける に順次積み重ねる.
最高コンテキストに関連するコード
を実行 の完全なコードを確保する環境と順序 実行コンテキストの構成方法 グローバルスペース→自動運転 eval()関数の使用は推奨されません→ 関数→最も一般的な実行コンテキスト構成方法 ブロック→ { }
積み重ねられたコードの内部.ES 6から をサポート
コンテキストと呼び出しスタックの実行 サンプルコード
var a = 1 ;
function outer ( ) {
function inner ( ) {
console. log ( a) ;
var a = 3 ;
}
inner ( ) ;
console. log ( a) ;
}
outer ( ) ;
console. log ( a) ;
実行順:(1)→(5)→(3)→(2)→(4)→(6) コールスタック変化 収集アクティビティの実行コンテキストについて VariableEnvironment environmentRecord (snapshot) outerEnvironmentReference (snapshot) LexicalEnvironment environmentRecord outerEnvironmentReference ThisBinding-この識別子が注目すべきターゲットオブジェクト VariableEnvironment に含まれるコンテンツはLexicalEnvironmentと同じですが、初期実行時のスナップショット は保持されます.
作成
実行時には、まずVariableEnvironmentに情報を書き込み、その後LexicalEnvironmentにコピーし、次に主にLexicalEnvironmentを利用する 内部コンポーネント: 現在のコンテキスト内の識別子の情報+外部環境情報を宣言ポイントのスナップショットとして保存 environmentRecord (snapshot) outerEnvironmentReference (snapshot) LexicalEnvironment 内部コンポーネント: VariableEnvironmentと同じですが、変更はリアルタイムで反映されます. environmentRecord outerEnvironmentReference 環境記録とブート(アップグレード) environmentRecord 現在のコンテキストに関連するコードの識別子情報を格納する 構成 コンテキストの関数で指定された パラメータ識別子 宣言関数 関数自体 varと宣言された 変数の識別子 コンテキストで最初から最後までブラウズし、 を順番に収集する.
グローバル実行コンテキスト 変数オブジェクトの代わりにJavaScriptによって駆動される環境で個別に提供されるグローバルオブジェクトを使用して を作成します.
ブラウザのwindow,Node. jsのglobalオブジェクトを含む
は、内蔵(ネイティブ)オブジェクトではなく、ホスト(ホスト)オブジェクトとして分類します. ハウステンボスの登場 変数情報を収集するプロセスが完了している場合は、JavaScriptエンジンは、コードが実行される前に、その環境内のコードのすべての変数名を知っています. 「javascriptエンジンは識別子を最上位に引き出し、実際のコードを実行する」が、コード解釈に問題はない この過程で、ハウスティンの概念 が現れた.
ハウスティンの概念 号昇格:昇格(昇格)+~ing→識別者を最上位に昇格、 仮想概念 は、変数情報を収集するプロセスに代わって、より理解しやすい方法で置き換えられる.
javascriptエンジンは実際にはアップグレードされていませんが、便利なアップグレードと見なしています. 変数は、宣言および割当部分のみを宣言に昇格させます. 関数全体 号ポーリング終了時の関数宣言は、(*)関数名として宣言された変数に関数 が割り当てられていると考えられる.
関数宣言文と関数式 関数宣言:関数定義子のみが存在し、個別の割り当てコマンドはありません. 関数全体 を上げる
関数式:定義された関数を別の変数に割り当てる 匿名関数式:関数名を定義しない 記名関数式:関数名の定義 関数名から を呼び出すことはできません.
内部 再帰関数の呼び出しに使用します.ただし変数名で呼び出すこともでき、 を書く必要はないように見えます.
番転送時は変数とみなされます. ドラッグアンドドロップ宣言部 のみ
function a ( ) { }
a ( ) ;
var b = function ( ) { }
b ( ) ;
var c = function d ( ) { }
c ( ) ;
d ( ) ;
コード上部宣言
関数宣言の場合、下部で同じ名前の関数宣言を繰り返し使用すると、予期せぬ が発生する可能性があります.
外部環境リファレンス ひょうじチェーン 現在スキャンで宣言されていない識別子がある場合は、親スキャンに移動して を検索します.
が複数のscopeで同じ識別子を宣言した場合、 スキャンチェーンで最初に検出された識別子のみに無条件にアクセス 可能性 変数非表示 : 宣言は親スキャンにありますが、現在宣言されている場合は値が指定されます. 例 var a = 1 ;
var outer = function ( ) {
var inner = function ( ) {
console. log ( a) ;
var a = 3 ;
} ;
inner ( ) ;
console. log ( a) ;
}
outer ( ) ;
console. log ( a) ;
(1)内の関数コンテキストには識別子が存在するが、値は指定されていない. undefined
出力 (2)outer関数コンテキストにはa識別子が存在しないため、outerEnvironmentReferenceに従ってグローバルコンテキストのaで見つけることができます. 1
出力 (3)グローバルコンテキストに識別子と値が存在する. 1
出力
Reference
この問題について(実行コンテキスト), 我々は、より多くの情報をここで見つけました
https://velog.io/@hyeongpil/2장-실행-컨텍스트
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol