코어자바스크립트 [02.컨택스트]

null·2021년 10월 5일
0

실행 컨택스트

실행할 코드에 제공할 환경 정보를 모아놓은 객체

스택

출입구가 하나인 데이터 구조

무슨 말이냐면 abc 순서대로 넣었다면 cba로 꺼내야만 함 또 정해진 데이터보다 많이 넣으려고 하면 오류 뿜는다

양쪽이 모두 열린 파이프라고 생각해봐.. 각각 입력과 출력을 담당하는 구조

abc 순서대로 저장했다면 꺼낼때도 abc 순서대로 꺼낸다

다시..

동일한 환경(= 전역공간, 함수)에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨택스트 구성 >

이걸 콜 스택에 쌓아올렸다가, 가장 위에 쌓인 컨텍스트와 관련있는 코드들을 실행하는 식

// (1)
var a = 1

function outer() {
	function inner() {
		console.log(a);
		var a = 3;
	}
	inner(); (2)
	console.log(a); // 1
}
outer(); // (3)
console.log(a) //1

위 코드를 분석해보자.

전역 컨택스트 (1) 콜스텍에 담긴다

outer 함수를 호출하면 이 함수 관련 정보를 수집해서 outer 컨택스트 생성 > 콜스택에 담는다

outer 내부에 inner 함수가 호출되며 마찬가지로 콜스택에 담김

그럼 지금 전역컨텍스트 - outer - inner 순으로 담긴거야! (inner가 제일 위에)

그러면 위부터 처리를 하는거지.

inner 함수는 a에 3을 할당하고 종료 > inner 실행컨택스트 제거 ... 이런식으로 끗

즉 실행 컨텍스트가 맨 위에 쌓이는 순간이 곧 현재 실행할 코드에 관여하게 되는 시점

이렇게 실행 컨텍스트가 활성화 될 때 자스 엔진은 해당 컨텍스트 관련 코드를 실행하는데 필요한

환경 정보를 수집해서 실행 컨텍스트 객체에 저장한다 이건 개발자들은 못봄

여기에 담기는 정보는..

  • VariableEnvironment

VariableEnvironment, LexicalEnviroment

두가지 담기는 내용은 같지만 최최조 실행시의 스냅샷을 유지한다는 점이 다르다

실행 컨택스트를 생성할 때 VariableEnvironment에 정보를 담는다 >

이를 그대로 복사해서 LexicalEnviroment를 만들고 이걸 주로 활용

호이스팅

자바스크립트 엔진은 식별자들을 최상단으로 끌어올려놓은 다음 실제 코드를 실행한다

변수 정보를 수집하는 과정

environmentRecord에는 매개변수의 이름, 함수선언, 변수명 등이 담긴다. 즉 코드내에

어떤 식별자들이 있는지에만 관심이 있고 어떤 값이 할당될 것인지는 관심이 없음

그래서 변수를 호이스팅 할 때 변수명만 끌어올리고 할당 과정은 원래 자리에 남긴다!!

함수 선언문과 함수 표현식

함수 선언문

// 함수 정의만 있고 별도의 할당 명령이 없음

function a () {
//...
}
a(); // 실행

함수 표현식

함수명을 정의했으면 기명함수식 없다면 익명함수

  • 기명 함수 주의 사항
    외부에서는 함수명으로 함수 호출 불가. 오직 내부에서만!
//(1)
// 정의된 함수를 별도의 변수에 할당한 것
var b = function b() {
//..
}
b(); //실행	

// (2)호이스팅을 마친 상태
const sum = function sum(a,b) {
	return a + b
};

mul;  // 변수는 선언부 끌올 === 변수 선언부만 호이스팅 

console.log(sum(1,2)); //3
console.log(mul(2,4)); // 실행 불가. 

mul = function (a,b) {
	return a * b
}

스코프 , 스코프체인

식별자에 대한 유효범위 , 자바스크립트에선 오직 함수에 의해서만 생성 요것이 스코프 ,

식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 걸 스코프체인

스코프체인..

outerEnviromentRe..(연결 리스트 형태- 이전 함수를 참조하고 참조하고.. ) 현재 호출된 함수가 선언될 당시의 LexicalEnviromnett를 참조

연결리스트 이야기로 가면. 결국 선언 시점의 시작을 찾으면 LexicalEnviroment.. 이러면 접근이 어렵.

그래서! 여러 스코프에서 동일한 식별자를 선언한 경우에는 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능

변수 은닉화

예를 들어 a 라는 함수 내부에서 b라는 변수를 선언했으면 전역 공간에서 선언한 동일한 이름의 b 변수에는 접근 불가

전연변수와 지역변수

전역공간에서 선언하면 전역변수 함수 내부에서 선언하면 지역변수

코드의 안전성을 위해 전역변수를 최소화하자!

profile
개발이 싫어.

0개의 댓글