
이번 시간에는 프로그래밍에서 변수의 유효 범위를 결정하는 중요한 개념인 스코프 체인(Scope Chain)과 렉시컬 스코프(Lexical Scope)에대한 소개가 있겠습니다.
스코프란 식별자의 유효 범위를 말한다.
Scope를 직역하면 범위, 영역 이라는 뜻입니다. 즉, 자바스크립트에서의 스코프는 식별자(변수, 매개변수, 함수)가 유효한 범위 를 말합니다.
var x = 'global';
function foo() {
var x = 'local';
console.log(x)
}
foo();
console.log(x);
// local
// global
그러므로 스코프란 식별자를 검색할 때 검색 가능한 범위 라고 할 수 있다.
스코프는 크게 두 가지 유형으로 나뉩니다:

높은 망루에선 낮은 위치의 성채 내부와 바깥에 뭐가 있는지 관찰(참조)할 수 있다. 그러나 성벽에 시야가 가리기 때문에 바깥에서 내부를 관측할 수 없다. 함수의 코드 블럭은 성벽과 같다. 코드 블럭 안쪽에 있을 수록 바깥을 관측할 순 있지만 코드 블럭 바깥에서 내부의 변수를 참조할 순 없다.
블록 스코프에서 지역 변수 y는 전역 변수 x값을 참조할 수 있고, 반환되는 함수의 지역 변수z는 y의 값을 참조할 수 있다.
var globalVar = "global";
function outer() {
var outerVar = "outer";
function inner() {
var innerVar = "inner";
console.log(innerVar); // "inner"
console.log(outerVar); // "outer"
console.log(globalVar); // "global"
}
inner();
}
outer();
위 예제에서 inner() 함수는 자신의 로컬 변수 innerVar, 바깥 함수 outer()의 변수 outerVar, 그리고 전역 변수 globalVar 모두에 접근할 수 있습니다.
즉, 어떤 함수 또는 블록 내에서 변수를 참조할 때, 현재 스코프에서 찾고, 없으면 바로 바깥 스코프로 이동하여 찾는 과정을 반복하는 것.
자신이 속해있는 지역의 변수들을 참조할 수 있게 되며, 해당 코드 레벨에 참조값이 없다면 상위 레벨의 스코프로 참조 값을 찾아 나가는 현상을 스코프 체인(Scope Chain)이라고 한다.
렉시컬 스코프는 변수가 코드를 작성하는 시점에서 그 범위가 결정되는 것을 말한다. 즉, 함수의 실행 컨텍스트가 아니라 함수가 작성된 위치에 따라 해당 함수의 스코프가 정해진다. 이를 통해 코드를 작성할 때 변수 접근성이 어떻게 될지 예측할 수 있다.
자바스크립트는 렉시컬 스코프 원칙을 따른다. 렉시컬 스코프는 또 다른 말로 정적 스코프(Static Scope)라고 한다.
즉, 렉시컬 스코프란 함수를 호출한 곳이 아닌 선언한 곳을 기준으로 스코프를 결정하는 원칙이다.
let greet = 'Hello';
function sayHi() {
let greet = 'Hi';
print();
}
function print() {
console.log(greet);
}
sayHi();
print();
참고자료
https://velog.io/@oneook/%EC%8A%A4%EC%BD%94%ED%94%84%EC%99%80-%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B2%B4%EC%9D%B8-JavaScript-Basics
https://thisiscoke.tistory.com/entry/JavaScript-%EC%8A%A4%EC%BD%94%ED%94%84-%EB%A0%89%EC%8B%9C%EC%BB%AC%ED%99%98%EA%B2%BD