javascript acivation object 와 variable object 및 사전 컴 파일

문맥 ECMAScript 코드 가 실 행 될 때 항상 일정한 컨 텍스트 에서 실 행 됩 니 다. 컨 텍스트 를 실행 하 는 것 은 추상 적 인 실체 입 니 다. 이것 은 우리 가 역할 영역 과 변 수 를 예화 하 는 방법 을 이해 하 는 데 도움 이 됩 니 다.세 가지 유형의 실행 가능 코드 에 대해 서 는 모두 실행 가능 한 문맥 이 있 습 니 다.함수 가 실 행 될 때 함수 코드 (Function code) 에 들 어 가 는 실행 컨 텍스트 를 제어 한다 고 할 수 있 습 니 다.전역 코드 가 실 행 될 때 전역 코드 (Global code) 의 실행 컨 텍스트 에 들 어 갑 니 다. 보시 다시 피 상하 문 논 리 를 실행 하 는 것 은 창고 에서 온 것 입 니 다.먼저 자신의 역할 영역 이 있 는 전역 코드 일 수 있 습 니 다. 코드 에서 함 수 를 호출 할 수 있 습 니 다. 이것 은 자신의 역할 영역 이 있 고 함 수 는 다른 함 수 를 호출 할 수 있 습 니 다. 등등.함수 가 자신 을 재 귀적 으로 호출 하 더 라 도 모든 호출 은 새로운 실행 컨 텍스트 에 들 어 갑 니 다. Activation object (활성화 대상) / Variable object (변수 대상) 모든 실행 컨 텍스트 는 내부 에 Variable Object 가 있 습 니 다.실행 컨 텍스트 와 유사 하 게 Variable object 는 추상 적 인 실체 로 변 수 를 예화 하 는 메커니즘 을 묘사 합 니 다.재 미 있 는 것 은 코드 에 설 명 된 변수 와 함수 가 실제로 이 변수 대상 의 속성 으로 추가 되 었 다 는 것 이다. 전역 코드 의 실행 컨 텍스트 에 들 어 갈 때 전역 대상 은 변수 대상 으로 사 용 됩 니 다.이것 이 바로 전체 범위 에서 설명 한 변수 나 함수 가 전체 대상 의 속성 이 된 이유 입 니 다. 
코드 는 다음 과 같 습 니 다:
/* remember that `this` refers to global object when in global scope */ 
var GLOBAL_OBJECT = this; 

var foo = 1; 
GLOBAL_OBJECT.foo; // 1 
foo === GLOBAL_OBJECT.foo; // true 

function bar(){} 
typeof GLOBAL_OBJECT.bar; // "function" 
GLOBAL_OBJECT.bar === bar; // true

전역 변 수 는 전역 대상 의 속성 이 되 었 습 니 다. 그러나 함수 코드 (Function code) 에서 정의 하 는 부분 변 수 는 어떻게 될까요?행동 은 사실 매우 비슷 하 다. 그것 은 변수 대상 의 속성 이 되 었 다.유일한 차 이 는 함수 코드 (Function code) 에서 변수 대상 이 전역 대상 이 아니 라 이른바 활성화 대상 (Activation object) 이라는 점 이다.함수 코드 (Function code) 가 실행 역할 영역 에 들 어 갈 때마다 활성화 대상 (Activation object) 을 만 듭 니 다. 함수 코드 (Function code) 의 변수 와 함수 가 활성화 대상 의 속성 이 될 뿐만 아니 라 함수 의 매개 변수 (형 삼 과 대응 하 는 이름) 와 특정한 Arguments 대상 도 마찬가지 입 니 다.활성화 대상 은 내부 메커니즘 으로 프로그램 코드 에 진정 으로 접근 하지 않 습 니 다. 
코드 는 다음 과 같 습 니 다:
(function(foo){ 

var bar = 2; 
function baz(){} 

/* 
In abstract terms, 

Special `arguments` object becomes a property of containing function's Activation object: 
ACTIVATION_OBJECT.arguments; // Arguments object 

...as well as argument `foo`: 
ACTIVATION_OBJECT.foo; // 1 

...as well as variable `bar`: 
ACTIVATION_OBJECT.bar; // 2 

...as well as function declared locally: 
typeof ACTIVATION_OBJECT.baz; // "function" 
*/ 

})(1);

마지막 으로 Eval 코드 (Eval code) 에서 설명 하 는 변 수 는 호출 중인 컨 텍스트 의 변수 대상 의 속성 으로 만 들 어 졌 습 니 다.Eval 코드 (Eval code) 는 컨 텍스트 를 실행 하고 있 는 변수 대상 만 사용 합 니 다. 
코드 는 다음 과 같 습 니 다:
var GLOBAL_OBJECT = this; 

/* `foo` is created as a property of calling context Variable object, 
which in this case is a Global object */ 

eval('var foo = 1;'); 
GLOBAL_OBJECT.foo; // 1 

(function(){ 

/* `bar` is created as a property of calling context Variable object, 
which in this case is an Activation object of containing function */ 

eval('var bar = 1;'); 

/* 
In abstract terms, 
ACTIVATION_OBJECT.bar; // 1 
*/ 

})();

2. "사전 컴 파일"
   Javascript 은 < script > 세그먼트 의 방식 에 따라 관련 코드 세그먼트 를 사전 컴 파일 처리 하고 변 수 를 미리 정의 한 다음 에 함 수 를 미리 정의 하 는 방식 으로 사전 컴 파일 합 니 다!또한 변수 / 함수 가 세그먼트 의 모든 장소 에서 명시 적 성명 (변수 전에 var 추가) 을 하 더 라 도 모든 코드 가 실행 되 기 전에 사전 컴 파일 을 합 니 다. 또한 변수의 값 은 초기 undefined 이 고 함수 변수의 초기 값 은 함수 체 입 니 다. 다음은 예제 코드 를 사용 하여 전체적인 사전 컴 파일 상황 을 설명 합 니 다.
    
	alert(f);//function f(){ return1;}
	alert(b);//undefined
	alert(a);//undefined
	var a = function (){
		return 2;
	}
	function f (){             /
			return 1;   
	};
	var b = 10;

    덮어 쓰기: 다음 순서에 따라 var a 는 undefined 로 사전 컴 파일 되 었 고 a 는 "functiona () {return 1;}" 로 사전 컴 파일 되 었 으 며 a 는 "functiona () {return 10;}" 로 사전 컴 파일 되 었 기 때문에 마지막 a 는 "functiona () {return 10;}" 입 니 다.
	alert(a);//function a (){return 10;};
	
	
	function a (){             
			return 1;   
	};
	function a (){             
			return 10;   
	};
	var a = 123;	

좋은 웹페이지 즐겨찾기