타쿠꺼

동적스코프, 정적스코프 본문

Javascript/Study

동적스코프, 정적스코프

kimtaku 2016. 6. 1. 14:42

자바스크립트는 정적스코프 언어이다.


동적스코프는 함수를 호출하는 시점에서 스코프의 범위가 정해지고, 정적스코프는 함수를 작성하는 시점에서 스코프의 범위가 정해진다.

함수를 작성하는 시점에서 스코프의 범위가 정해진다는 뜻을 더 명확히 하자면..


1. 실행 컨텍스트가 생성되면 해당 컨텍스트의 변수객체에 있는 함수객체들이 생성된다.

2. 이 때 함수객체들의 스코프 범위는 본인이 속해있는 컨텍스트의 스코프의 범위를 참조한다. 

3. 함수가 실행되면, 함수 본인의 실행 컨텍스트를 만들고 자신이 참조하고 있던 스코프의 범위를 복사한다.

4. 그 다음, 본인의 실행 컨텍스트 범위의 변수객체를 스택구조로 기존에 복사한 스코프보다 윗쪽에 배정한다.


따라서 함수객체가 포함된 컨텍스트의 위치가 스코프를 결정짓기 때문에, 만약 아래와 같이 두 함수가 같은 컨텍스트에서 정의된 경우


1
2
3
4
5
6
7
8
9
10
11
12
var value = 'value1';
 
function printValue() {
    return value;
}
 
function printFunc(func) {
    var value = 'value2';
    console.log(func());
}
 
printFunc(printValue); //value1
cs



한 함수를 다른 함수의 내부함수처럼 호출해도 호출된 함수는 해당 실행 컨텍스트 지역의 스코프 범위를 참조하지 않아서 value2가 아닌 value1이 log로 찍히게 된다.



자바스크립트에서는 이런 스코프 체인을 임의로 수정할 수 있는 키워드인 with구문이 존재하는데 성능을 떨어트리기 때문에 자제해야 한다.

'Javascript > Study' 카테고리의 다른 글

클로저  (0) 2016.06.01
코드의 실행 과정  (0) 2016.06.01
난수 만들기  (0) 2016.05.31
프로토타입, 체이닝  (0) 2016.05.29
생성자 함수  (0) 2016.05.29
Comments