The Execution Context : 실행문맥 제대로 이해하기

원문 출처 : http://www.jibbering.com/faq/faq_notes/closures.html

평소에 일반적인 C,C++,Java,C# 이딴 언어를 주로 사용하다 자바스크립트와 같은 스크립트 언어를 조금만 하다보면, 금방 궁금증이 늘어난다.

과연.. 요놈들은 왜? 이렇게 작동하는걸까? 라는 좀 원초적인 질문이다.

어제 오늘 클로저라는 놈을 제대로 이해하기위해, 각종 아티클들을 찾아보다가..
괜찮은 아티클을 발견하고, 지금 번역은 아니고.. 그냥 해석해서 이해하는 중이다.
사실 클로저라는 놈을 이해하기위해선, 자바스크립트 내부적으로 작동하는 매커니즘을 이해할 필요가 있다..

이름하야, Indentifier Resolution, Execution Contexts, Scope Chains, Property Chain 같은 용어와 내부 매커니즘을 이해해야 한다는 얘기다.

오늘은 그중에서 실행문맥(Execution Contexts)에 대해서 정리해보자.

위에 원문을 A4로 출력하면, 대략 4페이지에 나오는 내용이다.

실행문맥은 ECMAScript 스펙에서 정의 된대로 추상적인 개념이고, 요 스팩을 구현하기 위해서 요구되는 지침정도라고 생각해보면 되겠다. 하지만 스펙에는 어떻게 구현하라는 이야기는 없으므로, 대충 개념만이라도 이해하자.

모든 자바스크립트 코드의 실행은 실행문맥안에서 이루어 진다. 전역 코드가 실행될때는 전역실행문맥이라고 불리는 곳에서 실행된다. 그리고 그 전역실행 문맥 안에 존재하는 각각의 function 들은 그 펑션마다 고유의 실행 문맥이 만들어지고 그 안에서 실행이 된다. eval 펑션은 예외다.

자바스크립트 펑션이 호출되면, 실행문맥안으로 들어가고 그안에서 새로운 펑션이 호출되면, 새로운 실행문맥을 만들고, 그 실행문맥 안으로 들어간다. 그리고 값이 리턴되면, 본래 호출되었던 펑션으로 복귀를 하게 되고, 이값도 리턴이 되면, 실행문맥은 사라진다.
결국 실행문맥이라는 것은 우리가 흔히 메모리 구조를 그릴때 그리는 스택구조와 비슷하다고 보면 되겠다.

일반 실행 문맥
실행문맥이 생성될때, 많은 일들이 순차적으로 일어난다.

1. Activation 객체 생성
먼저, 펑션의 실행문맥안에서 특별한 매커니즘을 갖는 Activation  이라는 객체를 만든다. 이 Activation 객체는 결과적으로 이름이 있는 프로퍼티에 접근할수 있으므로, 일반적인 객체라고 봐도 무방하다. 하지만, 일반 객체들이 모두 가지고 있는 프로토타입(prototype)을 가지고 있지 않고, 자바스크립트 코드에 의해서 직접적으로 참조되지 않는다.

2. arguments 객체 생성
다음으로 배열과 비슷하게 index를 가지는 Arguments 객체를 생성한다. 이 객체는 length(호출자가 넘겨주는 인자의 갯수)와 callee(실행중인 함수 객체-재귀를 위해 필요하다) 프로퍼티도 갖는다.
그리고 앞서 만든 Activation 객체에 “arguments”라는 이름의 프로퍼티가 만들어지고, 이 arguments객체를 참조할수 있도록 할당(assign)된다.

3. scope 할당
다음으로, 실행문맥은 Scope를 할당(assign)한다. 스코프는 객체들의 리스트로 구성된다. 흔히들 스코프 체인이라고 이야기한다. 한편 각 펑션 객체는 내부적인 [[scope]] 프로퍼티를 갖고 있는데, 그 [[scope]] 프로퍼티 역시 객체들의 리스트로 구성된다.
실행문맥에 할당된 스코프는 맨 앞에 Actiovation객체를 넣고, 호출된 본 함수 객체의  [[scope]] 프로퍼티가 참조하는 리스트들을 함께 구성한다.

4. 변수 인스턴스화 과정수행
다음으로, ECMA 262에서 “Variable” 객체로 언급한  객체들을 사용해서 변수의 인스턴스화(“variable instantiation”) 과정이 일어난다. Activation 객체 또한  Variable 객체로써 사용된다. (결국 Activation 객체와 Variable 객체는 사실상 같은 객체다. 아주 중요하니 체크하기 바람!!)

함수 표현식에서 선언된 공식적인 파라메타들을 식별자로 Activation 객체의 프로퍼티로 생성하고, 호출자로 부터 넘어온 인자값은 그 프로퍼티들의 값으로 한다. 인자가 넘어오지 않은 프로퍼티는 그 값으로는 undefined 할당이 된다.

함수 선언에서 사용된 함수 이름은 그 이름으로 함수 객체를 만들고 Variable 객체(이름은 다르게 표현하지만 결국 Activation 객체를 말한다)의 프로퍼티로 생성한다.변수 인스턴스화의 마지막 과정은 함수 안에서 지역변수로 선언된 모든 변수들을 Variable 객체의 프로퍼티로 생성하면서 마무리 짓는다.

변수 인스턴스화 과정에서 지역 변수로 생성된 프로퍼티들은 모두 undefined 값으로 초기화된다. 실질적인 값 초기화 과정은 함수 내부 코드가 실행될때 비로서 값이 정해진다는것을 잊지말자!

 arguments 프로퍼티를 가지는 Activation 객체와 지역 변수로 쓰이는 정해진 이름의 프로퍼티들을 가지는 Valiable 객체는 결국 서로 같은 객체다. 그리고 식별자 arguments 가 마치 지역변수로써 쓰일수 있도록 허가되어진다.

5. this 키워드 값 할당
마지막으로 this 키워드 값이 할당된다. 만일 this가 어떤 객체를 참조하도록 할당이 되면, 프로퍼티 접근 연산자를 통해서 그 this 키워드가 가르키는 객체의 프로퍼티들을 참조 한다.
즉, this.(프로퍼티 이름) 이딴 식으로 참조할수 있게 되고, this 에 null 값이 할당되면, 이 this 키워드는 전역 객체(window)를 참조하게 될것이다.

전역 실행 문맥

전역 실행 문맥은 arguments 가 없기 때문에 정의된 Activation 객체를 가질필요가 없다는 것이 약간 다르다. 하지만 스코프는 필요로 한다. 전역 실행 문맥의 스코프 체인은 오직 전역 객체 하나만을 가르킨다.

역주) 코드에서 선언된 전역변수는 모두 이 전역객체의 프로퍼티로 들어가기 때문에 사실상 전역객체 하나만 가지고 있는 꼴이 된다.

일반적인 최상위 레벨의 함수 선언들은 전역 실행 문맥의 내부 함수 들로써, 변수 인스턴화 과정을 거친다. 즉, 이 변수 인스턴화 과정을 거치게 되므로, 결론적으로 이 함수들은 전역 객체의 프로퍼티로써 존재하게 된다.  그리고 마지막으로 전역객체는 this 객체를 통해서 참조 될수 있다.

휴..-_- 그냥 원문 읽는거랑 번역해서 쓰는거랑 차이가 심하군..2시간이나 걸렸넹..ㅜㅜ..

맥용, Apache + MySQL + PHP 개발 환경 구축하기!

오늘 검색하다 하나 낚았다!!

요새는 요런 재미로 사는듯… ㅋㅋㅋ
바로 MAMP 라는것인다. 이름 그대로 매킨토시 + 아파치 + 마이에스큐엘 + 피에치피 의 줄임말 정도라고 생각하면된다. Windows용의 APMSetup 과 비슷한 통합 솔루션이다.
자세한 내용은 아래 블로그에서 확인!! 
설치중이다. 일단, 해보고 후기 남겨야겠당..

URL Rewrite 를 이용한 테터툴즈에서 텍스트규브로 업그레이드…

어제 드디어 지긋지긋하게 속썩였던, URL Rewrite 부분을 수정함으로써, 블로그 이전을 완료했다.
이젠 서버가 죽을 일은 없다…. 킥킥킥 학교서버에서 호스팅으로 넘겼기때문이지..ㅋㅋ
용량제약의 압박과 내 맘대로 멀 어쩌지 못함이 좀 아쉽지만,
역시 블로그는 안정적인 서비스가 우선임을 췍오임을 일깨워 줬다.

각설하고,
다들 블로그를 이전했을때, 특히 나처럼 테터에서 텍스트 큐브로 이전했을때,
블로그 주소가 바껴서 고민하는 사람이 있을것이다.
테터의 기본폴더는 tt 지만, 현 텍스트 큐브는 tc 로 시작한다.
텍스트큐브 설치할때 아예 이전에 깔았던 테터기본폴더인 tt로 설정하고 설치하면 되겠지만..

(될까? 안해봤다..) 귀찮아서 그냥 깔았더니.. 이런 주소문제가 OTL…
덕분에 요 며칠 평균 200을 찍던 카운터 수도, 이젠 우리의 친구 크롤러(웹로봇)을 제외한
실 방문자 카운터가 10을 넘지못한다..(추측컨데.. 10명도 안될꺼같다..ㅎㅎㅎ)

그리고 기존에 검색되던 내 블로그 포스트들이 클릭하면 주소때문에 깨진 링크로 뜨고,..
아~ 이런문제.. 대략 좋치않다. 항상 우리나라 블로그는 링크가 깨져~ 하면서 불만을 토로했던 나 아니었떤가?.. 그래 해결하자!!

그래서 어떻게 할찌를 고민해봤다.. 결론은 URL rewrite!!

또한번 각설…
설정법은 간단하다..
기존에 내 블로그 주소는 http://miconblog.com/blog/sohn 으로 시작한다..
현재는 http://miconblog.com/tc/sohn 으로 바꼈기때문에…
blog를 tc로 변환만 해주면 되는것이다..

그래서, 호스팅 서버에 기존에 있던 이름의 blog 라는 폴더를 생성한다.
/www/blog 요렇게 말이지…
그리고 그 안에 .htaccess 파일을 하나 복사해 준다. (.htaccess 파일은 새로 설치한 텍스트규브 폴더에 숨김파일로 들어가 있을것이다.)

그리고 .htaccess 파일을 열어서 아래와 같이 수정한다.

RewriteEngine On
RewriteBase /blog/   <— 이부분만 /tc/로 되어있던걸 수정했다.
RewriteCond &{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteCond &{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ rewrite.php [L,QSA]

이젠 실제로 어떻게 URL을 다시쓸지를 정의하기 위해 rewrite.php 파일을 하나 생성한다.
그리고 그 안에 다음과 같이 간단하게 작성하면 끝!!

<?
    $path = str_replace(“blog”,”tc”, $_SERVER[“REQUEST_URI”]);
?>
<html>
<head>
   <meta http-equiv=”refresh” content=”0;url<?=$path?>”>
</head>
<body></body>
</html>

위에 메타 태그부분이 자동으로 리다이렉션 해주는 부분이다. 숫자 0을 조절해서,.
대기 시간을 조절할수도 있다.. 난 이부분을 2초로 두고 간단히 주소 옮긴다는 메시지를 띄워줬지..ㅋㅋㅋ  왜냐면, 난 친절하니까..ㅋㅋㅋ

여튼 주의할점은 리다이렉션 방식이 사실 2가지가 있다..
위에 처럼 메타태그를 이용하는 방법과 자바스크립트 location 을  이용하는 방법..
그러나 아무래도 자바스크립트보다는 안전한 메타태그가 낫지..
스크립트를 나처럼 꺼놓은 사람도 분명 있을테니…

.htaccess 에 관련된 자세한 내용은…차후에 정리해서 다시 포스팅해야겠다.