자바스크립트 함수가 어떻게해서 유연성이 생기는지 자세히 알아보자.
자바스크립트는 함수지향언어로 전역함수로부터 시작하여 함수가 호출되고 내부에서 또다시 함수가 호출되는 방식을 가지고있다.
실행컨텍스트객체
함수가 호출되면 실행관련정보(매개변수,인자,...)들을 객체형태로 저장하여 콜스택에 추가한다.
함수는 필요시 정보를 실행컨텍스트객체내에서 참조한다.
실행컨텍스트객체 내부에는 변수환경객체, 렉시컬환경객체, thisBinding 3가지 객체로 구성되고 이중 렉시컬환경객체가 자신의 코드블럭내 변수정보와 외부함수와 연결된 환경정보객체참조를 가지고있다.
중요
호출된 함수는 자신의 지역변수들의 정보를 가진 렉시컬환경객체를 만들어 저장하고 이미 실행중인 외부함수의 렉시컬환경객체와 연결되어 있기때문에 자신의 지역변수뿐아니라 외부변수도 참조할 수 있게된다.
자바스크립트 모든 함수는 생성시 [[Environment]] 숨김속성을 가지게되는데 이 속성은 자신함수의 외부함수 환경객체를 참조한다.
이것이 필요한 이유는 이 함수가 유연성으로인해 어디서 호출되어도 자신이 생성된 렉시컬환경객체와 연결되도록 하기 위한 것이다.
이렇게 자신의 생성된 외부환경객체와 연결되어야 자신이 사용하는 외부변수에 접근할 수 있는 것이다.
만약 함수내에 this.variable이 있고 함수가 생성시점의 객체와 다른 환경의 객체메소드로 전달되어 호출된다면 [[Environment]]속성의 외부환경개체와 상관없이 호출된 렉시컬환경객체에서 변수정보를 찾아 접근한다.
지역변수는 [[Environment]]로 연결되는 환경객체들에서 찾아 접근한다
this.variable은 호출하는 객체에 연결된 환경객체들에서 찾아 접근한다.