타쿠꺼
동적스코프, 정적스코프 본문
자바스크립트는 정적스코프 언어이다.
동적스코프는 함수를 호출하는 시점에서 스코프의 범위가 정해지고, 정적스코프는 함수를 작성하는 시점에서 스코프의 범위가 정해진다.
함수를 작성하는 시점에서 스코프의 범위가 정해진다는 뜻을 더 명확히 하자면..
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 |