클로저와 렉시컬 스코프는 자바스크립트의 함수와 변수의 동작 방식을 이해하는 데 매우 중요한 개념입니다.
아래에서 각각의 개념과 그 관계를 자세히 설명하겠습니다.
const globalVar = "전역";
function outer() {
const outerVar = "외부";
function inner() {
const innerVar = "내부";
console.log(globalVar); // 전역 변수, 접근 가능
console.log(outerVar); // outer 함수의 변수, 접근 가능
console.log(innerVar); // inner 함수의 변수, 당연히 접근 가능
}
inner();
}
outer();
inner
함수는 자신이 선언된 위치(outer
함수 내부)에 따라 outerVar
에 접근할 수 있습니다.function makeCounter() {
let count = 0; // makeCounter의 지역 변수
// inner 함수는 makeCounter의 렉시컬 스코프에 있는 count에 접근할 수 있다.
return function() {
count += 1;
return count;
};
}
const counter = makeCounter(); // 클로저 생성: counter 함수는 makeCounter의 렉시컬 환경(count)에 대한 참조를 가짐.
console.log(counter()); // 1
console.log(counter()); // 2
makeCounter
함수가 종료된 후에도, 반환된 함수는 count
변수에 접근할 수 있습니다. 이것이 클로저의 전형적인 예입니다.