모든 식별자 (변수 이름, 함수 이름, 클랙스 이름 등)
자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 생성된다.
스코프라는 개념이 없다면 같은 이름을 갖는 변수는 충동을 일으키기 때문에 프로그램 전체에서 하나밖에 사용될 수 없다.
자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다. 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지않는다. 즉, 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.
두가지 패턴을 예측할 수 있다.
1. 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정한다. ("동적 스코프")
2. 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정한다.
("렉시컬 스코프","정적 스코프")
이처럼 함수의 상위 스코프는 함수 정의가 실행될 때 정적으로 결정된다. 함수 정의가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프를 기억한다. 함수가 호출될 때마다 함수의 상위 스코프를 참조할 필요가 있기 때문이다.
// 렉시컬 스코프는 코드가 작성된 위치에 따라 변수의 유효 범위가 결정되는 것을 의미.
// JavaScript는 렉시컬 스코핑을 사용하여 함수나 블록 내부에서 정의된 변수에 접근할 수 있는 범위를 결정
function outerFunction() {
const outerVar = '외부 변수';
function innerFunction() {
const innerVar = '내부 변수';
console.log(outerVar);
console.log(innerVar);
}
innerFunction();
}
outerFunction();
// 렉시컬 스코프는 코드를 더 예측 가능하고 디버깅하기 쉽게 만든다.
// 함수 내부에서 변수를 찾을 때, 렉시컬 스코프에 따라 상위 스코프에서 변수를 찾는다.
// 여기서 중요한 점은, 렉시컬 스코프는 함수가 호출되는 시점이 아닌 정의되는 시점에 결정된다는 것
// 예를 들어, 함수가 다른 곳에서 호출되더라도, 정의된 위치에 따라 스코프가 유지된다.
// 따라서, 렉시컬 스코프는 코드를 작성할 때 변수의 유효 범위를 명확히 이해할 수 있도록 도와준다.