전역 스코프(Global scope) : 어디에서든 참조 가능
지역 스코프(Local scope) : 블록 안, 함수 내에서만 참조 가능
let x = 1
if (x === 1) {
let x = 2
console.log(x) // 2
}
console.log(x) // 1
function foo() {
var x = 5
console.log(x) // 5
}
console.log(x) // ReferenceError : x is not defined
렉시컬 스코프(Lexical scope) : 함수의 상위 스코프를 결정하는 방식, 함수를 어디에서 선언했는지에 따라 상위 스코프를 결정하는 것
코드 내에서 변수와 함수에 접근하는 방법을 결정하는데 사용
스코프가 어떻게 연결되고 있는지 보여주는 것
// 전역 스코프 var globalVar = "I'm global"; function outerFunction() { var outerVar = "I'm outer"; function innerFunction() { var innerVar = "I'm inner"; console.log(globalVar); // 전역 변수에 접근 가능 console.log(outerVar); // 외부 함수 변수에 접근 가능 console.log(innerVar); // 자신의 스코프 내 변수에 접근 가능 } innerFunction(); } outerFunction();
- outerFunction이 호출
- outerFunction 내부에서 innerFunction이 호출
- innerFunction 내부에서 각 변수에 접근하려고 할 때, 스코프 체인을 통해 해당 변수를 찾음
- 먼저 innerVar를 찾음, innerFunction 스코프에 정의되어 있으므로 문제 없이 접근 가능
- 다음으로 outerVar를 찾음, innerFunction 스코프에는 없지만, 외부 함수인 outerFunction의 스코프에 정의되어 있기 때문에 접근 가능
- 마지막으로 globalVar를 찾음, innerFunction 스코프에는 없지만, 외부 스코프인 outerFunction에서도 찾을 수 없기 때문에 전역 스코프에서 이 변수를 찾아 접근 가능