새롭게 정의된 스코프는 상위의 스코프에 접근할 수 있다.
스코프 체인은 scope의 가장 내부에서 scope chain을 따라 바깥쪽으로 검색을 하게 된다.
참조 : https://velog.io/@bathingape/스코프Scope와-클로저Closure-이해
var var1 = 1;
var var2 = 2;
참조할 상위 컨텍스트가 없어, 자신이 최상위에 위치하는 변수 객체
var var1 = 1;
var var2 = 2;
function func(){
var var1 = 10;
var var2 = 20;
}
func();
각 함수 객체는 [[scope]]프로퍼티로 현재 컨텍스트의 스코프 체인을 참조한다.
함수가 실행시 실행컨텍스트는 자신이 사용할 스코프 체인을 현재 실행되는 함수 객체의 [[scope]]프로퍼티를 복사하고, 새롭게 생성된 변수객체를 해당 체인의 제일 앞에 추가한다.
스코프 체인 = 현재 실행 컨텍스트의 변수 객체 + 상위 컨텍스트의 스코프 체인
이미 생명주기가 끝난 외부 함수의 변수를 참조하는 함수
function outerFunc() {
var x = 10;
var innerFunc = function () {console.log(x);}
return innerFunc();
}
var inner = outerFunc();
inner();
outerFunc() 안의 변수 x, innerFunc가 생성되고, scope는 outerFunc 변수객체가 된다.
outerFunc()가 innerFunc를 실행하며 리턴한다.
innerFunc() 실행 컨텍스트가 생성된다.
innerFunc()의 scope는 innerFunc안에 변수객체가 없음에 따라, outerFunc의 변수를 가르킨다.
이에따라, innerFunc()의 scope는 outerFunc()가 된다.
outerFunc() 함수는 종료됐지만, innerFunc()의 실행컨텍스트는 유지되고 있다.
JavaScript의 문구를 실행컨텍스트로 그려보는 연습을 해보는 것이 좋아보임.