렉시컬 스코프(lexical scope) 와 다이나믹 스코프(dynamic scope)
2020-12-22
변수의 유효범위를 구분하는 용어이다.
함수가 어디서 선언되었는지에 따라서 스코프가 결정되는 것이 렉시컬 스코프(lexical scope)이고,
함수가 어디서 호출되는지에 따라서 스코프가 결정되는 것이 다이나믹 스코프(dynamic scope)이다.
javascript
는 렉시컬 스코프를 따른다.
렉시컬 스코프의 예제
let name = 'herdin';
function printInnerName() {
let name = 'epu baal';
console.log('print inner name -> ' + name);
printOuterName();
}
function printOuterName() {
console.log('print outer name -> ' + name);
}
printInnerName();
//print inner name -> epu baal
//print outer name -> herdin
printInnerName()
함수의 내부에서 글로벌 변수와 같은 명칭의 name
을 다시 정의한뒤, printOuterName()
을 호출하고 있지만, printOuterName()
함수가 선언했을 당시에 해당하는 스코프에서 name
은 글로벌 변수이기 때문에 herdin
이 출력된다.
다이나믹 스코프의 예제
렉시컬 스코프를 따르는 javascript
로 다이나믹 스코프의 예제를 만드는 것은 부적절하지만, 그냥 느낌만 가져가자고 생각하고 만들어본다.
var name = 'herdin';
function printThisName() {
console.log('print outer name -> ' + this.name);
}
printThisName.apply(this)
//print outer name -> herdin
let obj = { name: 'obj-herdin' };
printThisName.apply(obj);
//print outer name -> obj-herdin
실행 컨텍스트를 변경해가며, 실행 컨텍스트에 따른 변수 스코프가 변화되는 것이 다이나믹 스코프와 비슷해서 예제로 만들어 보았다.
참고