스코프란 식별자의 유효 범위를 말한다.
새롭게 정의된 스코프는 상위의 스코프에 접근할 수 있다.
스코프 체인은 scope의 가장 내부에서 scope chain을 따라 바깥쪽으로 검색을 하게 된다.
var a = 10;
function func1() {
var b = 20;
function func2() {
var c = 30;
console.log(a + b + c);
}
func2();
}
func1();
다음 코드가 실행되면 어떤 결과가 나올까?
60
이 출력될 것이다. 이렇게 출력되는 이유가 바로 스코프체인과 관련되어있다.
60
이 출력되었다는 말은 a,b,c 모든 변수에 접근했다는 의미이기 때문이다.
지금처럼 안쪽에서부터 외부를 탐색 하는것, 이것 자체를 스코프 체인이라고 한다.
(코드 블럭 = 성)
높은 성에 위쪽에 있더라도 다른 성이라면 참조가 불가능하다.
코드 블럭의 실행은 독립적이며 실행이 끝나면 더 이상 참조할 수 없기 때문에 더욱이 다른 위치에서 참조할 수 없다.
그렇다면? 전역 스코프에도 참조값이 없다면 null을 반환하게 된다.
let x = 1;
function foo() {
let x = 10;
bar();
}
function bar() {
console.log(x); // 1
}
foo(); // ? foo 함수를 통해 bar 함수 실행 -> 1 출력
bar(); // ? bar함수만 실행 -> 1 출력
예제의 함수 bar
는 전역에 선언되었다. 따라서 함수 bar
의 상위 스코프는 전역 스코프이고 위 예제는 전역 변수 x
의 값 1
을 두번 출력한다.
렉시컬 스코프 (Lexical scope) 개념
렉시컬 스코프는 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정
스코프 정리