스코프
- 스코프는 변수와 함수가 접근할 수 있는 유효 범위를 말한다.
- 자바스크립트에는 전역 스코프, 함수 스코프, 블록 스코프가 있다.
- 전역 스코프: 코드 어디서든 접근 가능한 범위.
- 함수 스코프: 함수 내부에서만 접근 가능한 범위.
- 블록 스코프: 블록({}) 내부에서만 접근 가능한 범위, let과 const로 선언된 변수에 적용.
기본적으로 스코프 내부에서는 외부 스코프의 변수에 접근할 수 있다. 이것은 자바스크립트의 기본 스코프 규칙이다.
let globalVar = "I am global";
function outerFunction() {
let outerVar = "I am outer";
function innerFunction() {
let innerVar = "I am inner";
console.log(globalVar); // "I am global"
console.log(outerVar); // "I am outer"
console.log(innerVar); // "I am inner"
}
innerFunction();
}
outerFunction();
클로저
- 클로저는 함수가 선언된 어휘적 환경(스코프)을 기억하는 함수이다.
- 클로저는 함수가 자신의 스코프 밖에서 호출될 때도 그 스코프의 변수에 접근할 수 있게 한다.
클로저라는 이름이 붙는 이유는 함수가 스코프 외부에서 호출되더라도, 자신이 선언된 환경을 기억하고 그 환경에 접근할 수 있기 때문이다. 즉, 클로저는 함수와 그 함수가 선언된 어휘적 환경의 조합이다.
function outerFunction() {
let outerVar = "I am outer";
return function innerFunction() {
console.log(outerVar);
};
}
let closureFunction = outerFunction();
closureFunction(); // "I am outer"
위 예시에서 outerFunction은 outerVar라는 변수를 가지고 있으며, innerFunction을 반환한다. innerFunction은 outerVar에 접근할 수 있다. 중요한 점은 closureFunction이 outerFunction의 실행이 끝난 후에도 outerVar에 접근할 수 있다는 것이다. 이는 innerFunction이 outerFunction의 어휘적 환경을 기억하는 클로저이기 때문이다.
즉 반환값 같은 개념이다. 내부 스코프로 만들어진 변수를 반환하면 외부에서도 그 변수를 사용할 수 있는데 이를 클로저라고 한다.