var x = 'global'; // 전역 스코프
function foo() {
var x = 'local'; // foo 함수 스코프
console.log(x); // local
}
foo();
console.log(x); // global
x
는 이름은 같아도 서로 다른 스코프의 별개 변수다.전역 스코프(Global Scope)
지역 스코프(Local Scope)
var a = 1; // 전역 스코프
function outer() {
var b = 2; // outer 지역 스코프
function inner() {
var c = 3; // inner 지역 스코프
console.log(a, b, c); // 1, 2, 3
}
inner();
}
outer();
var x = 'global';
function outer() {
var y = 'outer';
function inner() {
var x = 'inner';
console.log(x, y); // inner, outer
}
inner();
}
outer();
inner
가 x
를 찾으면
inner
) 스코프 → x = 'inner'
발견inner
가 y
를 찾으면
outer
) 스코프 → y = 'outer'
발견전역 스코프까지 올라가면 전역 변수도 참조 가능
자바스크립트 엔진은 실행 전 이 구조를 렉시컬 환경으로 실제 생성한다.
변수 선언 시 키가 등록되고, 할당 시 값이 저장된다.
스코프 체인은 실행 컨텍스트의 렉시컬 환경끼리 단방향 링크로 연결된 형태다.
var
키워드는 함수 몸체만 지역 스코프라고 인정한다.let
, const
는 모든 {}
블록을 새로운 스코프로 인식한다.if (true) {
var v = 'func-scope';
let l = 'block-scope';
}
console.log(v); // 'func-scope'
console.log(l); // ReferenceError
var x = 1;
function foo() {
console.log(x);
}
function bar() {
var x = 2;
foo();
}
bar(); // 1
foo
는 전역에서 정의됐으므로 상위 스코프는 전역bar
에서 호출해도 foo
는 여전히 전역 x
를 참조한다.var
는 함수, let
·const
는 블록