스코프란? 💡
- 모든 식별자(변수 이름, 함수 이름, 클래스의 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효범위를 결정한다. 이를 스코프라 한다.
- 스코프는
식별자가 유효한 범위
를 의미한다.
function add(x,y){
// 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
// 즉, 매개변수의 스코프(유효범위)는 함수 몸체 내부이다.
console.log(x,y) // 2, 5
return x+y
}
add(2,5)
// 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
console.log(x,y) // ReferenceError: x is not defined
식별자 결정이란? 💡
- `자바스크립트 엔진이 스코프 체인을 통해 참조할 변수를 검색(결정)하는 것
const x = 'global';
function foo(){
const x = 'local'
console.log(x) // local
}
foo()
console.log(x) // global
스코프는 네임스페이스
이다.식별자의 특성 💡
- 식별자는 어떤 값을 구별할 수 있어야 하므로, 유일 해야한다.
구분 | 설명 | 스코프 | 변수 |
---|---|---|---|
전역 | 코드의 가장 바깥 영역 | 전역 스코프 | 전역 변수 |
지역 | 함수 몸체 내부 | 지역 스코프 | 지역 변수 |
전역이란?💡
- 전역은 전역 스코프를 만든다.
- 전역에서 변수를 선언하면 전역 스코프를 갖는 전역 변수가 된다.
- 전역 변수는 어디서든 참조할 수 있다.
지역이란?💡
- 함수 몸체 내부를 말한다.
- 지역에 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
- 지역 변수는 자신이 선언된 지역과 하위 지역(중첩 함수)에서만 참조할 수 있다.
- 즉, 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효하다.
*중첩함수
스코프 체인이란?💡
- 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다.
- 모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프다.
- 스코프가 계층적으로 연결된 것을 스코프 체인이라 한다.
ex) 전역 스코프 ← outer 함수 지역 스코프 ← inner 함수 지역 스코프
*변수를 참조할 때, 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색(identifier resolution)한다.
이를 통해 상위 스코프에서 선언한 변수를 하위 스코프에서도 참조할 수 있다.
하지만, 하위 스코프에서 선언한 변수는 상위 스코프에서 참조할 수 없다.
렉시컬 환경이란?💡
- 스코프 체인은 물리적인 실체로 존재한다.
- 자바스크립트 엔진은 코드를 실행하기에 앞서 렉시컬 환경을 실제로 생성한다.
- 스코프 체인은 실핼 컨텍스트의 렉시컬 환경을 단방향으로 연결한 것이다.
- 전역 렉시컬 환경은 코드가 로드되면 곧바로 생성되고 함수의 렉시컬 환경은 함수가 호출되면 곧바로 생성된다.