
- 스포프는 식별자가 유효한 범위를 말한다.
- 모든 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다.
- var, let, const 키워드로 선언한 변수들의 스코프는 각각 다르게 동작한다.
- 식별자는 변수, 함수, 객체 등 어떤 값을 구별해주는 역할을 하므로유일해야 한다. 따라서 스코프란 식별자를 결정할 때의 규칙이라고도 할 수 있다.
전역이란 코드의 가장 바깥 영역이다. 전역은 전역 스코프를 만든다. 전역에 변수를 선언하면 그 변수는 전역 스코프를 갖는 변수가 되고, 전역 변수는 어디서든지 참조할 수 있다.
지역이란 함수 몸체 내부 영역이다. 지역은 지역 스코프를 만든다. 지역에 변수를 선언하면 그 변수는 지역 스코프를 갖는 지역 변수가 된다. 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서만 참조할 수 있다
즉, 가장 하위에 있는 스코프는 모든 상위 스코프의 변수와 함수를 참조할 수 있지만 상위 스코프에서 하위 스코프의 변수, 함수를 참조할 수 없다.

함수는 중첩될 수 있어 함수의 지역 스코프도 중첩될 수 있다.
함수가 중첩되면 스코프도 계층적인 구조를 갖는다.
이러한 구조를 스코프 체인이라고 한다.
변수를 참조할 때 자바스크립트 엔진은 소코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작해 상위 스코프의 방향으로 이동하며 선언된 변수를 검색한다.
함수 레벨 스코프(Function-level scope)
함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다.
즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
var 키워드로 선언된 변수는 오직 함수의 몸체만 지역 스코프로 인정한다.
<예시 1>
var x = 1;
if(true){
var x = 10;
}
console.log(x);
// 10 => 함수내부가 아니기에 전역 변수로 인식하여10찍힌다.
<예시 2>
var s = 5;
function test(){
var s = 50;
}
console.log(s);
// 5
블록 레벨 스코프(Block-level scope)
모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.
즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
let x = 1;
if(true){
let x = 10;
}
console.log(x); // 1
- 렉시컬 스코프, 또는 정적 스코프라고 한다.
- 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정한다는 의미이다.
- 자바스크립트는 렉시컬 스코프를 따른다.
- 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
- 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다.
- 함수의 상위 스코프는 언제나 자신이 정의된 스코프이다.