[JS] 스코프체인
스코프체인
Javascript는 언어적으로 유효범위를 가지고 있는 언어이다. 변수의 유효범위란 정의된 변수를 사용가능한 소스코드의 집합으로 생각할 수 있다.
전역 변수는 프로그램 전체에 걸쳐 유효한데, 지역 변수는 변수가 선언된 함수 전체에 걸쳐 유효하고, 그 안에 중첩된 함수 내에서도 유효하다.
우리가 지역변수를 (구현 세부사항에 속하는 어떤) 객체의 프로퍼티로 생각한다면, 변수 유효범위를 다른 관점으로 볼 수도 있다.
Javascript의 모든 코드들은 그것과 연관된 스코프 체인을 갖고 있다.
이 스코프체인은 범위 안에 있는 변수를 정의하는 객체의 체인, 다시 말해 리스트다.
예를들면 Javascript가 변수 x의 값을 얻어야할 때(변수 해석) 처음 체인에 있는 객체에서 x를 찾기 시작한다. 만약 이 객체가 이름이 x인 프로퍼티를 갖고 있다면 그대로 사용지만, 갖고 있지 않다면 그 다음 체인에 있는 다음 객체에서 x를 찾는다. 그렇게 x인 프로퍼티를 찾을 때까지 스코프 체인내에 있는 객체들을 찾는다. x가 만약 유효범위 내에 있는 객체의 프로퍼티가 아니라면 x는 유효범위 안에 없기 때문에 Reference Error를 발생시킨다.
최상위 Javascript 코드(이를테면 어떤 함수에도 속하지 않는 코드)의 경우는 스코프체인이 단 하나의 전역객체로만 이루어진다. 중첩되지 않은 함수의 스코프체인은 두개의 객체로 이뤄진다. 하나는 함수 매개변수와 지역변수를 정의하는 객체, 다른 하나는 전역객체이다.
중첩된 함수에서 스코프체인은 세개이상의 객체를 갖는다. 객체의 스코프체인이 어떻게 생성되는지 이해해야한다. 함수가 정의될 때, 함수는 스코프체인을 저장한다. 함수가 호출될 때, 해당 함수의 지역 변수를 저장하기 위해 새로운 객체를 하나 생성하고, 해당 객체를 기존에 저장된 스코프체인에 추가한다.
중첩함수의 경우에는 외부에서 함수를 호출할 때마다 중첩된 함수가 매번 선언된다.