<aside> 💡 Scope란? 범위 라는 뜻을 갖고 있으며 변수에 접근할 수 있는 범위를 뜻함
</aside>
전역 스코프 → 전역에 선언되어 있어 어느 곳에서든지 해당 변수에 접근할 수 있음
지역 스코프 → 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에선 접근할 수 없음
// 함수 영역 밖의 전역 변수
var x = 'global x';
var y = 'global y';
function outer() {
// 함수 영역 내부의 지역 변수
var z = "outer's local z";
console.log(x); // global x
console.log(y); // global y
console.log(z); // outer's local z
function inner() {
var x = "inner's local x";
console.log(x); // inner's local x
console.log(y); // global y
console.log(z); // outer's local z
}
inner();
}
outer();
스코프 체인
전역 스코프 ← outer 지역 스코프 ← inner 지역 스코프
모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프
변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색함
따라서, 상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만 하위 스코프에서 유효한 변수는 상위 스코프에서는 참조할 수 없음
C, 자바 등 대부분의 프로그래밍 언어는 함수 몸체만이 아니라 **모든 코드 블록(if, for, while, try/cath 등)이 지역 스코프를 만드는 블록 레벨 스코프(block level scope)**를 가진다.
하지만 **var 키워드로 선언된 변수는 오직 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정하는 함수 레벨 스코프(function level scope)**를 가진다.