자바스크립트 스코프 체인
이 내용을 다 이해하면, JS에서 조금복잡해보이는 중첩함수들의 값이 어떻게 될 것인지 이해할 수 있다.
자바스크립트의 변수 식별은 정적스코프(렉시컬스코프)를 따른다.
Q. 정적 스코프가 뭔가요?
- 정적스코프(렉시컬스코프) : 변수의 정체성(누구인지)이 선언시에 결정됨
- 동적스코프 : 변수의 정체성이 호출당시에 결정됨.
JS를 비롯한 대부분의 언어는 정적스코프를 따름.
가장 중요한 두 문장
누가 누구인지 식별(결정)하는것 : 선언시에 결정됨. 하지만 그 값 자체는 : 호출시점의 변수값을 사용함.
( 두번째 문장은 당연한 들릴수 있지만 둘을 구분 짓는 것은 중요해서 각각 언급하였음 )
나중에 this를 제외하곤 모든 변수가 이 규칙을 따름.
그 외 스코프관련 중요 설명
클로저: 외부 함수 컨택스트보다 오래 살아남는 내부함수. 이렇게 될 경우, 내부 함수가 참조하고있는 외부 변수는 얼어서 수명이 연장됨. 그 외에 특별한 것은 없음.
클로저에 대해 조금 더 깊게 가자면, 클로저는 자바스크립트가 따로 추가한 기능이아니라, 렉시컬환경에 의해 저절로 발생하는 현상이다. 외부함수의 생명주기가 끝나면 외부함수의 실행컨텍스트는 실행컨텍스트 스택에서 팝되지만, 외부함수의 렉시컬환경까지 사라지지는 않기때문에, 내부함수는 내부함수의 렉시컬환경을 통해 여전히 이를 참조할 수 있다.
활용 : 글로벌변수 회피(정보은닉)에 사용할 수 있다. 외부함수껍데기를만들어서 변수를선언하고 생명주기를 날려버리면, 내부함수에서만 이에 접근가능하기때문에 마치 클래스의 private 필드 처럼 사용할 수가 있다. (=글로벌 변수를 대체할 수 있다.)
실행 컨텍스트 스택(콜스택) : 실행컨텍스트를 담는 스택 자료구조. 실행 컨텍스트 : 렉시컬환경을 참조하고 있음.
렉시컬 환경 : 그래서 그 식별자가 어느 메모리주소를 참조해야하는지를 담고(참조) 있음. (정적스코프에서 식별한 그것. 이 식별자가 그래서 누구인지.) 식별자와 그 값을 연결하는 자료구조임.
함수마다 렉시컬환경과, 그걸참조하는 실행컨텍스트가 형성됨.
줄줄이 이어져 있는 렉시컬환경을 스코프체인 이라고 함.
이 글은 JS 딥다이브의 13.스코프, 23.실행컨텍스트, 24.클로저 부분을 읽고 가장 중요한 개념을 정리한 것입니다.