아마도 지금쯤이면 자바스크립트 변수와 객체 프로퍼티(property) 사이에 비슷한 점이 많다는 것을 알아챘을 것이다. 변수와 객체 프로퍼티 둘 다 같은 방법으로 할당되고, 자바스크립트 표현식에서 동일한 방법으로
사용되는 등 비슷한 점이 많다. 변수 i와 객체 o의 프로퍼티 i 사이에 과연 근본적인 차이가 있을까?
자바스크립트의 변수는 근본적으로 객체 프로퍼티와 동일하다.
1. 전역 객체
자바스크립트 인터프리터가 구동되면 자바스크립트 코드를 실행하기 전에 먼저 수행하는 사전 작업들이
있다. 그 중 하나가 바로 전역 객체(global object)를 생성 하는 일이다.
이 객체의 프로퍼티들은 자바스크립트 프로그램들의 전역 변수들이다.
여러분이 자바스크립트 전역 변수를 선언하면, 실제로는 전역 객체의 프로퍼티가 정의된다.
자바스크립트 인터프리터는 전역 객체를 생성하면서, 미리 정의된 값들과 함수들을 참조하는
다수의 프로퍼티들을 초기화 한다. 예를 들면 Infinity, parseInt, Math 프로퍼티들은 각각 무한대의 숫자값,
미리 정의된 parseInt() 함수, 미리 정의된 Math 객체를 참조한다.
이들 전역 프로퍼티는 3부에서 다루게 된다.
최상위 코드, 즉 어떤 함수에도 속하지 않은 코드에서는 자바스크립트의 this 키워드를 사용해서 전역 객체를 참조할 수 있다. 함수 내부에서는 this가 다른 용도로 쓰이는데, 이에 관해서는 8장에서 다룬다.
클라이언트 측 자바스크립트에서는 브라우저 창에 표시되는 모든 자바스크립트 코드의 전역 객체 역할을 Window 객체가 담당한다. 이 전역의 Window 객체에는 자기 자신을 참조하는 window 프로퍼티가 있는데, this 대신 이것으로 전역 객체를 참조할 수 있다. Window 객체는 핵심적인 전역 프로퍼티들을 정의하고 있다.
예를 들면 parseInt와 Math 등의 전역 프로퍼티들, 그리고 navigator, screen 등과 같은 클라이언트 측의
전역 프로퍼티들도 정의한다.
2. 지역 변수 : 호출 객체
전역 변수들이 특수한 전역 객체들의 프로퍼티에 해당한다면 지역 변수들은 어떨까?
이들 역시 어떤 객체의 프로퍼티에 해당한다. 이 객체를 일컬어 호출 객체(call object)라고 부른다.
호출 객체는 전역 객체보다 수명이 짧지만 쓰이는 목적은 동일하다.
함수를 실행하는 동안 그 함수의 전달인자와 지역 변수는 이 호출 객체의 속정으로 저장된다.
자바스크립트에서 지역 변수 용도로 전혀 별개의 객체를 사용하는 덕에 지역 변수가 같은 이름의 전역 변수를 덮어쓰는 것을 방지할 수 있는 것이다.
3. 자바 스크립트 실행 컨텍스트
자바스크립트 인터프리터가 어떤 함수를 실행할 때마다, 그 함수에 대한 새로운 실행 컨텍스트를 생성한다. 실행 컨텍스트란, 당연한 말이지만, 자바스크립트 코드가 실행되고 있는 컨텍스트를 말한다.
이 컨텍스트에서 중요한 부분 중 하나로 변수들이 정의되어 있는 객체를 들 수 있다.
이를테면, 어떤 함수에도 속하지 않은 자바스크립트 코드를 실행하는 컨텍스트에서는 전역 객체를 사용해서 변수를 정의한다. 그리고 모든 자바스크립트 함수는 각기 자신만의 고유한 컨텍스트에서 실행되며, 이 컨텍스트에는 지역 변수가 정의되어 있는 고유한 호출 객체가 있다.
한 가지 흥미로운 점은 자바스크립트 구현에 따라 복수의 전역 실행 컨텍스트를 허락하기도 한다는 것이다. 이들 각각에는 별개의 전역 객체가 있다.[각주:1] (단, 이 경우에는 각각의 전역 객체가 완전히 전역이진 않다.) 쉬운 예로 클라이언트 측 자바스크립트를 들 수 있다. 여기서는 각각의 브라우저 창들, 또는 창 내부의 각 프레임 마다 개별적인 전역 실행 컨텍스트에서 클라이언트 측 자바스크립트 코드를 실행하며, 각기 자신만의 전역 객체도 갖고 있다. 하지만, 이 클라이언트 측 전역 객체에는 서로 다른 전역 객체들을 연결하는 프로퍼티가 있다.
예를 들어, 한 프레임의 자바스크립트 코드에서 다른 프레임을 참조할 때는 parent.frames[1]이라는 표현식을 쓸 수 있다. 첫 번째 프레임의 x 라는 전역 변수를 두 번째 프레임에서 참조할 때는 parent.frames[0].x 라고 쓰면 된다.
클라이언트 측 자바스크립트에서 서로 다른 창이나 프레임의 실행 컨텍스트들이 서로 어떻게 연결되는지 완벽히 이해할 필요는 없다. 13장에서 자바스크립트와 웹브라우저가 어떻게 통합되는지 논할 때 이를 구체적으로 다룰 것이다. 여기서 알고 넘어갈 것은 자바스크립트는 충분히 유연한 언어라는 것이다. 단일 자바스크립트 인터프리터로 서로 다른 전역 실행 컨텍스트의 스크립트를 실행하는 것이 가능할 만큼 충분히 유연한 언어다. 또한 이름 전역 실행 컨텍스트들은 서로 참조하고 참조될 수 있다. 서로 다른 전역 컨텍스트라고 해서 완전히 분리되어야 할 필요는 없는 것이다.
위에서 말한 내용에서 한 가지 더 짚고 넘어갈 것이 있다. 다른 실행 컨텍스트에서 정의된 값들을 읽고 쓰거나 함수를 실행하려면, 보안이라는 문제를 고려할 수 밖에 없는 복잡한 상황에 처하게 된다. 클라이언트 측 자바스크립트를 예로 들어보자. 브라우저 창 A는 로컬 인트라넷의 스크립트를 실행하고 있다. (또는 로컬 인트라넷의 정보를 담고 있다.) 브라우저 창 B는 임의의 외부 인터넷 사이트의 스크립트를 실행하고 있다. 대개의
경우 B 창의 코드가 A 창의 프로퍼티에 접근하지 못하게 하고 싶을 것이다. 혹시나 접근을 허가할 경우 A
창에 담긴 회사 내부의 민감한 정보를 B 창에서 읽거나 빼내어 갈지도 모른다. 따라서 안전하게 자바스크립트 코드를 실행하려면, 서로 다른 실행 컨텍스트 사이에는 허가되지 않은 접근을 제한할 수 있는 보안 메커니즘이 있어야만 한다. 13.8절에서 이 주제로 다시 돌아올 것이다.
1) 이 부분은 그저 여담일 뿐이다. 관심이 없다면 다음 절로 넘어가도 무방하다. [본문으로]
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 5.1 표현식 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 4.7 변수의 유효 범위 (재해석) (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 4.5 가비지 컬렉션 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 4.4 기본 타입과 참조 타입 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 4.3 변수의 유효 범위 (0) | 2010.07.04 |