실행 컨텍스트는 JS의 여러 개념을 깊게 이해하기 위해 중요한 개념이다.
JS 스펙에도 명시되어있어, 실행 컨텍스트(Execution Context)를 이해하면 자바 스크립트의 동작을 스펙 레벨에서 이해하고 활용할 수 있습니다.
node.js
2. browser인 Chrome, Firefox, Safari등JS engine은 어떠한 코드가 없어도 3가지를 초기화하게 된다. 즉 js engine이 다음 3가지를 만들게 된다.
1. this Binding : window객체가 설정됨.
2. Variable Environment : 빈 객체가 됨. => 최초 스냅샹을 유지
3. Lexical Environment( environmentRecord : hoisting, environmentReference : Scope / Scope chain ) : 최초 스냅샷에서 복사해온 복사본을 토대로 함수나 전역변수가 실행됨에 따라 바뀜.
최상위단에 scope이고 이것도 연결된 객체가 없기 때문에 빈 객체가 됨
만약 아래와 같은 코드가 있다고 가정하자
function myFunc(){
let a = 10;
let b = 20;
function add(first, second){
return first+second;
}
return add(a,b)
}
# myFunc 실행
myFunc()
이때 function myFunc()
여기 전에 우선 앞서 말한 3가지 변수(this, Variavle Oject, Scope chain)가 초기화 된다. 이때 function myFunc()
이 실행되면 이 global context에 덮어 씌우는 것이 아니라 새로운 context가 생성된다. 그 후 function myFunc()
이 실행이 완료되면 생성되었던 context가 삭제되고 모든 코드가 실행된다면 global context 또한 삭제된다. 즉 context들이 쌓이기 때문에 stack
구조라고 볼 수 있다.
strict mode
로 실행될 땐 undefined이다.strict mode
: js가 실행될 때 어떤 모듈을 정해서 실행되도록 하는 것이다.함수가 실행되면, 함수 스코프에 따라 환경이 만들어진다.
this, 함수 스코프의 변수들, 스코프 체인이 형성된다.
스코프 체인을 다라 글로벌 환경에 도달한다.
let o = {
name : 'Daniel',
method : function(number){
return this.name.repeat(number)
}
}
function myFunc(){
let n = 10
return o.method(n)
}
myFunc()
## result
DanielDanielDanielDanielDanielDanielDanielDanielDanielDaniel
객체의 method의 경우, method 환경의 this는 해당 객체을 가리키게된다. 하지만 this가 가리키는 것은 환경에 따라 변할 수 있다.