Execution context


実行コンテキストはscope、hilling、this、function、closureなどの動作原理を含むJavaScriptの核心原理...より簡単に言えば、実行コンテキストは、実行可能なコードを実行するために必要な環境である.

1. Global excution context


デフォルトでは、JavaScriptコードの起動時に起動するコンテキスト
GlobalではJavaScript実行時の実行環境といえる
無条件に1つしか存在しません!(JavaScriptはシングルスレッド)

2. Functional execution context


実行コンテキストは基本的に関数単位で生成されます.各関数にJavaScriptがあります
scopeを所有し、ドメインscopurと呼ばれます.
Functional execution contextは、関数が呼び出され、実行中の関数に対して生成されるexecution contextであり、関数内部のthisおよび領域変数を含む.

3. Eval


李慶宇は極めて珍しいので、すぐに処理しません.
var a = 10;

fuction functionA {
	
    console.log("start function A");
    
    function functionB(){
    	console.log("In function B");  
    }
	functionB();
}

functionA();

Executionコンテキストの簡単な表示



より詳細なプロセス


1.作成フェーズ(作成フェーズ)


2.実行フェーズ(実行フェーズ)


Creation phase


作成フェーズも3つのフェーズを経験

1.Activationオブジェクトまたは可変オブジェクトの作成


ここで両者の意味はほぼ同じであるが,Activation objectは特殊な可変オブジェクトといえる.
「可変オブジェクト」(Variable Objects)-通常の関数に対して作成される変数オブジェクト.
Activation object-グローバル領域のグローバル実行コンテキストに対応するオブジェクト

2.スコープチェーンの作成(スコープ変数に作用する有効領域)


有効領域はチェーンのように配列に含まれ、scopeの最も近いscopeから始まり、その前の
scopeの一番上のglobalcoscopeもチェーンのようにつながっているのでscope chainと呼ばれています

3.Determine the value of this(この値を決定)


コードを見て理解しましょう。

a = 1; // 변수선원 키워드 var, let, const이 없어 자바스크립트 엔진이 a를 변수로 등록하지 않는다
Variable object이 안되고 Activation object로 글로벌 변수로 분류 되는 것 같다

var b = 2; // Variable object이 된다 그러나 값은 undefined 왜냐? 지금 phase는 
creation phase이기 때문!

cFunc = function(e){ // 변수 선언 키워드가 없다 그러나 함수가 선언되고 할당되었다는 이유만으로 이 함수의 주소가 포인터 값으로 힙메모리 어디에 저장이 되고 cFunc라는 변수에 할당해줌 cFunc는 아직 함수안의 내용은 모르고 주소값만 알고 있는 상태
	var c = 10;    
    var d = 15;
    
    a = 3; // 이렇게 선언 키워드없이 선언하면 creation phase에선 아무 변화가 없다
    
    function dFunc(){
    	var f = 5;
    
    }

	dFunc(10);
}

cFunc();// 여길 만나면 글로벌 위에 추가로 excution context가 생성된다
ここまで進むと、以下のglobal execution contextが生成される
 globaEexcutionContext = {
 	activationObj: { //variable Obj
    	argumentObj : { //argumentObj는 뭘까? 함수는 argument를 받는다
        물론 받지 않는 다면 length가 0으로 표현되고 그러나 global영역은 함수가 아니다
        그래서  length가 0
        	length : 0
        },
        b : undefined, // var b = 2; Variable object // 아직 create phase이기 때문에 undefined // Execution phase에서 이값이 채워진다
        cFunc: Pointer to the fuction definition // 포인터가 할당되어 있고
        포인터는 이 함수가 힙메모리 어딘가에 저장되어있는 주소를 가리킴(주소값)
    }
    scopeChain: [Global execution context variable object],
    this: value of this
 }
これから実行段階に入り、JavaScriptエンジン
コードを再スキャンし、未定義の値を入力する(bへの割り当てを実行する)
呼び出しcFunc値(18行目)
18行目cFunc();JavaScriptエンジンがグローバル領域で発生した場合
呼び出し後、新しいFunctional Execution Contextが作成されます.
cFuncExcutionContextObj = {
	activationObj: {
    	argumentObj: {
        	0 : e, // cFunc의 argument //1개밖에 없어서 0! 2개면 1!
            length : 1 // argument 개수 1개
        },
        e: 10, // 10을 인자로 호출됨 // 변수아님
        c: undefined, // Creation phase 지역변수들은
        d: undefined, // Creation phase 변수들의 이름만 선언됨
        dFunc : Pointer to the function definition // 선언한 함수는 포인터라는 주소로 힙메모리에 저장
    }
    scopeChain : [cFunc variable object, Global execution context variable object] // cFunc가 가지고 있는 scope영역 // 그리고 바로 밖에 있는 상위 global scope
    스코프 체인이 array형태로 만들어짐
    this : value of this
}
次に、作成フェーズでExecutionフェーズに再度移動し、定義されていない値を
宣言された値として指定し、キーワードが宣言されていないaをキー値とし、dFunc();と触れ合う
また、新しいFunctional Execution contextを作成します!
cFuncExcutionContextObj = {
	activationObj: {
    	argumentObj : {
        	0 :e,
            length : 1
        },
        e : 10,
        c : 10,
        d : 15,
        dFunc : Pointer to the function definition,
        // a = 3이라고 선언해준 값이없다
    },
    scopeChain : [cFunc variable object, Grobal execution context variable object], // a = 3; 이라는 정보가 없으니 scope를 탐색하기 시작한다 없으면 계속 상위로 넘어가서 탐색한다 계속 없으면 글로벌까지가서도 없으면 activationObj 면 해당 variable(a = 3)을 추가 해줘라라고 명령한다
    this : value of this
}
  • 顔にどんな友達がいるかしか覚えていません
  • はその友达に名前をつけて、情報がなければ、上の概念を探して彼らを探します.
    宣言、割当宣言および割当がない場合は、スキャンチェーンを使用して親スキャンを表示し、ない場合はグローバルスキャンを表示します....まだ明確な概念はありませんが、このように整理するとcontextに対する理解が曖昧になります!
    JavaScriptエンジンがコードをどのように解釈し、実行しているのかを深く知りたいのですが...!