
렉시컬 스코프란 코드가 작성된 시점에서의 변수의 유효 범위를 의미한다. 즉, 함수가 어디서 정의되었는지에 따라 그 함수가 접근 할 수 있는 변수의 범위가 결정된다.
다른 말로 정적 스코프라고도 한다.
다음 예시 코드를 살펴보자.function outer() { let outerVar = 'messi'; function inner() { console.log(outerVar); } inner(); } outer(); // 'messi' 출력위 코드에서 inner 함수는 outer 함수 내에서 정의되었기 때문에 outerVar 변수에 접근할 수 있다. 이것이 렉시컬 스코프의 기본 개념이다.
이번엔 다른 예시 코드를 확인해보자
const x = 1; // 전역 변수 x를 1로 선언 function foo() { const x = 10; // foo 함수 내에서 지역 변수 x를 10으로 선언 bar(); // bar 함수를 호출 } function bar() { console.log(x); // 전역 변수 x를 참조하여 출력 } foo(); // 1 bar(); // 1둘 다 1을 출력하게 된다. 이유는 js는 함수의 호출 위치에 영향을 받는 동적 스코프가 아니라 선언이 어디서 되었는지에 따라 결정되는 정적스코프(렉시컬 스코프)이기 때문이다.
let cnt = 0;
function cntPlus(){
cnt = cnt + 1;
}
console.log(cnt); // 0
cntPlus();
console.log(cnt); // 1
cnt = 100;
cntPlus();
console.log(cnt); // 101
const createCounter = () => {
let cnt = 0; // 카운터 변수는 외부에서 접근 불가
const increment = () => {
cnt += 1;
console.log(cnt);
};
const reset = () => {
cnt = 0;
console.log('카운터가 초기화되었습니다.');
};
const getCount = () => cnt;
return { increment, reset, getCount };
};
const counter = createCounter();
console.log(counter.getCount()); // 0
counter.increment(); // 1
counter.increment(); // 2
console.log(counter.getCount()); // 2
counter.reset(); // '카운터가 초기화되었습니다.'
console.log(counter.getCount()); // 0
출처:
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures
https://www.youtube.com/watch?v=LL0DGc5pg7A