실행컨텍스트
실행컨텍스트는 코드를 실행할 수 있는 환경이다
전역컨텍스트는 한번만 실행될 수 있으며 맨 첨에 만들어지면 맨 마지막에 종료된다.
전역컨텍스트 variable object는 global object 라 한다
함수컨텍스트 는 Activation Object 라 하며 전역컨텍스트와 다르게 argument객체가 생성된다.
전역컨텍스트가 생성될 때 변수 호이스팅과 함수호이스팅으로 인해 먼저 셋팅 된다. 이때 함수 호이스팅은 함수객체 까지 모두 되지만, 변수는 선언단계와 초기화단계 까지 이다.
함수컨텍스트에서 스코프체인은 자신의 스코프에서 먼저 검색을 한 후 검색 값이 없을 경우 상위 스코프로 순서대로 검색한다. 함수컨테스트의 variable object 의 함수객체에 [[scope]]라는 프로퍼티가 생성되는데 [[scope]]은 해당 함수컨텍스트의 스코프체인을 가리키므로 자신과 해당 컨텍스트의 상위 스코프까지 참조한다. [[scope]]는 외부함수의 실행이 종료되어도 [[scope]]가 가르키는 스코프에서 참조가 가능하다 이것을 클로저라 한다.
클로저
외부함수가 종료되어도 내부함수가 유효한 경우 내부함수는 외부함수에 있는 변수를 참조할 수 있다.
본래라면 함수가 종료되었다면 참조할 수 없다.
클로저에 참조되어 있는 함수를 자유함수라 한다. (내부함수에서 참조하는 외부함수의 변수)
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
for (var j = 0; j < arr.length; j++) {
console.log(arr[j]());
}