Front-End

vsoghlv@naver.com

자바스크립트 실행 컨텍스트

실행 컨택스트

ECMAScript 에서 실행 컨텍스트를 “실행 가능한 자바스크립트 코드 블록이 실행되는 환경” 이라 기술 한다. 이를 풀어서 말하면 “실행 가능한 자바스크립트 코드 블록이 실행되는 환경” 이라 할 수 있는데 여기서 실행 가능한 코드블록은 대부분 함수이다.

ECMAScript 에서는 실행 컨텍스트가 형성되는 경우를 3 가지로 정의하고 있다.

  1. 전역코드
  2. eval() 함수로 실행되는 코드
  3. 함수안의 코드를 실행할 경우

코드 블록안에 변수, 객체, 실행 가능한 코드 등이 있는데

코드실행 -> 실행 컨텍스트 생성 -> 실행 컨텍스트 스택에 쌓임 -> 가장 위의 실행 컨텍스트 = 현재 실행 되는 컨텍스트

현재 실행되는 컨텍스트에서 이 컨텍스트와 관련 없는 실행 코드가 실행되면, 새로운 컨텍스트가 생성되어 스택에 들어가고 그 컨택스트로 이동한다.

실행 컨텍스트 생성과정

활성 객체 생성

실행 컨택스트 생성 시 자바스크립트 엔진이 해당 컨텍스트에서 실행에 필요한 정보들을 담을 객체를 생성하는데 이를 활성 객체라 한다. 이 객체에는 매개변수, 사용자가 정의한 변수 및 객체를 저장하고 새로 만들어진 컨텍스트로 접근 가능하다.(엔진 내부 접속)

arguments 객체 생성

활성 객체 생성 후 arguments 객체를 생성한다. 활성 객체는 arguments 프로퍼티로 arguments 객체를 참조 한다.

스코프 정보 생성

현재 컨텍스트의 유효범위를 나타내는 스코프 정보를 생성하는데 실행 컨텍스트 안에서 연결 리스트와 유사한 형식으로 만들어진다. 이 리스트 - 스코프 체인 - 를 이용해 현재 컨텍스트의 변수와 상위 실행 컨텍스트의 변수에 접근이 가능하다. 이 리스트에서 찾지 못한 변수는 에러를 발생시킨다.

변수생성

실행 컨텍스트의 내부에서 사용되는 지역 변수의 생성이 이루어진다. 앞서 생성된 활성 객체가 변수객체로 사용된다. 변수 객체 안에서 호출된 함수 인자는 각 프로퍼티가 만들어지고 그 값이 할당되는데 이 값이 넘겨지지 않았다면 undefinde 가 할당 된다. 이 과정에서 변수, 내부 함수를 메모리에 생성만하고 초기화는 표현식이 실행되기 전까지는 이루어지지 않는다.

this 바인딩

this 바인딩이 이루어진다.

코드 실행

위 과정을 거쳐 실행 컨텍스트가 생성된 후, 변수 객체가 만들어진 후에 표현식 실행이 이루어진다.

전역 실행 컨텍스트는 일반적인 실행 컨텍스트와는 조금 다르다. arguments 객체가 없고, 전역 객체 하나만 포함 하는 스코프 체인이 있다. 전역 실행 컨텍스트는 변수를 초기화 하고 이것의 내부 함수는 일반적인 탑 레벨의 함수로 선언되는데, 변수 객체가 전역 객체로 사용된다.

즉, 전역적으로 선언된 함수, 변수가 전역 객체의 프로퍼티가 된다.