(아직 클로져를 하나도 모르지만..오히려 좋은건가?)
렉시컬 스코프를 직역하면 어휘 범위?라고 되는데
감이 잘 오지 않는다.
정적 스코프라고도 한다. 왜 정적 스코프지..?
함수가 선언된 위치에 따라 상위 스코프가 결정되는 것을 말한다.
쉽게 말해, 함수가 어디서 쓰여졌는지에 따라 어떤 변수에 접근할 수 있는지가 결정된다는 의미.
간단히 퀴즈를 통해 알아보자
const x = 1;
function foo() {
const x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 출력값은 ?
bar(); // 출력값은 ?
함수 foo와 함수 bar를 출력값은 어떻게 될 것인가?
위 퀴즈의 핵심 질문은 함수를 호출 위치 또는 선언 위치 중 어느것이 스코프를 결정하냐는 것이다.
✔ 함수를 어디서 호출했는가? -> 동적 스코프
✔ 함수를 어디서 정의했는가? -> 정적 스코프(렉시컬 스코프)
자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 정의했는가에 스코프를 결정한다.
두 출력값 모두 1로 출력된다.
아래 추가 예시를 봐보자.
function outer() {
let outerVar = '외부 변수';
function inner() {
let innerVar = '내부 변수';
console.log(outerVar); // 외부 변수에 접근 가능
console.log(innerVar);
}
inner();
}
outer();
inner 함수는 outer 함수 내부에 선언되었으므로,
outer 함수의 변수인 outerVar에 접근할 수 있습니다.
반대로, outer 함수는 inner 함수의 변수인 innerVar에 접근할 수 없습니다.
outerVar와 innerVar는 각각 let 키워드로 선언되었으므로, 블록 스코프를 가진다
outerVar는 outer 함수의 블록 내에서만 유효.
innerVar는 inner 함수의 블록 내에서만 유효.
💡렉시컬 스코프와 블록 스코프의 차이
블록 스코프 : let 과 const 키워드로 선언된 변수는 코드블록({}) 내에서만 유효
렉시컬 스코프 : 함수의 선언 위치에 따라 스코프가 결정
렉시컬 스코프는 자바스크립트에서 변수의 유효범위를 결정하는 중요한 개념.
함수가 선언된 위치에 따라 어떤 변수에 접근할 수 있는지 정해지며,
이를 이해하면 더욱 효율적이고 안정적인 자바스크립트 코드를 작성할 수 있다.
장점에는 데이터 은닉(외부에서 접근할 수 없는 변수 생성), 상태 유지(다양한 패턴 구현 가능), 모듈 패턴(코드의 모듈화) 등 있으며
예시로는 모듈 패턴, 이벤트 핸들러, 콜백 함수, 커링 등이 있다
클로저는 추후 자세히 다뤄보도록 하자😅